나름 공부하는 일상

[Docker] 도커에서 ROS2 환경 구축하기 #1 본문

IT 개발/ubuntu 세팅

[Docker] 도커에서 ROS2 환경 구축하기 #1

hi_g1 2024. 2. 22. 19:37
해당 포스팅에서는 이전 포스팅에서 설치한 Docker에 ROS2를 설치하는 방법을 포함하고 있습니다.

[환경]
os: ubuntu 22.04

[이전 글]

2024.02.17 - [IT 개발/ubuntu 밀었을 때, 봐] - [Docker] ubuntu22.04에 Docker 설치하기

1. Docker에서 ROS2사용하기

앞서 설치한 Docker에서 ROS를 사용하기 위해 ROS를 설치할 필요가 없다! ???
Docker의 이미지라는 어떠한 기능을 수행하기 위한 패키지를 이용해서 다운만 받으면 ROS가 설치된 운영체제며, 이전 글에서 오랫동안 설치한 학습환경을 그대로 이용할 수 있다. 이런 게 바로 Docker 많고 많은 장점 중 하나가 아닐까?
 
그래서 우리는 아래 Docker hub라는 사이트에서 사람들이 미리 만들어 놓은 필요한 Docker 이미지를 가져올 예정이다.
https://hub.docker.com/_/docker

 

docker - Official Image | Docker Hub

Docker Official Images are a curated set of Docker open source and drop-in solution repositories. Why Official Images? These images have clear documentation, promote best practices, and are designed for the most common use cases.

hub.docker.com

 

Step1. [docker pull 명령]을 이용해서 원하는 기능이 포함된 이미지 가져오기.

일단 나는 ros2의 humble이 포함된 이미지를 가져오기 위해 다음과 같이 명령어를 입력했다.

# docker pull 만든사람:tag => tag는 만든사람이 붙여놓은 별명 같은 거다.
docker pull osrf/ros:humble-desktop
이미지 다운 완료

 
 

Step2. [docker images 명령]으로 다운로드한 이미지 확인하기

# check images
docker images

 
 

Step3. [docker run 명령]으로 docker image 실행하기 (with 수많은 옵션)

Docker image를 실행한다고 적어놓았지만 실제로는 Docker image를 통해 독립된 container를 실행한다는 표현이 더 올바를 것이다.  container는 간단하게 말해, image의 정보를 토대로 만들어진 가상의 독립된 환경이라 생각하면 조금이나마 이해하기 편하다.
 
아래 명령을 입력하면 설치한 humble 이미지를 활용해 container가 실행된다. 그리고 아래 run 뒤에 붙은 옵션이나 기타 옵션에 대해 궁금한 점이 있으면 다음 사이트를 참고하면 된다.
https://docs.docker.com/engine/reference/run/

 

Running containers

Running and configuring containers with the Docker CLI

docs.docker.com

 
아래 명령어를 입력하기 전에 마지막 줄에 있는 이름이라는 부분을 본인이 원하는 이름으로 설정해 준다. 또한, 마찬가지로 마지막 줄 끝에 있는 이미지 이름을 humble이 아닌 다른 이미지로 다운로드한 경우 변경해 준다.
 
[docker run 입력 전 확인 사항]

컨테이너 이름 지정하기
실행할 이미지가 본인이 다운로드한 이미지인지 확인

 

# 마지막 줄에서 이름 변경 및 본인 이미지 이름 확인하기 
docker run -it --rm --privileged \
-e DISPLAY=$DISPLAY \
--env="QT_X11_NO_MITSHM=1" \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
--hostname $(hostname) \
--network host \
--name 이름 osrf/ros:humble-desktop bash

 
[docker ps로 컨테이너 실행여부 확인하기]
위 명령어를 통해 container를 실행하면 아래 터미널의 첫 번째 사진처럼 접속이 가능해지고, 실제로 실행 중인지 확인을 위해 다음 docker ps를 입력해 실행 여부를 확인할 수 있다.

# 컨테이너 실행 여부 확인하기
docker ps
container 실행 여부 파악

 
추가로 위처럼 예쁘고 위아래로 나눠지는 터미널을 가지고 싶다면 다음 포스팅을 읽어보면 된다.
2024.02.15 - [IT 개발/ubuntu 밀었을 때, 봐] - 우분투에서 terminator 예쁘게 설정하기

 

우분투에서 terminator 예쁘게 설정하기

해당 포스팅에서는 ROS를 사용할 때 편리하도록 Terminator를 세팅하는 방법을 다루고 있습니다. 0. Terminator 비포 & 애프터 ROS를 사용하다보면 런치파일도 실행시켜야하고 다른 도구를 활용해 토픽

narmstudy.tistory.com

 
 

Step4. container에 ROS2 잘 있는지 확인하기!

해당 컨테이너에서 ROS2의 생존 여부를 확인하기 위해 다음 명령어를 통해 시스템이 ROS를 인식할 수 있도록 해야 한다. 아래 명령어는 매번 컨테이너를 실행할 때마다 입력해야 돼서, bashrc에 등록해 줘 입력하는 번거로움을 없애줘야 한다!
 
일단 정석적인(?) 방법과 귀찮음을 해결할 영구적인 등록 방법 2가지를 알아보도록 하자.

# 방법1) 정석적으로 매번 입력해 주기
source /opt/ros/humble/setup.bash

# 방법2) bashrc에 1번 내용 영구적으로 기록하기
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc && source ~/.bashrc

 
사실 위 명령어가 실행되는 것 자체가 이미 ROS2가 설치됐다는 증거(?)이다. 후후후후후 여기까지 ros2가 잘 설치된 것을 확인했으니 간단하게 ros2 관련 코드를 실행해 보고 이번 포스팅은 끝내려고 한다.
 
 

Step5. 간단한 ROS2 코드 실행해 보기

실행해 볼 코드는 turtlesim이라는 거북이를 움직일 수 있는 코드이다. 그리고 사족이긴 한데 ROS랑 거북이는 관련이 많다. 나중에 ROS로고랑 거북이랑 비교해 보면 왜 그런지 약간이나마 알 수 있다.
 
암튼 거북이를 띄우는 명령어는 아래의 1번과 같고 거북이를 움직이는 명령어는 2번과 같다. 

거북이 움직이기
# 1번 거북이 시뮬레이터 실행
ros2 run turtlesim turtlesim_node

 
아마 위 코드를 실행했을 때, 오류가 발생했을 것이다. 설령 그럴리는 없겠지만(?) 오류가 발생하지 않고 아래 코드를 실행시켰다 하더라도 기다리고 있던 두 번째 문제 상황이 발생했을 것이다. 후후후후후후후 

# 2번 거북이 움직이는 코드 실행
ros2 run turtlesim turtle_teleop_key

 
다음 Step6,7에서 각 문제를 해결하는 방법에 대해 알아보자

첫 번째는 현재 컨테이너가 실행 중인 터미널 말고 다른 터미널에서 해당 컨테이너에 어떻게 접속하는지?
두 번째는 어떻게 설정해야 컨테이너에서 띄워진 gui를 로컬 환경에서 확인할 수 있는지?

 
 

Step6. [docker exec 명령]으로 다른 터미널에서 현재 실행 중인 컨테이너에 접속하기

첫 번째는 현재 컨테이너가 실행 중인 터미널 말고 다른 터미널에서 해당 컨테이너에 어떻게 접속하는지?

 
[문제 상황]
step3에서 docker image로 실행한 컨테이너는 독립된 환경을 가진다고 소개했었다.
그 말은 터미널 창마다 컨테이너가 다 독립적으로 실행된다고 해석할 수도 있다. 그렇다면 거북이를 실행하는 창이랑 움직이게 하는 창이 동시에 필요한 경우에는 어떻게 해야 될까?  이전 docker run 명령어를 실행시켜 보면 아마 동일한 컨테이너 이름을 가졌다고 충돌이 발생하거나 이름을 바꿔 새로 실행하면 또 다른 새로운 독립된 환경을 가진 컨테이너가 실행될 것이다.
 
[정답]
이를 위해 docker의 exec 명령어를 이용해 아래처럼 기존 컨테이너에 접속하여 문제를 해결할 수 있다. (컨테이너 이름이나 ID는 docker ps를 통해 확인할 수 있다.)

# 새로운 터미널에서 기존 실행 중인 터미널로 접속하기
docker exec -it 컨테이너이름이나ID bash

 
[결과]
아래 사진을 보면 위의 터미널은 docker run으로 컨테이너를 실행했고, 아래 터미널은 docker exec로 컨테이너에 접속한 것을 확인할 수 있다. 이렇게 되면 서로의 환경을 공유할 수 있다. test 방금 만든 폴더를 두 터미널에서 확인할 수 있듯이 말이다. 

동일 컨테이너에 접속하기

 
 

Step7. [xhost + 명령]으로 gui 이용하기

 

두 번째는 어떻게 설정해야 컨테이너에서 띄워진 gui를 로컬 환경에서 확인할 수 있는지?
에러 발생

 
[정답]
step5에서 말한 두 번째 문제를 해결하는 과정은 굉장히 쉽다. 
gui를 이용하기 위해 컨테이너에 접속하지 않은 터미널에서 다음 명령어를 입력하면 컨테이너 내부에서 실행되는 창을 확인할 수 있다. 

# 컨테이너에 접속하지 않은 터미널 창에서 입력
xhost +

 
[결과]
우측 터미널에서 xhost +를 입력하고 오류가 발생했던 명령어를 다시 입력했더니 문제가 해결된 것을 확인할 수 있다.

문제 해결 끝

 
 

Step8. 앞으로 기다리고 있을 고난과 시련들

여기까지 잘 끝냈다면 한 번 Ctrl+D를 눌러 터미널 창을 모두 종료해 보자.
그리도 docker run을 이용해 컨테이너에 접속해 보면
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

다 사라졌을 것이다! 두둥!

다음 편에 계속