(ROS 삽질기 - 0) Docker 환경에서 ROS 돌리기

왜 Docker에서 ROS를 돌리는가?

  • (적어도 내가 알기로는) ROS는 시스템에 설치되어야하는 소프트웨어이다.
  • SLAM을 공부하면서 여러 오픈소스 SLAM들을 돌려보게 되는데, 이 SLAM 알고리즘들이 공개된 시기에 따라 ROS 디펜던시의 버전이 다르다
    • Ubuntu 14.04 + ROS Indigo
    • Ubuntu 16.04 + ROS Kinetic
    • Ubuntu 18.04 + ROS Melodic
    • Ubuntu 20.04 + ROS Noetic
  • 당연히 ROS 버전들끼리 충돌이 난다.
    • 추가로, OpenCV와 Eigen과 같은 라이브러리들의 버전들도 충돌날것이다.
    • 이럴 때는 각각의 알고리즘마다 독립된 가상환경을 만들어두면 좋다

 


Docker + ROS를 쓸 때 고려해야하는 점

  • Docker를 통해 개발을 할 때는 원격 코드 접근이 필요하다
    • 이는 SSH나 VSCode의 Docker extension을 사용해서 디버깅을 할 수 있다.
  • ROS를 사용할 때 GUI로 결과를 보는 경우가 많다
    • VNC, X11, WayLand 등으로 시각화된 결과물을 보여줄 수 있다.
  • rosrun 기반으로 돌릴 때는 여러 터미널을 열 수 있어야한다.
    • tmux, terminator 등으로 하나의 컨테이너에 여러 bash 터미널을 접근해야한다.
      • (아니면 그냥 터미널 많이 열어도 되구…)

 


tmux

tmux를 좀 더 쉽게 쓰고 싶으면 필자가 이전에 적은 tmux 글을 참조하면 좋다.

tmux 설치

tmux는 여러개의 터미널을 하나의 윈도우에 띄울 수 있는 유용한 툴이다.

아래의 커맨드를 사용해서 tmux를 설치한다

1
sudo apt-get -y install tmux

tmux 사용해서 터미널 쪼개기

설치가 끝나면 터미널에서 tmux 커맨드를 입력하여 tmux를 실행한다.
이후 ctrl + b를 누르고 "를 누르면 하나의 터미널이 위/아래로 쪼개지고, ctrl + b를 누른 후 %를 누르면 하나의 터미널이 좌/우로 쪼개진다.

터미널을 옮겨다니려면 ctrl + b를 누르고 화살표 키를 눌러서 움직일 수 있다.

위/아래와 좌/우를 한번씩 쪼개면 아래의 사진처럼 큰 윈도우가 4개로 쪼개진다.

 


X11 포워딩 환경 준비하기

필자의 PC 환경은 Nvidia GPU를 사용하는 PC로, GPU 드라이버는 기본 Ubuntu 20.04가 잡아준 것을 사용하고있다.

우선 호스트 PC 환경에서 다음과 같은 커맨드를 사용해서 Ubuntu GUI 패키지를 설치해준다.

1
2
sudo apt-get update
sudo apt-get -y install xorg xrdp xserver-xorg mesa-utils xauth gdm3

 


Docker 설치

Docker 설치에 관한 부분은 필자가 이전에 적은 Docker 글을 참조하면 좋다.

 


OSRF ROS Docker 이미지

이미지 땡겨오기

이번 글에서는 우선 빠르게 결과를 보기 위해, Open Source Robotics Foundation (이하 OSRF)에서 제작한 ROS docker 이미지를 사용한다.

Base ubuntu 이미지에 ROS를 직접 설치할 수도 있지만, 이 방식은 다음 글에서 설명하도록 한다.

1
2
3
4
5
6
7
# <DISTRO>는 원하는대로 바꿀 수 있다. indigo / kinetic / melodic / noetic 등등...
docker run -it \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
osrf/ros:<DISTRO>-desktop-full
export containerId=$(docker ps -l -q)

ROS 환경 활성화 + roscore 실행

이 커맨드를 입력하고나면 DockerHub로부터 해당 Distro의 ROS가 포함된 Docker 이미지를 다운받고 컨테이너를 생성한 후 실행한다.

실행된 컨테이너에서 source /opt/ros/<DISTRO>/setup.bash를 통해 ROS 환경을 읽어준 후, printenv | grep ROS를 사용해서 정확하게 환경이 읽혔는지 확인한다.

ROS 환경이 잘 읽힌게 확인이 되면 roscore 커맨드를 통해 ros 서버를 실행시킨다.

 


TurtleSim을 통해 GUI 앱 렌더링 확인

X11 포워딩 열어주기

tmux 기능을 이용해서 새로운 터미널로 옮긴다 (i.e.ctrl + b + ->).

Host PC에서 X11 포워딩을 열어주기 위해 xhost +loal:root 커맨드를 입력해서 포워딩을 열어준다.

새 터미널 열기

docker ps -a를 통해 ROS Docker 컨테이너의 이름을 알아낸다. 이 이름을 이라고 하겠다.

docker exec -it <CONTAINER_NAME> bash 커맨드를 통해 해당 컨테이너에서 터미널을 열 수 있다.

우선 가장 먼저 source /opt/ros/<DISTRO>/setup.bash를 통해 ROS 환경을 읽어주고, printenv | grep ROS를 사용해서 정확하게 환경이 읽혔는지 확인한다.

TurtleSim 설치하기

TurtleSim을 바로 돌리면 좋겠지만, 이 컨테이너에는 아직 turtlesim이 없으므로 아래 커맨드를 통해 직접 설치해줘야한다.

1
2
sudo apt-get update
sudo apt-get -y install ros-<DISTRO>-ros-tutorials

이후, rosrun turtlesim turtlesim_node 커맨드를 통해 Turtlesim을 실행시키면 GUI 앱이 렌더링 될 것이다.

다시 한번 tmux 기능을 이용해서 새로운 터미널로 옮긴다.

docker exec -it <CONTAINER_NAME> bash 커맨드를 이용해 새 터미널을 열어주고, 다시 source /opt/ros/<DISTRO>/setup.bash 커맨드를 이용해서 ROS 환경을 읽어준다.

이후 rosrun turtlesim teleop_key 커맨드를 이용해서 TurtleSim의 거북이를 움직일 수 있는 node를 실행시킨다.

이제 방향키를 움직여서 거북이가 움직이는 것을 볼 수 있다.

결과 확인