대상: 자율주행, 로봇, 드론 등에서 센서 데이터를 통합해 인식 성능을 높이고 싶은 개발자
환경: ROS/ROS2 기반 센서 데이터 처리 환경 (LiDAR, Camera, IMU, GPS 등)
1. 문제/주제 요약
센서 하나만으로는 환경을 완벽하게 인식하기 어렵습니다.
예를 들어, 카메라는 거리 계산이 어렵고, LiDAR는 차선이나 색 정보를 인식하지 못합니다.
이런 이유로 자율주행 차량이나 로봇은 “센서 퓨전(Sensor Fusion)” 기법을 사용합니다.
여러 종류의 센서 데이터를 시간적·공간적으로 정렬하고, 신뢰도에 따라 결합하여
더 정확하고 안정적인 결과를 얻습니다.
2. 원인/배경 설명
각 센서는 서로 다른 장단점을 가지고 있습니다:
| 센서 | 장점 | 단점 |
|---|---|---|
| Camera | 색상, 객체 형태, 차선 인식 가능 | 조명/날씨에 약함 |
| LiDAR | 거리/형상 인식 정확 | 색상 정보 없음, 비싸고 무겁다 |
| Radar | 속도·거리 측정에 강함 | 해상도 낮음 |
| IMU | 자세·가속도 측정 | 드리프트 누적 |
| GPS | 전역 위치 측정 | 실내·도심 환경에 약함 |
센서 퓨전은 이들을 상호 보완적으로 결합합니다.
즉, LiDAR의 거리 + Camera의 객체 분류 + IMU의 움직임 + GPS의 전역 좌표를 통합해서
더 신뢰성 높은 인식 및 위치 추정을 수행하는 것입니다.
3. 센서 퓨전의 핵심 개념
센서 퓨전은 단순히 데이터를 합치는 것이 아니라,
시간 동기화, 좌표 변환, 확률적 결합이라는 세 단계를 거칩니다.
(1) 시간 동기화 (Time Synchronization)
- 모든 센서의 데이터는 동시에 들어오지 않습니다.
- 따라서 타임스탬프(
timestamp)를 기준으로 맞춰야 합니다.
ROS2 예시:
ros2 topic echo /camera/image_raw/header/stamp
ros2 topic echo /velodyne_points/header/stamp
message_filters패키지를 사용해 ApproximateTime 동기화:
from message_filters import ApproximateTimeSynchronizer, Subscriber
cam_sub = Subscriber('/camera/image_raw', Image)
lidar_sub = Subscriber('/velodyne_points', PointCloud2)
sync = ApproximateTimeSynchronizer([cam_sub, lidar_sub], queue_size=10, slop=0.05)
sync.registerCallback(callback)
(2) 좌표 변환 (Spatial Calibration)
- 센서마다 설치 위치가 다르기 때문에, 동일한 좌표계로 변환해야 합니다.
- 이를 Extrinsic Calibration (외부 파라미터) 라고 합니다.
- 변환식:
P_camera = R_lidar_to_cam * P_lidar + T_lidar_to_cam여기서R: 회전 행렬T: 이동 벡터P: 좌표 (3D point)
- 실제 ROS에서는
tf2프레임을 이용해 이 변환을 관리합니다.
예:/lidar_link → /base_link → /camera_link
(3) 확률적 결합 (Probabilistic Fusion)
서로 다른 센서의 “불확실성(uncertainty)”을 고려해 데이터를 통합합니다.
✅ 대표적인 알고리즘:
| 알고리즘 | 주요 목적 | 사용 예시 |
|---|---|---|
| Kalman Filter (KF) | 선형 상태 추정 | IMU + GPS 위치 추정 |
| Extended Kalman Filter (EKF) | 비선형 상태 추정 | 차량의 궤적 추정 |
| Unscented Kalman Filter (UKF) | 고차 비선형 시스템 | 로봇 Localization |
| Particle Filter | 다중 가설 기반 | SLAM, 자율주행 위치 추정 |
| Deep Sensor Fusion (DNN 기반) | 학습 기반 결합 | Camera + LiDAR 객체 인식 |
4. 실무 예시
(1) IMU + GPS → 차량 위치 추정 (Localization)
- IMU의 빠른 반응 + GPS의 전역 위치를 결합
- ROS2에서는
robot_localization패키지의ekf_node를 사용
ekf.yaml 예시:
frequency: 30
sensor_timeout: 0.1
two_d_mode: false
odom0: /imu/data
odom0_config: [false, false, false, true, true, true, false, false, false, false, false, false, false, false, false]
odom1: /gps/odom
odom1_config: [true, true, true, false, false, false, false, false, false, false, false, false, false, false, false]
world_frame: map
base_link_frame: base_link
(2) Camera + LiDAR → 객체 인식 (Perception)
- LiDAR로 거리/형상, Camera로 클래스(사람/차량 등) 인식
- 결합 방법:
- LiDAR 포인트를 Camera 좌표계로 변환
- 3D 포인트를 2D 이미지로 Project
- Camera의 인식 결과와 결합
Python 예시 (포인트 투영):
uv = K @ (R @ xyz_lidar + T)
u, v = uv[0]/uv[2], uv[1]/uv[2]
5. 추가 팁 / 자주 하는 실수
- 동기화 오차(time lag)가 크면 퓨전 정확도가 급격히 떨어집니다.
- **캘리브레이션 파일(tf, extrinsic)**은 주기적으로 검증해야 합니다.
- 센서 간 주파수 차이(예: Camera 30Hz, LiDAR 10Hz)는 보간(interpolation)으로 해결합니다.
- ROS2 tf 프레임 누락 시,
lookupTransform에러로 퓨전 결과가 깨질 수 있습니다.
6. 정리
센서 퓨전은 “센서의 장점을 합치고 단점을 보완”하는 기술입니다.
핵심은 다음 세 가지입니다:
- 시간 동기화 — 데이터를 같은 시점으로 맞춘다.
- 좌표 변환 — 센서 간 물리적 위치를 일치시킨다.
- 확률적 결합 — 불확실성을 고려해 최적 추정치를 얻는다.
이 과정을 통해 자율주행 차량은 더 정확한 위치 추정과 안정적인 인식을 수행할 수 있습니다.