2. ROS with Docker
Goal of Lecture
- Linux의 기본 사용법 숙지.
- Docker의 기본 사용법 숙지.
- Docker를 이용한 ROS 사용법 숙지.
1. How to Use Linux
Ubuntu 18.04를 설치한 후, 처음 보이는 화면은 다음과 같음.
사용자의 편의를 고려한 많은 메뉴와 어플리케이션이 존재.
Terminal
우분투에서 기본적으로 대부분의 명령은 터미널창을 통해 이루어짐
다음의 단축키를 통해 터미널 오픈 가능.
ctrl + alt + t
이를 통해 아래와 같이 터미널창이 오픈되는 것을 확인할 수 있음.
💡 사진의 터미널창과 우분투 기본 터미널창이 다를 수 있음.
사진의 터미널창은 작업의 효율을 위해 하나의 창에서 멀티윈도우로 분리가 가능한 "terminator" 어플리케이션.
설치방법은 "sudo apt install terminator".
사용방법은
가로분리 : ctrl + shift + o
세로분리 : ctrl + shift + e
창 닫기 : ctrl + shift + w
Command
터미널을 통해서 다양한 명령어 수행이 가능하며, 이를 통해 저장소 내의 파일 생성 및 수정 등이 가능.
사용법은 터미널에 해당 명령어들을 입력하여 사용.
💡 몇몇 명령어들은 추가적인 파라미터(파일의 경로, 디렉토리 경로 등)를 필요로 함. 차후 실습에서 활용하며 숙지.
Practice
cd
cd 명령어를 이용하여 특정 경로로 이동.
cd Desktop/
💡 cd Desktop/ 명령어를 이용해 바탕화면으로 이동하게됨.
~ : home/user 경로를 의미함.
대부분의 작업은 "~"를 기준으로 이루어짐.
터미널 상에서 경로가 ~/Desktop 으로 변경된 것을 확인할 수 있음.
gedit
gedit 명령어를 통해 파일을 생성 및 수정할 수 있음.
gedit test.txt
💡 gedit 외에도 파일을 생성 및 수정하기 위한 도구로 vim, nano 등이 있음.
현재는 gui를 이용하기 때문에 접근성이 높은 gedit을 사용하여 실습을 진행.
이 후, 텍스트 창을 수정하여 저장.
gedit 창에서 "ctrl + s"
이 후, 터미널 창에서 아래 내용을 입력해 텍스트창을 닫은 후, 바탕화면을 보면 "test.txt" 파일이 생성되어 있는 것을 확인할 수 있음.
터미널 창에서 "ctrl + c"
💡 ctrl + c : 터미널에서 실행된 명령어를 취소 및 종료시키는 기능.
mkdir
mkdir 명령어를 이용해 폴더를 생성할 수 있음.
mkdir test_folder
cp
cp를 이용하여 파일 혹은 폴더를 특정 경로로 복사할 수 있음.
cp test.txt test_folder/copy_of_test.txt
mv
mv 명령어를 이용하여 파일을 특정 경로로 이동시킬 수 있음.
mv test.txt test_folder/
ls
ls 명령어를 통해 현재 경로에 존재하는 파일 및 폴더를 확인할 수 있음.
ls
cd test_folder
ls
chmod
chmod 명령어를 이용하여 파일에 읽기, 쓰기 등의 권한을 줄 수 있음.
💡 chmod [OPTION] [MODE] [FILE] OPTION -v : 모든 파일에 대해 모드가 적용되는 진단(diagnostic) 메시지 출력.
-f : 에러 메시지 출력하지 않음.
-c : 기존 파일 모드가 변경되는 경우만 진단(diagnostic) 메시지 출력.
-R : 지정한 모드를 파일과 디렉토리에 대해 재귀적으로(recursively) 적용.
MODE 파일에 적용할 모드(mode) 문자열 조합.
u,g,o,a : 소유자(u), 그룹(g), 그 외 사용자(o), 모든 사용자(a) 지정.
+,-,= : 현재 모드에 권한 추가(+), 현재 모드에서 권한 제거(-), 현재 모드로 권한 지정(=)
r,w,x : 읽기 권한(r), 쓰기 권한(w), 실행 권한(x)
X : "디렉토리" 또는 "실행 권한(x)이 있는 파일"에 실행 권한(x) 적용.
s : 실행 시 사용자 또는 그룹 ID 지정(s). "setuid", "setgid".
t : 공유모드에서의 제한된 삭제 플래그를 나타내는 sticky(t) bit.
0~7 : 8진수(octet) 형식 모드 설정 값.
chmod test.txt
ls
test.txt 파일에 실행권한을 부여했을 때, 초록색으로 표시되는 것을 확인할 수 있음.
리눅스에는 다양한 명령어가 존재하므로 필요한 명령어를 적절하게 활용하는 노력 필요.
2. How to Use Docker
Install Docker
터미널에서 다음 명령어를 이용하여 docker를 설치.
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] <https://download.docker.com/linux/ubuntu> bionic stable"
sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce
sudo systemctl status docker
마지막 명령어 입력시, 다음의 내용이 확인된다면 설치 완료.
Active: active
Command
Image
- Listing Image : 도커 이미지들의 목록을 불러옴.
- sudo docker images
- Search Image : 도커 이미지를 검색.
- sudo docker search [image name]
- Pull Image : 도커 이미지를 도커허브(도커 이미지 저장소)로부터 다운로드.
- sudo docker pull [image name]:[tag]
- Remove Image : 도커 이미지를 삭제.
- sudo docker rmi [image name] or sudo docker rmi -f [image name]
- Remove all Images : 도커 이미지를 모두 제거함.
- sudo docker rmi $(sudo docker images -q)
Container
- Listing Container : 도커 컨테이너 목록을 불러옴. -a 옵션을 사용해서 실행되지 않는 컨테이너들의 목록을 모두 불러올 수 있음.
- sudo docker ps or sudo docker ps -a
- Run Container : 이미지를 이용하여 컨테이너를 실행함.
- sudo docker run [options] image[:TAG|@DIGEST] [COMMAND] [ARG...]
-
💡 Parameters -d : Background mode -p : Port Forwarding, Connect Host and Container -v : Connect Host Directory and Container Directory -e : Set Environment Variables in Container —name : Set Name of Container —it : Connect Keyboard Input of Local Computer to Container Input of Terminal —rm : Remove Container when process is done —link : Connect to other Container
- Start Container : 컨테이너를 실행함.
- sudo docker start [container name or id]
- Restart Container : 컨테이너가 종료된 경우, 컨테이너를 재실행함.
- sudo docker restart [container name or id]
- Attach Container : 현재 실행되고 있는 컨테이너에 접근함. 이 때, 기존에 실행되고 있는 터미널에 접속됨.
- sudo docker attach [container name or id]
- Execute Container : 현재 실행되고 있는 컨테이너에 접근함. 이 때, 새로운 터미널을 생성하여 접속됨.
- sudo docker exec [container name or id]
-
💡 Parameters -d : Background mode -e : Set Environment Variables in Container —it : Connect Keyboard Input of Local Computer to Container Input of Terminal —privileged : System Authorization
- Stop Container : 컨테이너를 정지시킴.
- sudo docker stop [container name or id]
- Remove Container : 컨테이너를 제거함.
- sudo docker rm [container name or id]
- Remove all Container : 컨테이너를 모두 제거함.
- sudo docker rm $(sudo docker ps -a -q)
Practice
Docker Run
도커 설치가 완료되었다면, 터미널에 다음의 명령어를 입력하여 컨테이너를 실행할 수 있음.
sudo docker run hello-world
도커는 run 명령어를 이용해 파라미터로 주어진 이미지를 이용해 컨테이너를 생성하게 됨.
만약 이미지가 없는 경우, "Docker Hub"에 존재하는 이미지를 검색해서 해당 이미지를 다운로드(Pull) 한 뒤, 다운로드된 이미지를 기반으로 컨테이너를 생성함.
이미지에는 Tag(Version of Image)가 존재하며, Tag가 명시되지 않을 경우, 가장 최신 버전(Latest)을 다운로드하게 됨.
Hello-world - Official Image | Docker Hub
Docker Images
다음 명령어를 통해 현재 설치된 도커 이미지를 확인할 수 있음.
sudo docker images
앞에서 설치한 hello-world 이미지를 확인할 수 있음.
Docker Container List
다음 명령어를 통해 컨테이너의 목록을 확인할 수 있음.
sudo docker ps -a
💡 현재 hello-world 컨테이너는 가동중이지 않기 때문에, -a 파라미터를 사용하여 확인함.
💡 도커 컨테이너를 Run할 때에 —name 파라미터를 설정하지 않으면 랜덤한 이름 (ex. dreamy_blackburn)이 부여됨.
Remove Docker Container
다음의 명령어를 사용하여 Docker Container를 제거할 수 있음.
sudo docker rm [container name or id]
sudo docker ps -a
Remove Docker Images
다음 명령어를 통해 Docker Image를 제거할 수 있음.
sudo docker rmi [image name]
sudo docker images
03. ROS with Docker
xhost
전 주에 설명한 대로, 컨테이너 내부에서 작동하는 GUI를 Host PC에서 띄우기 위해서는 xhost를 사용하여 도커 컨테이너의 접근을 허용해야 함.
Install xhost
먼저 터미널 창에서 아래 명령어를 입력하여 xorg를 설치.
sudo apt install xorg
Allow Access
이 후, 터미널 창에서 아래 명령어를 입력하여 Docker Container에 대한 xhost 접근을 허용.
xhost +local:docker
Practice
Image View and Rosbag
다음 명령어를 통해 컨테이너를 실행하고 ROS Master 실행.
# terminal_1
sudo docker run -it --name="ros" -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:rw --privileged --device=/dev/video0:/dev/video0 osrf/ros:melodic-desktop-full
source /opt/ros/melodic/setup.bash
roscore
💡 --name="ros" : 컨테이너의 이름은 "ros"
-e DISPLAY=unix$DISPLAY
-v /tmp/.X11-unix:/tmp/.X11-unix:rw : 컨테이너의 GUI를 Host PC에 출력하기 위한 설정
--privileged --device=/dev/video0:/dev/video0 : Host PC에 연결된 카메라 센서를 컨테이너의 카메라 센서로 인식시키기 위한 설정
osrf/ros:melodic-desktop-full : ROS와 관련된 RQT, RViz, Gazebo 등이 기본 설치된 이미지
source : 파일을 읽는 명령어.
/opt/ros/melodic/setup.bash : ROS와 관련된 설정들이 저장된 파일 경로. 해당 파일을 읽지 않으면 ROS와 관련된 내용을 실행할 수 없음
roscore : ROS Master를 실행하는 명령어
다음 명령어를 통해 실행되어있는 ros 컨테이너에 접속하고 usb_cam 패키지를 설치
# terminal_2
sudo docker exec -it ros bash
apt-get update
apt install ros-melodic-usb-cam
source /opt/ros/melodic/setup.bash
rosrun usb_cam usb_cam_node
💡 apt-get update : apt 모듈을 사용하여 설치할 수 있는 패키지 및 모듈 목록을 업데이트
apt install : apt 모듈을 이용하여 패키지 및 모듈을 설치함.
ros-melodic-usb-cam : ros를 이용하여 usb cam으로부터 이미지를 획득할 수 있도록 해주는 패키지
rosrun : ROS 노드를 실행시켜주는 명령어. rosrun [package] [node] 식으로 입력.
usb_cam usb_cam_node : usb_cam 패키지의 usb_cam_node 노드를 실행함
다음 명령어를 통하여 RQT를 실행하고 [Plugins] → [Visualization] → [Image View] 메뉴에 들어가 "/usb_cam/image_raw" 토픽을 선택한다.
# terminal_3
sudo docker exec -it ros bash
source /opt/ros/melodic/setup.bash
rqt ([Plugins] → [Visualization] → [Image View], select "/usb_cam/image_raw")
다음 명령어를 통하여 이미지 토픽 메시지를 녹화하고, 이를 rqt에서 재생. 이 때 그래프를 마우스 우클릭하여 [View] → [Image View]를 선택한 후, Play 버튼을 클릭.
# terminal_4
sudo docker exec -it ros bash
source /opt/ros/melodic/setup.bash
rosbag record /usb_cam/image_raw
(input "ctrl + c" after few seconds)
rqt ([Plugins] → [Logging] → [Bag], select "Load File" and select your recorded file)
Turtlesim
다음 명령어를 통해 컨테이너를 실행하고 ROS Master 실행.
# terminal_1
sudo docker run -it --name="turtlesim" -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:rw osrf/ros:melodic-desktop-full
source /opt/ros/melodic/setup.bash
roscore
다음 명령어를 통해 실행되어있는 turtlesim 컨테이너에 접속하고 turtlesim node 노드를 실행.
# terminal_2
sudo docker exec -it turtlesim bash
source /opt/ros/melodic/setup.bash
rosrun turtlesim turtlesim_node
다음 명령어를 통해 실행되어있는 turtlesim 컨테이너에 접속하고 turtlesim teleop key 노드를 실행.
해당 터미널에서 방향키 입력을 주게되면 터틀심 조작이 가능.
# terminal_3
sudo docker exec -it turtlesim bash
source /opt/ros/melodic/setup.bash
rosrun turtlesim turtle_teleop_key
다음 명령어를 통해 실행되어있는 turtlesim 컨테이너에 접속하고 RQT를 실행.
# terminal_4
sudo docker exec -it turtlesim bash
source /opt/ros/melodic/setup.bash
rqt
[Plugins] → [Instrospection] → [Node Graph] 를 선택해 노드 그래프 확인.
/teleop_turtle 노드로부터 /turtlesim 노드로 "/turtle1/cmd_vel" 토픽 메시지가 전달되고 있는 것을 확인할 수 있음.
💡 cmd_vel : command velocity 를 의미하며, 키보드의 입력을 받으면 속도 값을 turtlesim node로 전달함
[Plugins] → [Topics] → [Topic Monitor] 를 선택해 토픽 메시지 확인.
[Plugins] → [Visualization] → [Plot]을 선택한 후, "/turtle1/pose" 토픽 메시지를 그래프 형태로 확인.