LiMO 1에서 docker를 활용하여 ros2 구동

1. 테스트 개요

Jetson Nano가 장착된 LIMO 1은 Ubuntu 18.04 + ROS1 환경으로 구성되어 있어 ROS2를 네이티브로 설치할 수 없다. 이를 해결하기 위해 Docker를 활용하여 ROS2 Humble 환경을 컨테이너로 구성하고, LIMO 하드웨어와의 연동 가능성을 검증하는 테스트를 수행하였다.

항목 내용
테스트 보드 Jetson Nano (JetPack R32.6.1)
호스트 OS Ubuntu 18.04 (Bionic)
호스트 ROS ROS1 Melodic
Docker Image dustynv/ros:humble-ros-base-l4t-r32.7.1
컨테이너 ROS ROS2 Humble
테스트 로봇 LIMO 1
시리얼 포트 /dev/ttyTHS1
Docker 버전 20.10.21
저장소 용량 30G 중 17G 사용 (여유 12G)

2. 환경 구성

2-1. Docker 설치 확인 및 권한 설정

먼저 Docker 설치 여부를 확인한다.

bash

docker --version

설치되어 있지 않을 경우 아래와 같이 설치한다.

bash

sudo apt update
sudo apt install docker.io -y
sudo systemctl enable docker
sudo systemctl start docker

설치 후 sudo 없이 사용하려면 사용자를 docker 그룹에 추가해야 한다.

bash

sudo usermod -aG docker $USER

실행 후 재로그인 필요. 적용 확인:

bash

groups   # 목록에 docker 포함 여부 확인

2-2. nvidia runtime 확인

GPU 사용을 위해 nvidia runtime이 등록되어 있어야 한다.

bash

docker info | grep -i runtime

출력에 nvidia가 포함되어 있으면 정상이다. 없을 경우 아래와 같이 설치한다.

bash

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
wget -qO - https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
wget -qO - https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

2-3. ros2_ws 작업 폴더 생성

컨테이너와 호스트 간 파일을 공유할 작업 폴더를 미리 생성해둔다. 컨테이너가 종료되어도 이 폴더의 내용은 호스트에 그대로 유지된다.

bash

mkdir -p ~/ros2_ws/src

2-4. ROS2 Docker Image 선택 및 다운로드

Jetson Nano의 JetPack 버전을 먼저 확인한다.

bash

cat /etc/nv_tegra_release

Jetson Nano의 JetPack 버전은 R32.6.1이며, DockerHub에서 사용 가능한 가장 근접한 버전인 r32.7.1 이미지를 사용하였다. (마이너 버전 차이로 정상 동작 확인)

사용 가능한 이미지 태그 확인:

bash

wget -qO- "https://registry.hub.docker.com/v2/repositories/dustynv/ros/tags?page_size=100" | python3 -m json.tool | grep "r32"

이미지 다운로드:

bash

docker pull dustynv/ros:humble-ros-base-l4t-r32.7.1

3. 컨테이너 실행

3-1. 실행 명령어

아래 명령어로 ROS2 컨테이너를 실행한다. 호스트의 ros2_ws 폴더를 컨테이너 안에 마운트하여 작업 내용이 유지되도록 구성하였다.

bash

docker run -it --rm \
  --runtime nvidia \
  --network host \
  --privileged \
  -v /dev:/dev \
  -v ~/ros2_ws:/ros2_ws \
  -e ROS_DOMAIN_ID=16 \
  dustynv/ros:humble-ros-base-l4t-r32.7.1 bash
옵션 역할
--runtime nvidia GPU 사용 허용
--network host 호스트 네트워크 그대로 사용 (ROS2 DDS 통신에 필수)
--privileged 하드웨어 장치 접근 허용
-v /dev:/dev 시리얼 포트 등 장치 연결
-v ~/ros2_ws:/ros2_ws 호스트 작업 폴더 마운트 (컨테이너 종료 후에도 파일 유지)
-e ROS_DOMAIN_ID=16 ROS2 도메인 ID 설정

3-2. 추가 터미널 접속

컨테이너가 실행 중인 상태에서 새 터미널을 열어 접속하려면:

bash

docker exec -it $(docker ps -q) bash
source /ros_entrypoint.sh

4. limo_ros2 패키지 빌드

4-1. 패키지 구성

Orin Nano(ROS2 정상 동작 환경)에서 사용 중인 limo_ros2 패키지를 압축하여 Jetson Nano로 이전하였다. 패키지는 ~/ros2_ws/src/ 경로에 위치시킨다.

4-2. 의존성 패키지 추가

limo_base 패키지가 ackermann_msgs에 의존하고 있으나, Ubuntu 18.04 컨테이너 환경에서는 apt로 설치가 불가하여 소스로 직접 추가하였다.

bash

cd /ros2_ws/src
git clone https://github.com/ros-drivers/ackermann_msgs.git -b ros2

4-3. 빌드

bash

cd /ros2_ws
source install/setup.bash
colcon build

5. LIMO 하드웨어 연동 테스트

5-1. 시리얼 포트 확인

ROS1 launch 파일과 비교하여 LIMO가 연결된 시리얼 포트를 확인하였다. Jetson Nano에서 LIMO는 ttyTHS1 포트를 사용한다.

bash

# ROS1 launch 파일에서 포트 확인
roslaunch limo_base limo_base.launch   # port_name: ttyTHS1 확인

5-2. limo_base 노드 실행

bash

source /ros2_ws/install/setup.bash
ros2 launch limo_base limo_base.launch.py

5-3. cmd_vel 명령 전송 및 동작 확인

bash

ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "linear:
  x: 0.5
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0" -r 10

로봇이 정상적으로 전진하는 것을 확인하였다. odom, imu, limo_status 등 주요 토픽도 정상 발행됨을 확인하였다.

토픽 타입 상태
/cmd_vel geometry_msgs/msg/Twist 정상 수신
/odom nav_msgs/msg/Odometry 정상 발행
/imu sensor_msgs/msg/Imu 정상 발행
/limo_status limo_msgs/msg/LimoStatus 정상 발행
/tf tf2_msgs/msg/TFMessage 정상 발행

6. 주의사항

항목 내용
컨테이너 종료 시 데이터 손실 -v 옵션으로 마운트한 폴더 외의 컨테이너 내부 변경사항은 종료 시 전부 사라짐. 작업은 반드시 /ros2_ws 안에서 수행해야 함
재부팅 시 docker 그룹 권한 재부팅 후에도 권한은 유지되지만 적용이 안 될 경우 재로그인 필요
ROS_DOMAIN_ID 설정 컨테이너 실행 시 -e ROS_DOMAIN_ID=16 옵션이 빠지면 외부 노드와 통신 불가
ROS1과 동시 실행 주의 호스트에서 ROS1 노드가 시리얼 포트를 점유하고 있으면 컨테이너에서 접근 불가. limo_base 실행 전 ROS1 노드 종료 필요
JetPack 버전과 Image 버전 매칭 버전 차이가 크면 컨테이너가 정상 동작 안 할 수 있음. 현재 R32.6.1 보드에 R32.7.1 이미지 사용 중 (마이너 버전 차이로 정상 동작 확인)

7. 결론

Jetson Nano + Ubuntu 18.04 환경에서 Docker를 활용하여 ROS2 Humble 환경을 성공적으로 구성하였다. limo_ros2 패키지를 컨테이너 내에서 빌드하고 ttyTHS1 시리얼 포트를 통해 LIMO 하드웨어와 정상 연동함을 확인하였다.

limo_ros2 패키지는 limo_ros2 패키지 링크 접속 후 테스트해보실 수 있습니다.