대상: ROS 기반 로봇 시스템에 LiDAR, IMU 등 외부 센서 드라이버를 연동하려는 개발자
환경: Ubuntu 20.04 + ROS Noetic (Melodic 동일)
예시 센서: LiDAR (Velodyne / RPLIDAR 등), IMU (Microstrain / Xsens 등)
1. 문제/주제 요약
센서 하드웨어를 ROS에 붙이려면 단순히 USB를 연결하는 것 이상이 필요합니다.
보통 다음 단계에서 문제가 생깁니다 👇
- 센서 드라이버 설치는 됐는데
/scan토픽이 안 뜸 /imu/data메시지는 뜨지만 좌표계(tf)가 엉킴- launch 파일을 직접 수정해야 전체 시스템과 연결됨
이 글에서는 LiDAR / IMU 두 가지 대표 센서의 ROS 통합 패턴을 예로,
새 센서를 ROS 프로젝트에 안정적으로 붙이는 “공통 루틴”을 정리합니다.
2. 원리 / 배경 설명
ROS의 센서 통합 구조는 항상 다음 형태를 따릅니다:
[Hardware Driver Node]
│
▼
[Sensor Topic: /scan, /imu/data 등]
│
▼
[Transformation / Filtering Node]
│
▼
[SLAM / Localization / Control Node]
즉,
- 센서 제조사 또는 ROS community가 제공하는 드라이버 노드가 데이터를 퍼블리시
- 필요한 경우 frame 변환(tf), 필터링(nodelet) 을 추가
- 최종적으로 다른 노드(SLAM, EKF 등)에서 해당 토픽을 구독
LiDAR와 IMU는 대부분 이 구조로 쉽게 확장할 수 있습니다.
3. 통합 순서 (공통 루틴)
(1) 센서 드라이버 패키지 설치
예시 1️⃣: RPLIDAR
sudo apt install ros-noetic-rplidar-ros
예시 2️⃣: Microstrain IMU
sudo apt install ros-noetic-microstrain-inertial-driver
패키지 설치 후 토픽 구조 확인:
roslaunch rplidar_ros view_rplidar.launch
rostopic list
결과 예시:
/scan
/rosout
/rosout_agg
(2) 디바이스 권한 설정
LiDAR/IMU는 /dev/ttyUSB0 또는 /dev/ttyACM0 등으로 연결됩니다.
권한 문제로 연결 실패하는 경우가 많습니다.
ls -l /dev/ttyUSB*
sudo usermod -aG dialout $USER
로그아웃 후 재로그인하여 적용.
또는 udev 규칙을 설정해 장치 이름을 고정할 수 있습니다:
/etc/udev/rules.d/99-lidar.rules
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="rplidar"
적용:
sudo udevadm control --reload-rules
sudo udevadm trigger
→ /dev/rplidar 로 접근 가능
(3) launch 파일 수정 및 namespace 정리
센서 드라이버는 대부분 자체 launch 파일을 제공합니다.
하지만 프로젝트 전체에서 사용할 때는 namespace, frame 이름을 맞춰주는 게 중요합니다.
예시 (LiDAR):
<launch>
<node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen">
<param name="serial_port" value="/dev/rplidar"/>
<param name="frame_id" value="laser"/>
</node>
</launch>
예시 (IMU):
<launch>
<node name="microstrain_imu" pkg="microstrain_inertial_driver" type="microstrain_inertial_node">
<param name="port" value="/dev/ttyACM0"/>
<param name="frame_id" value="imu_link"/>
</node>
</launch>
💡 Tip:
센서마다 frame 이름이 다르므로, 나중에 TF 변환 문제를 줄이기 위해
반드시frame_id를 명시적으로 설정하세요.
(4) TF 및 좌표계 정합
LiDAR와 IMU는 대부분 로봇 바디 기준 좌표계(base_link) 와 연결되어야 합니다.
따라서 static_transform_publisher로 변환을 정의합니다.
예시:
rosrun tf static_transform_publisher 0 0 0 0 0 0 base_link laser 50
rosrun tf static_transform_publisher 0 0 0 0 0 0 base_link imu_link 50
이를 launch 파일에 포함할 수도 있습니다:
<node pkg="tf" type="static_transform_publisher" name="tf_laser"
args="0 0 0 0 0 0 base_link laser 50"/>
🎯 이렇게 해야
rviz에서 LiDAR와 IMU 데이터가 올바른 위치에 표시됩니다.
(5) 동작 테스트
1️⃣ LiDAR:
roslaunch rplidar_ros rplidar.launch
rostopic echo /scan | head
2️⃣ IMU:
roslaunch microstrain_inertial_driver microstrain.launch
rostopic echo /imu/data | head
3️⃣ 통합 시각화:
rviz
LaserScan→/scanIMU→/imu/dataTF확인 →base_link기준 정상 배치 확인
(6) 고급 통합: 필터(EKF)와 결합
LiDAR와 IMU 데이터를 통합해 위치 추정을 하려면 robot_localization 패키지를 사용합니다.
sudo apt install ros-noetic-robot-localization
ekf_localization.launch 예시:
<launch>
<node pkg="robot_localization" type="ekf_localization_node" name="ekf_filter_node">
<param name="frequency" value="30"/>
<param name="sensor_timeout" value="0.1"/>
<param name="odom_frame" value="odom"/>
<param name="base_link_frame" value="base_link"/>
<param name="world_frame" value="odom"/>
<param name="imu0" value="/imu/data"/>
<param name="imu0_config" value="[false, false, false, true, true, true, false, false, false, false, false, false, false, false, false]"/>
</node>
</launch>
→ IMU 데이터를 EKF 필터에 공급해 SLAM 또는 localization에 활용 가능.
4. 자주 하는 실수 & 해결 팁
| 문제 | 원인 | 해결 |
|---|---|---|
/scan 토픽 안 뜸 | /dev/ttyUSB0 권한 문제 | sudo usermod -aG dialout $USER |
rviz에서 LiDAR 안 보임 | frame_id 불일치 | TF 확인 (rosrun tf view_frames) |
/imu/data는 있는데 자세가 이상 | IMU 좌표계가 다름 | imu_filter_madgwick 등으로 보정 |
| EKF가 NaN 출력 | 시간 stamp mismatch | 센서 동기화(use_sim_time or ntp) |
| LiDAR/IMU 둘 다 붙였는데 RViz에서 위치가 어긋남 | TF offset 누락 | static_transform_publisher 추가 |
5. 정리
| 단계 | 내용 | 예시 |
|---|---|---|
| 1️⃣ 드라이버 설치 | 센서 전용 ROS 패키지 설치 | ros-noetic-rplidar-ros |
| 2️⃣ 권한 설정 | /dev/ttyUSB* 접근 권한 | sudo usermod -aG dialout $USER |
| 3️⃣ launch 수정 | 포트/프레임 설정 | <param name="frame_id" value="laser"/> |
| 4️⃣ TF 설정 | base_link 기준 정합 | static_transform_publisher |
| 5️⃣ rviz 시각화 | /scan, /imu/data 확인 | 센서 상태 확인 |
| 6️⃣ EKF 통합 | 로봇 위치 추정 | robot_localization 패키지 |
📌 요약
- ROS 센서 드라이버는 토픽 퍼블리셔 형태로 작동
- 포트, frame_id, TF 설정이 핵심
- LiDAR와 IMU는
robot_localization같은 필터와 쉽게 통합 가능 rviz+rqt_graph로 연결 구조를 항상 시각적으로 검증