로봇/ROS

Ubuntu에서 Docker를 이용한 ROS1, ROS2 설치

with-RL 2023. 1. 17. 17:11

ROS1은 기본적으로 Ubuntu 18.04에서 동작합니다. 그리고 ROS2는 Ubuntu 22.04에서 동작합니다. 즉 ROS1, ROS2를 하나의 Ubuntu에서 실행하기 어렵다는 의미입니다.

 

Docker를 사용해서 ROS1, ROS2가 하나의 Ubunt에서 동작 가능하도록 하는 방법에 대한 설명입니다.

 

그리고 두 번째 제약사항은 Docker container 내부에서 Host의 카메라 및 /dev 폴더 아래 다양한 디바이스에 접근이 가능해야 합니다.

카메라는 ROS를 통해 주변 상황을 인식하기 위해서는 눈 역할을 하는 카메라를 인식할 수 있어야 합니다. 그리고 /dev 폴더 아래 다양한 디바이스는 Lidar 및 센서 등 다양한 외부 장비를 사용할 수 있게 하기 위함입니다.

 

아래 내용은 Ubuntu-22.04 기준으로 정리했습니다.

 

설치과정이 Host 컴퓨터와 Docker container를 번갈아 가며 실행이 되므로 혼돈이 될 수 있습니다. 프롬프트를 통해서 구분하세요.

  • $: Host 컴퓨터에서 실행하는 명령어
  • #: Container에서 실행하는 명령어

1. Docker란

Docker에 대한 설명을 하기에는 내용이 많기 때문에 아래 동영상을 추천합니다. 기본적인 사용방법이 비교적 쉽게 잘 설명되어 있습니다.

https://www.youtube.com/watch?v=Ps8HDIAyPD0&list=PLuHgQVnccGMDeMJsGq2O-55Ymtx0IdKWf

 

Ubuntu에서 Docker를 설치하는 방법은 아래 블로그를 추천합니다.

https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04

2. ROS1 설치

Docker가 설치가 정상적으로 되었다면 이제 ROS1을 설치하면 됩니다.

2.1. Docker 다운로드

우선 설치한 Docker image를 다운로드합니다.

https://hub.docker.com/r/osrf/ros/tags에 다양한 설치가능한 Docker imager가 있습니다. 이 중에서 '

osrf/ros:melodic-desktop-full' 이미지를 아래 명령으로 다운로드합니다.

$ docker pull osrf/ros:melodic-desktop-full

아래 명령으로 'osrf/ros:melodic-desktop-full' 이미지가 다운로드된 것을 확인할 수 있습니다.

$ docker images

위 그림과 같이 'osrf/ros:melodic-desktop-full' 목록이 보이면 됩니다.

2.2. Docker 실행

다운로드한 'osrf/ros:melodic-desktop-full' 이미지를 아래 명령으로 실행합니다.

$ docker run \
--name ros1 \
-it \
--privileged \
--env="DISPLAY=:0.0" \
-v=/tmp/.X11-unix:/tmp/.X11-unix:ro \
-v=/dev:/dev \
-v=<Host_ws>:<Container_ws> \
-w=<Work_dir> \
osrf/ros:melodic-desktop-full

명령 옵션에 대한 설명은 다음과 같습니다.

  • --name ros1: Container의 이름을 지정합니다. 이후로는 명령어에 ros1을 이용해서 container 관련 명령을 수행할 수 있습니다.
  • --it: Container에서 터미널 명령을 사용할 수 있도록 하는 옵션입니다.
  • --privileged: Container에서 시스템의 주요 자원에 접근할 수 있도록 하기 위함입니다.
  • --env="DISPLAY=:0.0": Container에 DISPLAY 환경변수를 지정합니다. Host에 GUI를 출력하도록 하기 위함입니다.
  • -v=/tmp/.X11-unix:/tmp/.X11-unix:ro: Container가 Host의 GUI 환경을 사용할 수 있도록 하기 위함입니다.
  • -v=/dev:/dev: Container의 /dev 폴더가 Host의 /dev 폴더에 연결되도록 하기 위함입니다. --privileged 옵션을 줬기 때문에 /dev 아래 여러 장치에 접근할 수 있습니다.
  • -v=<Host_ws>:<Container_ws>: Container의 work space와 Host의 work space를 연결해 줍니다. 이렇게 하고 Container work space에서 작업한 내용은 모두 Host work space에 저장됩니다. Docker를 삭제하더라도 Host work space에 작업한 내용이 남아 있게 됩니다.
  • -w=<Work_dir>: Container에 접속했을 경우 시작 폴더위치입니다.

위 그림과 같이 Container에 접속된 상태의 프롬프트가 실행되면 됩니다. 이제 아래 명령으로 Container에서 빠져나옵니다.

# exit

이제 Container에서 Host의 GUI환경에 접속이 가능하도록 아래 명령을 실행합니다.

이 명령은 Host에 로그인 후 매번 실행해야 합니다.

$ xhost +local:docker

아래 명령으로 Container의 상태를 확인합니다.

$ docker ps -a

위와 같이 Container의 상태를 확인할 수 있습니다. STATUS가 Exited인 것은 Container가 중지된 상태라는 의미입니다.

아래 명령으로 Container를 시작합니다.

$ docker start ros1

아래 명령으로 다시 한번 Container의 상태를 확인합니다.

$ docker ps -a

위 Container 상태에서 STATUS가 Up인 것은 Container가 실행 중인 상태라는 의미입니다.

2.3. ROS 환경 설정

아래 명령을 실행해 Container에 접속합니다.

$ docker exec -it ros1 /bin/bash

Container에 접속된 상태의 프롬프트에서 아래 명령을 실행해서 Container에 접속할 경우 자동으로 ROS 환경이 로딩되도록 합니다.

# echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc

아래 명령을 실행해서 현재 창에도 ROS 환경을 로딩합니다.

# source ~/.bashrc

아래 명령을 실행해서 Ubuntu의 패키지 정보를 갱신합니다.

# apt update

2.4. python3.7 환경설정

다음 과정에서 진행할 yolo v5와 ros를 연동하기 위해서는 python 3.7을 ros에서 사용할 수 있도록 해야 합니다.

아래 명령을 실행해서 python 3.7을 설치합니다.

# apt install python3.7-dev

아래 두 명령을 실행해서 python3을 실행할 경우 python 3.6 또는 python 3.7을 선택할 수 있도록 합니다.

# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2

아래 명령을 실행해서 python3의 버전을 선택합니다.

# update-alternatives --config python3

위와 같은 화면이 실행되면 2를 입력해서 python 3.7이 기본이 되도록 설정합니다.

다음 명령을 실행해서 python3의 버전을 확인합니다.

# python3 --version

위 그림과 같이 python 3.7이 나타나면 정상입니다.

아래 명령을 실행해서 추가로 필요한 프로그램을 설치합니다.

# apt install python3-pip python3-yaml
# apt install python3-catkin-tools python3-numpy
# apt install wget curl

아래 명령을 실행해서 pip3를 설치합니다. 이 과정을 생략하면 이후 pip3 install 명령을 실행할 때 오류가 발생할 수 있습니다.

# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
# python3 get-pip.py

이제 pip3 명령을 이용해 패키지를 설치합니다.

# pip3 install rospkg catkin_pkg
# pip3 install scikit-build
# pip3 install cmake
# pip3 install opencv-python
# pip3 install cvbridge3

2.5. turtlesim 테스트

ROS의 동작을 확인하기 위해 turtlesim을 실행해 보겠습니다.

이 테스트를 위해서는 3개의 터미널이 필요합니다. 3개의 터미널 모두 아래명령을 통해 Container에 접속합니다.

$ docker exec -it ros1 /bin/bash

첫 번째 터미널에서 아래 명령을 실행해서 roscore를 실행합니다.

# roscore

위와 같이 실행 결과를 볼 수 있습니다.

두 번째 창에 아래 명령을 통해 turtlesim_node를 실행합니다.

# rosrun turtlesim turtlesim_node

 

위와 같이 Host에 turtlesim_node가 실행됩니다.

세 번째 창에 아래 명령을 통해 turtle_teleop_key를 실행합니다.

# rosrun turtlesim turtle_teleop_key

위와 같이 turtle_teleop_key가 실행됩니다.

turtle_teleop_key 화면에서 화살표키를 누르면 turtlesim_node의 거북이가 움직이는 것을 확인할 수 있습니다.

3개의 창에서 ctrl+c를 누르면 종료할 수 있습니다.

2.6. 카메라 테스트

다음은 Container에서 카메라에 접근할 수 있는지 확인해 보겠습니다.

camera_test.py 파일을 만들고 아래와 같이 코드를 입력합니다.

import cv2


if __name__ == '__main__':
    frame = cv2.VideoCapture(0)
    while frame.isOpened():
        ret, img = frame.read()
        cv2.imshow('frame', img)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    frame.release()
    cv2.destroyAllWindows()

아래 명령을 실행해서 camera_test.py를 실행합니다.

# python camera_test.py

Host에 카메라 화면이 보이면 정상입니다. frame에서 'q'를 누르면 화면이 종료됩니다.

2.7. Serial 테스트

Container에서 /dev 폴더에 접근 가능한 것을 확인하기 위해 STM32 NUCLEO-F103RB 보드를 연결해 보겠습니다. (다른 Serial 통신이 되는 보드도 상관없습니다.)

우선 아래 명령을 실행해서 /dev/tty* 목록을 확인합니다.

# ls /dev/tty*

위와 같이 /dev/tty* 목록을 확인할 수 있습니다.

이제 STM32 NUCLEO-F103RB 보드를 연결합니다. 그리고 아래 명령을 실행해서 다시 한번 /dev/tty* 목록을 확인합니다.

# ls /dev/tty*

위 결과에서 '/dev/ttyACM0'가 새롭게 보이는 것을 확인할 수 있습니다.

 

지금까지 Docker를 이용해서 ROS1을 설치하고 간단하게 확인하는 과정이었습니다.

'로봇 > ROS' 카테고리의 다른 글

ROS2 Minimal Tutorial - Topic  (0) 2023.07.14
ROS2 Minimal Tutorial - Basic  (0) 2023.07.13
Windows에서 Docker를 이용해 ROS2, Gazebo 설치하기  (7) 2023.07.12
ROS1에 CygLiDAR 연동하기  (0) 2023.01.19
ROS1에 YOLO v5 연동하기  (1) 2023.01.18