센서 드라이버 패키지 붙이기: Lidar / IMU 예제로 보는 일반적인 ROS 통합 패턴

대상: 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/scan
  • IMU/imu/data
  • TF 확인 → 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로 연결 구조를 항상 시각적으로 검증

댓글 남기기