본문 바로가기

Docker

Docker로 ROS2 Foxy 설치하기 + GUI 설정 (NOVNC)

Docker로 설치하는 이유

제가 Docker로 ROS2 Foxy를 설치하려는 이유는 크게 2가지 있습니다

  • 배포에 대한 확장성이 좋다
  • 독립된 작업공간 보장

docker를 사용한다면 개인 PC에서 작업한 것을 로봇 PC에 deploy 할 때 편할 거 같다 라는 생각이 들었습니다. 또한 독립된 작업공간이 보장되어 다른 Application에서 설치한 package 버전이나 설치경로로 인한 충돌이 발생하지 않기 때문에 Docker로 설치하려 합니다

 

설치방법

이 문서는 docker 설치가 된 이후에 대한 내용만 포함되어 있습니다. 만약 docker가 설치되어 있지 않다면 docker를 먼저 설치 후 아래 항목을 실행해주세요

1. Docker hub 에서 foxy-desktop 버전 image pull 받기

$ docker pull osrf/ros:foxy-desktop
$ docker images

위 명령어가 성공적으로 실행이 된 경우 docker images 명렁어를 입력하시면 아래와 같은 결과를 얻을 수 있습니다

rsrf/ros 이미지가 추가됨

2. 추가한 이미지로 container 생성하기

$ docker run -it --net host --name rosTest osrf/ros:foxy-desktop
$ docker ps

docker는 이미지로 container를 만들 수 있습니다.  쉽게 표현하면 위에서 설치한 osrf/ros:foxy-desktop image를 실행하여 container를 생성하면 ros foxy 구동에 필요한 package들이 설치되어 있는 작업환경을 만들 수 있습니다. 성공 시 docker ps 명령어를 통하여 container가 제대로 생성된 것을 확인할 수 있습니다

<실행중인 container 리스트>

3. 생성한 container 접속 후 ROS setup

2번 실행결과에서 나온 CONATINER ID를 통하여 접속한 후 setup.bash 파일을 실행시켜 줍니다

$ docker exec -it 9098c76e4894 bash
# container 접속 완료
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ ros2

<ros2 명령어 입력시 화면>

만약 container를 여러번 재시작해야 한다면 번거롭지 않게. bashrc 파일에 등록을 해둡니다.

4. turtlesim 으로 테스트

제대로 설치가 되었는지 확인하기 위해 turtlesim package에 있는 turtle_teleop_key node를 실행시키고 확인해 보겠습니다.

<turtle_teleop_key node 실행>

실행이 잘 되는 것을 확인했으니 2번 과정을 다시 수행하여 terminal을 하나 더 연 후 다음 명령어를 통해 topic 값을 확인해 봅시다

$ ros2 topic echo /turtle1/cmd_vel

<cmd_vel topic 값 확인>

키보드 입력에 따른 선속도 값과 각속도 값이 topic을 통해 넘어오는 것을 확인할 수 있습니다. 간단한 docker를 통해 ros 설정이 끝났습니다.

개선할 점들

지금까지 설정을 했지만 끝이 아닙니다. 지금 설정에 2가지 개선할점이 있습니다

  • container 재생성시 작업물 삭제
  • GUI 사용 불가

첫번째 개선할 점은 docker volume을 생성한 후 container 생성 시에 mount 해주면 됩니다. 그러나 2번째 문제 X11를 사용하여 해결할 수 있는데요. 이 글에서는 macOS 에서 GUI 사용법을 알아봅시다

macOS 에서 GUI 사용하기

먼저 macos에 다음 항목들을 brew를 통해 설치합니다

$ brew install socat
$ brew cask install xquartz

설치 후 다음 명령어를 실행하여 xquartz를 실행시켜 줍니다

$ open -a xquartz

<xquartz 실행>

실행후 command + , 를 입력해 환경설정 > 보안 > 네트워크 클라이언트에서의 연결을 허용을 활성화해줍니다. 그다음 macos terminal에 다음 명령어를 입력해야 합니다

$ bash
$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
만약에 주소가 사용중이라는 문구가 뜬다면 6000 포트 사용하는 프로세스를 찾아 Kill 해줍니다.

다음으로 container에 접속해서 다음 명령어를 통해 DISPLAY 환경변수를 설정해 줍니다

$ export DISPLAY=[내 컴퓨터 IP]:0
위 환경변수는 container 생성 시 env args를 통하여 설정 가능합니다. 

이러면 GUI 사용을 위한 설정은 모두 끝났습니다! turtlesim_teleop_key와 turtlesim_node node를 실행시켜 거북이가 움직이는 것을 확인해 봅시다

macOS 에서 GUI 설정중 내가 발생한 오류들

[socat] parseopts_table(): unknown option "XXXX"

socat 에서 발생한 XXXX 항목들

  • TERM_PROGRAM: 저는 terminal을 iTerm2를 튜닝하여 사용 중이어서 기본 값이 아녔습니다. 기본 값인 "Apple_Terminal"로 교체하였습니다

위 설정의 한계점

turtiesim_node나 rqt_graph를 사용하는 데에는 큰 문제가 없습니다. 그러나 rviz2, gazebo는 GPU 가속을 사용하기 때문에 그에 맞는 driver를 설치해야 됩니다. 그렇기 때문에 NOVNC를 사용하는 것을 추천합니다.

07-11 추가) NOVNC 사용

NOVNC를 사용하면 XDisplay 설정 없이도 웹 브라우저를 통하여 gazebo, rviz2 결과를 확인할 수 있습니다. 그러나 GPU는 사용하지 않아 fps가 떨어지긴 하나 간단하게 확인할 경우에는 충분히 사용 가능할꺼 같습니다. (2018 Macbook Pro 기준 15~20fps 정도 나옵니다)

https://hub.docker.com/r/tiryoh/ros2-desktop-vnc

 

Docker Hub

 

hub.docker.com

 

'Docker' 카테고리의 다른 글

Docker Compose로 Nginx + NodeJS + SSL 환경 만들기  (0) 2022.08.02