센서 퓨전(Sensor Fusion) 기본 개념: 여러 센서를 합쳐 더 정확한 정보를 만드는 방법

대상: 자율주행, 로봇, 드론 등에서 센서 데이터를 통합해 인식 성능을 높이고 싶은 개발자
환경: 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로 클래스(사람/차량 등) 인식
  • 결합 방법:
    1. LiDAR 포인트를 Camera 좌표계로 변환
    2. 3D 포인트를 2D 이미지로 Project
    3. 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. 정리

센서 퓨전은 “센서의 장점을 합치고 단점을 보완”하는 기술입니다.
핵심은 다음 세 가지입니다:

  1. 시간 동기화 — 데이터를 같은 시점으로 맞춘다.
  2. 좌표 변환 — 센서 간 물리적 위치를 일치시킨다.
  3. 확률적 결합 — 불확실성을 고려해 최적 추정치를 얻는다.

이 과정을 통해 자율주행 차량은 더 정확한 위치 추정과 안정적인 인식을 수행할 수 있습니다.

댓글 남기기