TIKI-MINI로 시작하는 ROS2 실무
목차

4. 실기기 연동

4.3로봇 환경 둘러보기

4.2장에서 로봇에 로그인했습니다. TIKI-MINI의 로봇 컴퓨터에는 Ubuntu 22.04와 ROS2 Humble, TIKI-MINI 패키지가 이미 설치되어 있어서 따로 설치하거나 빌드할 것이 없습니다. 이 장은 무엇이 어디에 갖춰져 있는지 확인하고, 4.4장에서 로봇을 켜기 전에 알아 둘 구성을 정리합니다.

로봇에 갖춰진 것

항목확인 명령기대 결과
Ubuntu 22.04lsb_release -aCodename jammy
CPU 아키텍처uname -maarch64
ROS2 Humbleprintenv ROS_DISTROhumble
워크스페이스ls ~/ros2_ws/srctiki_base, tiki_description, tiki_control, tiki_bringup
패키지 인식ros2 pkg list | grep tiki위 패키지 이름이 보임
시리얼 장치ls -l /dev/ttyAMA1 /dev/ttyUSB0두 파일이 보임
권한groupsdialout이 포함됨

로봇의 ~/.bashrc에는 ROS 환경과 워크스페이스 setup을 source하는 줄이 들어 있어서, ssh로 접속하면 바로 ros2 명령과 tiki_* 패키지를 쓸 수 있습니다. 로봇에서는 파이썬 노드도 실행됩니다.

로봇의 패키지와 VM의 패키지

패키지 여섯 개는 두 컴퓨터에 나뉘어 있습니다. 로봇의 ~/ros2_ws/src에는 구동에 필요한 네 개가, OVA의 VM에는 지도 작성과 내비게이션을 맡는 두 개가 설치되어 있습니다(3.11장).

로봇 ~/ros2_ws/src/
  tiki_description/   로봇 모델(URDF)과 robot_state_publisher 런치
  tiki_base/          시리얼로 모터 컨트롤러와 통신하는 하드웨어 플러그인(C++)
  tiki_control/       ros2_control 설정과 컨트롤러 런치
  tiki_bringup/       description, control, LiDAR를 묶는 런치

VM(OVA) ~/ros2_ws/src/
  tiki_slam/          slam_toolbox 설정 (4.7장)
  tiki_navigation/    Nav2 설정 (4.7장)

4.4장의 기본 구동은 로봇의 네 패키지로 하고, 4.7장의 SLAM과 Nav2는 VM에서 실행합니다. tiki.launch.py는 이 네 패키지의 런치를 묶어 한 번에 시작합니다. LiDAR 드라이버(rplidar_ros)와 ros2_control 컨트롤러도 로봇에 갖춰져 있습니다.

시리얼 장치와 권한

모터 컨트롤러는 /dev/ttyAMA1, LiDAR는 /dev/ttyUSB0로 연결됩니다. 두 경로는 소스에 적혀 있습니다(diffdrive_tiki.cpp와 tiki.launch.py). 장치 파일이 있는지 봅니다.

ls -l /dev/ttyAMA1 /dev/ttyUSB0

출력은 대개 crw-rw---- 1 root dialout ... 같은 모양입니다. 소유 그룹이 dialout이고 그 그룹에게 읽기와 쓰기 권한이 있다는 뜻입니다. 로봇 계정이 이 그룹에 속해 있어야 프로그램이 포트를 열 수 있고, groups로 확인합니다.

  • /dev/ttyUSB0이 보이지 않는 경우: LiDAR의 USB 연결을 확인하고 dmesg | tail에서 USB 시리얼 장치가 인식됐는지 봅니다.
  • 다른 프로세스가 포트를 잡고 있는 경우: sudo fuser -v /dev/ttyAMA1로 확인합니다. 이전에 켠 launch가 아직 살아 있는 일이 가장 흔합니다.

USB 이름이 바뀔 때

/dev/ttyUSB0은 USB 장치가 인식된 순서로 붙는 이름입니다. 다른 USB 시리얼 장치를 같이 꽂거나 뽑았다 꽂으면 ttyUSB1로 바뀔 수 있습니다. 실제 이름은 이렇게 확인합니다.

ls /dev/ttyUSB*
ls -l /dev/serial/by-id/

by-id 아래의 심볼릭 링크는 장치의 고유 식별 정보로 만들어져 이름이 유지됩니다. 다만 tiki.launch.py는 /dev/ttyUSB0을 코드에 고정해서 rplidar.launch.py에 넘기므로 ros2 launch의 인자로는 바꿀 수 없습니다. LiDAR 경로가 달라졌다면 include_rplidar:=false로 시작하고 LiDAR만 따로 실행합니다.

ros2 launch tiki_bringup rplidar.launch.py serial_port:=/dev/serial/by-id/<장치 이름>
LiDAR 포트를 넘기는 두 경로기본: tiki.launch.py 하나로 실행tiki.launch.py3초 뒤 포함rplidar.launch.pyserial_port 인자rplidar_node/scan/dev/ttyUSB0 고정포트 이름을 바꿀 때: 둘로 나눠 실행tiki.launch.pyinclude_rplidar:=falseLiDAR 없이 description과 control만 시작rplidar.launch.pyserial_port:=by-id 경로rplidar_node/scan/dev/serial/by-id/<장치 이름>
tiki.launch.py는 LiDAR 포트를 /dev/ttyUSB0으로 고정해 넘깁니다. 다른 경로를 쓰려면 include_rplidar:=false로 나머지를 띄우고 rplidar.launch.py를 따로 실행합니다.

모터 컨트롤러 포트 /dev/ttyAMA1은 플러그인 소스에 고정되어 있습니다.

플러그인이 등록됐는지 확인

tiki_base는 노드를 만들지 않고 컨트롤러 매니저가 읽어 들이는 플러그인 라이브러리를 만듭니다. 이 플러그인이 URDF에서 라이브러리까지 이어지는 길은 다음과 같습니다.

  • diffdrive_tiki라는 공유 라이브러리가 lib에 설치되어 있습니다.
  • 최상위 CMakeLists.txt의 pluginlib_export_plugin_description_file(hardware_interface tiki_hw.xml)이 플러그인 기술 파일을 등록합니다.
  • tiki_hw.xml은 라이브러리 diffdrive_tiki, 클래스 이름 tiki_base/DiffDriveTiki(C++ 형식 tiki_base::DiffDriveTiki), 기반 클래스 hardware_interface::SystemInterface를 선언합니다.
  • URDF의 ros2_control 블록에서 <plugin>tiki_base/DiffDriveTiki</plugin>으로 이 이름을 참조합니다.
DiffDriveTiki 플러그인을 찾는 길URDF ros2_control<plugin>tiki_base/DiffDriveTikicontroller_manager클래스 이름으로플러그인을 찾아 로드tiki_hw.xmlclass tiki_base/DiffDriveTikilibrary diffdrive_tiki기반 SystemInterface최상위 CMakeLists.txtpluginlib_export_plugin_description_file등록libdiffdrive_tiki.soinstall/tiki_base/libsrc/CMakeLists.txt가 빌드라이브러리 이름
URDF에 적힌 클래스 이름이 tiki_hw.xml을 거쳐 libdiffdrive_tiki.so로 이어집니다. tiki_hw.xml은 최상위 CMakeLists.txt가 pluginlib에 등록합니다.

파일로 확인합니다.

ros2 pkg prefix tiki_base
ls $(ros2 pkg prefix tiki_base)/lib/libdiffdrive_tiki.so
ldd $(ros2 pkg prefix tiki_base)/lib/libdiffdrive_tiki.so | grep -i serial

첫 줄이 설치 위치를 출력하고 둘째 줄이 라이브러리 파일을 보여 주며, 셋째 줄에서 libserial이 not found 없이 경로로 나오면 연결도 정상입니다. ros2 pkg prefix가 오류를 내면 새 터미널이 아니거나 source ~/ros2_ws/install/setup.bash가 적용되지 않은 것입니다.

실제로 띄워 보면 가장 확실합니다. 4.4장에서 launch를 실행한 뒤 다른 터미널에서 아래를 입력합니다.

ros2 control list_hardware_components

출력에서 plugin name: tiki_base/DiffDriveTiki와 state: id=3 label=active가 보이면 플러그인이 로드되어 활성화된 것입니다.

런치 인자는 로봇을 켜지 않고도 볼 수 있습니다.

ros2 launch tiki_bringup tiki.launch.py --show-args

include_rplidar 인자와 설명이 출력되면 런치 파일이 설치되고 환경이 정상이라는 뜻입니다.

시작할 때

tiki.launch.py는 로봇이 켜질 때 자동으로 실행되지 않습니다. 필요할 때마다 ssh로 접속해 직접 실행합니다(4.4장). 로봇이 혼자 움직이기 시작하지 않으니 전원을 켠 뒤에는 안심하고 접속해 환경부터 확인하면 됩니다.

한눈에 정리

  1. 로봇에는 Ubuntu 22.04, ROS2 Humble, 로봇 쪽 패키지 네 개(tiki_description, tiki_base, tiki_control, tiki_bringup)가 이미 설치되어 있다. 설치나 빌드는 필요 없고 명령으로 하나씩 확인한다.
  2. 지도 작성과 내비게이션 패키지(tiki_slam, tiki_navigation)는 VM에 있다.
  3. /dev/ttyAMA1과 /dev/ttyUSB0을 ls -l로 보고, 계정이 dialout 그룹에 속해 있는지 groups로 본다.
  4. USB 장치 이름은 바뀔 수 있다. ls /dev/serial/by-id/로 확인하고, tiki.launch.py는 LiDAR 포트를 고정하므로 include_rplidar:=false와 rplidar.launch.py를 따로 쓴다.
  5. 플러그인은 tiki_hw.xml과 pluginlib_export_plugin_description_file로 등록되고, 실행 뒤 ros2 control list_hardware_components로 확인한다.
  6. tiki.launch.py는 자동으로 시작되지 않는다. 필요할 때 직접 실행한다.

확인 문제

Q1. ssh로 접속한 로봇에서 ros2 pkg list | grep tiki가 아무것도 출력하지 않습니다. 가장 먼저 확인할 것은?

printenv ROS_DISTRO가 humble인지, 그리고 ~/.bashrc가 적용된 새 터미널인지 확인합니다. 환경이 적용되지 않았으면 source ~/.bashrc를 실행한 뒤 다시 확인합니다.

Q2. 어제는 되던 LiDAR가 오늘은 /dev/ttyUSB0이 없다고 나옵니다. LiDAR는 꽂혀 있습니다. 어떤 일이 일어났을 수 있고 어떻게 확인합니까?

다른 USB 시리얼 장치와 같이 꽂으면서 순서가 바뀌어 ttyUSB1로 인식됐을 수 있습니다. ls /dev/ttyUSB*와 ls -l /dev/serial/by-id/로 실제 이름을 확인하고, 경로가 달라졌다면 include_rplidar:=false로 시작한 뒤 rplidar.launch.py serial_port:=...로 LiDAR를 따로 실행합니다.

Q3. URDF의 ros2_control 블록에 적힌 플러그인 이름 tiki_base/DiffDriveTiki는 어떤 파일들을 거쳐 실제 라이브러리 파일로 이어집니까?

tiki_hw.xml의 class name과 같은 문자열을 찾아, 그 파일이 선언한 라이브러리 diffdrive_tiki(libdiffdrive_tiki.so)를 불러옵니다. tiki_hw.xml은 최상위 CMakeLists.txt의 pluginlib_export_plugin_description_file로 등록됩니다. 이름이 한 글자라도 다르면 실행할 때 플러그인을 찾지 못합니다.

다음 장

4.4장에서는 ros2 launch tiki_bringup tiki.launch.py를 실제로 실행하고 노드, 토픽, 컨트롤러를 확인한 뒤 낮은 속도로 로봇을 움직입니다. 시작 전에 4.1장의 점검표를 다시 열고 로봇을 바닥(또는 바퀴를 띄운 받침대)에 놓으세요.