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 하드웨어와 정상 연동함을 확인하였다.