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 |