Tutorial/Control UR Robot with Docker and ROS

2. ROS with Docker

페트론 2022. 1. 15. 21:37

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

 

Hello-world - Official Image | Docker Hub

Quick reference Supported tags and respective Dockerfile links (See "What's the difference between 'Shared' and 'Simple' tags?" in the FAQ.) Simple Tags Shared Tags Quick reference (cont.) Where to file issues: https://github.com/docker-library/hello-world

hub.docker.com

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" 토픽 메시지를 그래프 형태로 확인.

반응형