IT 지식/IsaacSim

docker로 ros2와 Isaac Sim 연동하기!

Creative Curiosity 2025. 1. 23. 20:01
728x90
반응형

<목차>

1. 필수 사전 패키지 설치

2. rocker 설치 및 실행

3. docker 안에서 설정

4. Isaac Sim 안에서 ROS2 bridge 설정

5. docker 와 Isaac Sim 연동 확인하기

지금 환경이 어딘가 잘 안맞아 ROS2 설치에 애를 먹으시는 분들은 Docker 를 사용해서 ROS2 를 설치하고 Isaac Sim 과 연결하는 것도 좋은 방법입니다. (다만 WSL2 는 docker 적용이 잘 안된다고 알고 있습니다..)

그래서 오늘은 docker를 사용하여 ROS2 설치하고 Isaac Sim에 연동하는 것까지 살펴보겠습니다.

AWS Nvidia Omniverse AMI를 설치하면 기본적으로 Ubuntu 20.04가 설치됩니다. 그렇게 되면 ROS2 Humble을 시스템 레벨의 로컬 환경에 그대로 다운로드하는 데 제약이 있습니다. 이전에는 Ubuntu 20.04 root에 Python 3.8 버전에서 Source로 Ubuntu 20.04 버전의 ROS2 Humble을 설치하였으나, 이후 IsaacSim_ros bridge를 다운받아 실행하려면 Python 버전이 3.10으로 맞춰져야 하는 문제점이 발생하였습니다.

그래서 이번에는 Docker로 Ubuntu 22.04, Python 3.10에 ROS2를 설치한 후, 그 Docker 안의 ROS2와 Docker 밖에 로컬에 설치된 Isaac Sim과의 연동을 시도해 보려고 합니다. 이때 Docker와 Docker 밖의 로컬 프로그램을 연결하는 데 도움을 주는 프로그램이 바로 Rocker입니다.

1. 필수 사전 패키지 설치

그러나 이 rocker 로 시작하기 전에 사전 설치 사항이 2가지 필요합니다.

1.1 Docker 설치

먼저 docker 를 설치해야 합니다.

아래 링크에서 다운을 받을 수 있습니다.

Docker installation instructions:

https://docs.docker.com/get-started/get-docker/

 

Get Docker

Download and install Docker on the platform of your choice, including Mac, Linux, or Windows.

docs.docker.com

 

1.2 Nvidia-container-toolkit 설치

docker 와 gpu 를 연동하기 위한 nvidia container toolkit 을 다운로드 해줘야 합니다.

저는 이것을 nvidia-cuda-toolkit 과 헷갈려 이미 설치한 줄 알고 넘어갔는데, 헷갈리지 마셔야 합니다..

아래 설치 링크가 있습니다.

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

 

Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.17.3 documentation

 

docs.nvidia.com

 

 

2. rocker 설치 및 실행

이제 rocker 을 다운로드 할 차례입니다.

rocker에 대해서는 아래 github Readme 에 잘 나와있습니다.

https://github.com/osrf/rocker

Rocker의 핵심 기능을 요약하면 다음과 같습니다.

'''Rocker의 주요 목적은 로컬 환경에 영향을 받는 Docker 사용 사례를 지원하는 것입니다. 주요 예로는 컨테이너 내부의 파일 권한을 컨테이너 외부 사용자와 일치하도록 설정하는 것이 있습니다. 이렇게 하면 컨테이너 내부에 마운트된 파일이 호스트와 동일한 UID(사용자 ID)를 가지게 되어, 동일한 워크스페이스를 활용해 다양한 플랫폼에서 테스트를 수행하면서도 손쉽게 여러 컨테이너를 오가며 작업할 수 있습니다. 이를 위해 Rocker는 로컬 환경에서 요구되는 조건을 감지한 후, 동일한 기본 이미지를 기반으로 동적으로 오버레이를 생성합니다.'''

즉, Rocker는 Docker 컨테이너를 로컬 환경과 더 원활하게 통합하기 위한 도구입니다. 특히 파일 권한 문제를 해결하여 컨테이너 안팎에서 동일한 파일을 문제없이 사용할 수 있도록 지원하는 것이 핵심 기능이라고 할 수 있습니다. 이를 통해 다양한 플랫폼에서 테스트를 수행하거나 여러 컨테이너를 사용하는 작업을 보다 효율적으로 진행할 수 있습니다.

그 밖의 Rocker에 관한 다른 옵션들도 확인하실 수 있으니 필요할 때 참고하시면 됩니다. 예를 들어, 네트워크 설정, 포트 포워딩, 환경 변수 설정 등 다양한 옵션을 통해 컨테이너 실행을 더욱 세밀하게 제어할 수 있습니다.

Rocker 설치는 간단히 아래 명령어를 입력하면 됩니다.

 

GitHub - osrf/rocker: A tool to run docker containers with overlays and convenient options for things like GUIs etc.

A tool to run docker containers with overlays and convenient options for things like GUIs etc. - osrf/rocker

github.com

 

 

GitHub - osrf/rocker: A tool to run docker containers with overlays and convenient options for things like GUIs etc.

A tool to run docker containers with overlays and convenient options for things like GUIs etc. - osrf/rocker

github.com

 

pip install rocker

이때 pip는 환경 의존성이 강한 명령어이므로, 혹시 conda나 python venv 같은 가상 환경에서 이 명령어를 실행하시는 분은 해당 환경에서만 Rocker 명령이 정상적으로 작동되는 것을 유의하셔야 합니다. 즉, 가상 환경을 활성화한 상태에서 pip install rocker 명령어를 실행해야 해당 가상 환경에서 Rocker를 사용할 수 있습니다.

이러한 점들을 고려하여 Rocker를 설치하고 사용하시면 더욱 효과적으로 Docker 컨테이너를 관리하고 활용하실 수 있을 것입니다.

밑의 명령어는 rocker 를 시작하는 명령어 입니다.

rocker --nvidia --x11 --privileged --network host --name <container name> osrf/ros:humble-desktop-full-jammy

하지만 위의 명령어는터미널을 끄면 사라진다는 단점을 발견하였습니다. 만약 터미널을 꺼도 해당 설치한 내용을 저장하여 다음에 그대로 이어 쓸려면 아래 것으로 바꿔서 쓰면 됩니다. docker volume 을 적용해야 저장되기 때문입니다.

rocker --nvidia --x11 --privileged --network host \ --name <container name> \ --volume /path/to/local/humble_ws:/root/humble_ws \ osrf/ros:humble-desktop-full-jammy

여기서 에는 자신이 이름을 정하면 되고, /path/to/local/humble_ws 에는 다음과 같이 치면됩니다.

저는 이름을 ros2로 짓고 /home/ubuntu/Downloads/IsaacSim-ros_workspaces/humble_ws에 경로를 두었습니다.

그러면 밑에와 같이 치면 됩니다.

rocker --nvidia --x11 --privileged --network host --name ros2 --volume /home/ubuntu/Downloads/IsaacSim-ros_workspaces/humble_ws:/root/humble_ws:rw --mode interactive osrf/ros:humble-desktop-full-jammy bash

밑에는 모두 container 이름을 ros2 로 해놓겠습니다.

만약 위와 같이 pip install rocker 를 한 환경이 아닌 새로운 가상환경을 만들어 진행하시다가 이런 오류를 만나셨다면, rocker 를 다운로드 한 곳에서 진행하시면 됩니다~

만약 성공한다면 밑부분에 이러한 메세지가 뜰 것입니다.

 
Building docker file with arguments: {'path': '/tmp/tmpa1t2wod6', 'rm': True, 'nocache': False, 'pull': False}
building > Step 1/7 : FROM nvidia/opengl:1.0-glvnd-devel-ubuntu18.04 as glvnd
building > ---> 9d806b36b807
building > Step 2/7 : FROM osrf/ros:humble-desktop-full-jammy
building > ---> 31aee196f0d6
building > Step 3/7 : USER root
building > ---> Using cache
building > ---> a4091aab6dee
building > Step 4/7 : RUN apt-get update && apt-get install -y --no-install-recommends libglvnd0 libgl1 libglx0 libegl1 libgles2 && rm -rf /var/lib/apt/lists/*
building > ---> Using cache
building > ---> 662139fd7332
building > Step 5/7 : COPY --from=glvnd /usr/share/glvnd/egl_vendor.d/10_nvidia.json /usr/share/glvnd/egl_vendor.d/10_nvidia.json
building > ---> Using cache
building > ---> 4438b5816d06
building > Step 6/7 : ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
building > ---> Using cache
building > ---> 117c77f2045c
building > Step 7/7 : ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:-all}
building > ---> Using cache
building > ---> 591fc98c0e50
building > Successfully built 591fc98c0e50
Executing command:
docker run --rm -it --name ros2 --network host --gpus all --privileged -v /home/ubuntu/IsaacSim-ros_workspaces/humble_ws:/root/humble_ws:rw -e DISPLAY -e TERM -e QT_X11_NO_MITSHM=1 -e XAUTHORITY=/tmp/.dockerw_kjotz7.xauth -v /tmp/.dockerw_kjotz7.xauth:/tmp/.dockerw_kjotz7.xauth -v /tmp/.X11-unix:/tmp/.X11-unix -v /etc/localtime:/etc/localtime:ro 591fc98c0e50 bash

그 다음 또 다른 local 터미널에서 Isaac Sim ROS workspace Repository 안에 들어있는 humble_ws 를 방금 생성한 docker container 안에 복사한다.

docker cp humble_ws <container name>:/root/humble_ws

위 명령어는 만약 docker volume 명령어 형태로 했으면 진행 안해도 됩니다.

그 후 , 새로운 local 터미널에서 다음과 같은 명령어로 지금 만든 docker를 불러옵니다.

docker exec -it ros2 bash

3. Docker 안에서 설정

이렇게 docker 를 열었으면 다음 2 가지를 설정해줘야 합니다.

3.1 fastdds.xml 파일 환경변수 설정하기

export FASTRTPS_DEFAULT_PROFILES_FILE=<path_to_ros2_ws>/fastdds.xml

만약 fastdds.xml 파일이 없는 사람들은 그 파일을 ~/.ros/ 경로 아래 fastdds.xml 라는 이름으로 하나 만들어줘야 한다. 그리고 그 파일안에 아래를 붙여넣으면 된다.

<?xml version="1.0" encoding="UTF-8" ?>

<license>Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved.

NVIDIA CORPORATION and its licensors retain all intellectual property

and proprietary rights in and to this software, related documentation

and any modifications thereto. Any use, reproduction, disclosure or

distribution of this software and related documentation without an express

license agreement from NVIDIA CORPORATION is strictly prohibited.</license>

<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles" >

<transport_descriptors>

<transport_descriptor>

<transport_id>UdpTransport</transport_id>

<type>UDPv4</type>

</transport_descriptor>

</transport_descriptors>

<participant profile_name="udp_transport_profile" is_default_profile="true">

<rtps>

<userTransports>

<transport_id>UdpTransport</transport_id>

</userTransports>

<useBuiltinTransports>false</useBuiltinTransports>

</rtps>

</participant>

</profiles>

그러나 우리는 방금 Isaac Sim ROS workspace Repository 를 클론하였고 , docker 에다가 Isaac Sim ROS workspace Repository 안에 있는 humble_ws 를 복사해왔으니 그 폴더 안에 fastdds.xml이 있을 것입니다.

경로 /root/humble_ws/ 아래에 fastdds.xml 가 있습니다.

따라서 이렇게 명령어를 치면 됩니다.

export FASTRTPS_DEFAULT_PROFILES_FILE=/root/humble_ws/fastdds.xml

3.2 Docker 안 humble_ws 에서 colcon build 하기

이제는 다음 명령어로 docker 안에서 ROS2 관련 패키지를 설치하고 ROS2 Workspace인 humble_ws 를 활성화시켜줘야 합니다.

아래 명령어를 쳐서 필요한 depencies 를 깔고, 필요한 ros2 package를 깐 뒤, workspace를 colconbuild 해야합니다.

cd /root/humble_ws apt-get update apt-get install <package name humble version>

=>

저는 여기서 navigation 을 하고 싶어서 다음 패키지를 추가로 설치하였습니다.

apt-get install ros-humble-navigation2 -y apt-get install ros-humble-nav2-bringup -y

그 후 ,

rosdep install --from-paths src --ignore-src --rosdistro=humble -y source /opt/ros/humble/setup.sh colcon build source install/local_setup.bash

4. Isaac Sim 안에서 ROS2 bridge 설정하기

그 후 Isaac SIm 앱 안에서 Window-> Extensions 에서 ROS2 bridge 를 검색한 뒤 enable 해주면 됩니다.

이렇게 하면 ros2 가 연결됩니다.

5. docker 와 Isaac Sim 연동 확인하기

이후 만약 다른 터미널에서 docker bash 쉘에 접속하고 싶으면 다음 명령을 치면 됩니다.

docker exec -it ros2 bash

ros2 는 제가 지은 container 이름입니다.

이제 제대로 ros2 가 docker 와 isaac sim 이 연결됐는지 확인해 봅시다.

확인하는 방법은 많은데 가장 간단한 방법은 turtlesim 모델이 있다면 그것을 불러와 시뮬레이션 재생 버튼을 눌러놓고 docker 에서 ros2 topic list 를 쳐서 cmd_vel 토픽이 발행되면 연결 된 것입니다.

여기서는 위의 방법에서 설정한 김에 ros2 slam 으로 테스트 해볼 것입니다

위에 3. docker 안에서 설정하기 단계에서 아래와 같은 패키지를 설치하셨다면 navigation 패키지를 ros2 로 켜서 docker 와 Isaac Sim 통신을 테스트해 볼 수 있습니다.

apt-get install ros-humble-navigation2 -y apt-get install ros-humble-nav2-bringup -y

이는 튜토리얼 Nav2 과정에서 보다 상세히 나와 있으니 이번에는 간단하게 해봅시다.

먼저 Isaac sim 에서 Isaac Examples -> ROS2 -> Navigation -> Carter Navigation 을 쳐보자

그럼 아래 사진과 같이 어떤 공장과 하나의 흰색 모바일로봇이 뜹니다.

여기서 시뮬레이션 재생 버튼을 클릭한 뒤 docker 명령창으로 가서 아래 명령어를 칩니다.

ros2 launch carter_navigation carter_navigation.launch.py

이게 성공하면 이렇게 됩니다!!

주의할 점 !

rocker 명령어로 킨 docker 는 터미널을 닫으면 그냥 터미널이 사라진다. background 에서 돌아가게 하는 non-interactive 모드가 있는 걸로 아는데 이것은 터미널과 상호작용이 안된다. (즉 , 그냥 자동 설정된 설정으로 백그라운드에서 돌아간다) 그래서 항상 터미널을 끌 때 주의해야 한다. 그러나 위의 rocker 명령어를 쳤으면 다음에 또 다시 같은 명령어를 쳤을 때 colcon build 하거나 설치한 파일은 그대로이니 안심해도 된다. 그러나 bashrc 에 alias 설정 같은 것은 유지가 안됩니다. 이럴 때는 docker commit 명령어로 image를 저장해놨다가 rocker 명령어로 불러올 때 해당 이미지를 불러오면 됩니다.

그에 대한 내용을 아래에 적어 놓았습니다.

현재 문제: 터미널을 닫으면 컨테이너 종료

rocker 명령은 기본적으로 --rm 옵션을 사용합니다.

이 옵션은 컨테이너가 종료되면 자동으로 삭제되도록 설정합니다.

따라서, 터미널을 닫으면 컨테이너가 종료되고, 내용이 삭제됩니다

만약 지금 생성한 이 ros2 docker의 터미널을 닫으면 모든 것이 다 사라집니다.

그래서 그것을 방지하는 방법에 대해서 알아보겠습니다.

docker commit으로 저장한 이미지를 rocker로 불러오고 실행하려면, rocker 명령어를 사용할 때 Docker 이미지 대신 docker commit으로 만든 이미지를 사용하면 됩니다. rocker는 Docker와 유사하게 작동하기 때문에, 이미지 이름을 지정하여 해당 이미지를 사용할 수 있습니다.

1. 커밋된 이미지를 rocker로 실행하기

docker commit을 통해 이미지를 생성한 후:

docker commit ros2 my_ros2_image:latest

이제 rocker로 이 이미지를 실행할 때, --name 옵션과 --volume 옵션을 지정하여 컨테이너를 실행할 수 있습니다:

my_ros2_image:latest: docker commit으로 만든 이미지 이름

ros2_new: 새로 만들 컨테이너 이름

--volume /home/ubuntu/IsaacSim-ros_workspaces/humble_ws:/root/humble_ws:rw: 작업 디렉토리를 컨테이너와 공유

rocker --nvidia --x11 --privileged --network host --name ros2_new --volume /home/ubuntu/IsaacSim-ros_workspaces/humble_ws:/root/humble_ws:rw --mode interactive my_ros2_image2:latest bash

위 명령어를 붙여넣기 할때는 띄어쓰기(line_space)를 조심해야 합니다

**docker 이미지 삭제하기**

docker rmi

또는

docker rmi

2. 컨테이너 재시작 및 작업 환경 복원

이미지를 rocker로 실행한 후 작업을 계속할 수 있습니다. 새로 시작된 컨테이너에서 작업한 내용은 호스트 머신의 /home/ubuntu/IsaacSim-ros_workspaces/humble_ws 디렉토리에 저장됩니다.

이후, 컴퓨터를 껐다가 켜도 docker start 명령으로 기존 컨테이너를 복원하거나, rocker를 다시 실행하여 작업을 재개할 수 있습니다.

이 방법을 통해 Docker로 작업한 이미지를 rocker 환경에서 계속 사용할 수 있습니다.

내가 저장한 이미지들은 뭐가 있는지 보려면 다음 명령어를 쳐주세요

docker images

이렇게 이라고 나온 것은 해당 docker를 build할 때 필요한 중간 이미지이니 신경쓰지 마시고 그 위에 REPOSITORY 에 나온것이 바로 저장한 docker 이미지 입니다.

728x90
반응형