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 명렁어를 입력하시면 아래와 같은 결과를 얻을 수 있습니다
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가 제대로 생성된 것을 확인할 수 있습니다
3. 생성한 container 접속 후 ROS setup
2번 실행결과에서 나온 CONATINER ID를 통하여 접속한 후 setup.bash 파일을 실행시켜 줍니다
$ docker exec -it 9098c76e4894 bash
# container 접속 완료
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ ros2
만약 container를 여러번 재시작해야 한다면 번거롭지 않게. bashrc 파일에 등록을 해둡니다.
4. turtlesim 으로 테스트
제대로 설치가 되었는지 확인하기 위해 turtlesim package에 있는 turtle_teleop_key node를 실행시키고 확인해 보겠습니다.
실행이 잘 되는 것을 확인했으니 2번 과정을 다시 수행하여 terminal을 하나 더 연 후 다음 명령어를 통해 topic 값을 확인해 봅시다
$ ros2 topic echo /turtle1/cmd_vel
키보드 입력에 따른 선속도 값과 각속도 값이 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
실행후 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' 카테고리의 다른 글
Docker Compose로 Nginx + NodeJS + SSL 환경 만들기 (0) | 2022.08.02 |
---|