자율주행

🛰️ Day 30: 센서 융합 종합 프로젝트 (ROS2 기반)

Tech Knowledge Note 2025. 9. 26. 21:00
반응형

안녕하세요! ✨
앞서 우리는 개별 센서들의 원리와 Python/ROS2 실습을 통해 센서 융합 단계를 하나씩 배워왔습니다.
오늘은 이를 종합해, ROS2 기반 센서 융합 프로젝트를 설계하고 구현하는 방법을 정리해보겠습니다.

센서 융합 종합 프로젝트 (ROS2 기반)


🔍 프로젝트 목표

  • LiDAR, Camera, Radar, IMU 데이터를 ROS2에서 동시에 구독
  • EKF 기반 센서 융합으로 차량의 위치, 속도, 객체를 추정
  • RViz2에서 통합된 결과를 시각화

👉 실제 자율주행 소프트웨어 스택의 축소판 프로젝트로 이해하면 됩니다.


⚙️ ROS2 프로젝트 구조

css
 
sensor_fusion_ws/
 └── src/
      ├── lidar_node/
      ├── camera_node/
      ├── radar_node/
      ├── imu_node/
      └── fusion_node/   ← EKF/Particle Filter 기반 융합 처리
  • lidar_node: LiDAR 점군 데이터 퍼블리시
  • camera_node: 카메라 이미지 토픽 퍼블리시
  • radar_node: Radar 객체 검출 데이터 퍼블리시
  • imu_node: IMU 가속도·자이로 데이터 퍼블리시
  • fusion_node: 위 모든 데이터를 EKF/Particle Filter로 결합

🧑‍💻 Fusion Node 예제 코드 (단순 구조)

python
 
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import PointCloud2, Imu, Image
from custom_msgs.msg import RadarObject, FusedOutput

class FusionNode(Node):
    def __init__(self):
        super().__init__('fusion_node')
        self.sub_lidar = self.create_subscription(PointCloud2, '/lidar_points', self.lidar_callback, 10)
        self.sub_camera = self.create_subscription(Image, '/camera_image', self.camera_callback, 10)
        self.sub_radar = self.create_subscription(RadarObject, '/radar_points', self.radar_callback, 10)
        self.sub_imu = self.create_subscription(Imu, '/imu_data', self.imu_callback, 10)
        self.pub_fused = self.create_publisher(FusedOutput, '/fused_output', 10)

        self.lidar_data, self.camera_data, self.radar_data, self.imu_data = None, None, None, None

    def lidar_callback(self, msg): self.lidar_data = msg; self.fuse()
    def camera_callback(self, msg): self.camera_data = msg; self.fuse()
    def radar_callback(self, msg): self.radar_data = msg; self.fuse()
    def imu_callback(self, msg): self.imu_data = msg; self.fuse()

    def fuse(self):
        if self.lidar_data and self.camera_data and self.radar_data and self.imu_data:
            fused_msg = FusedOutput()
            fused_msg.header.stamp = self.get_clock().now().to_msg()
            fused_msg.status = "Fused sensor data output"
            self.pub_fused.publish(fused_msg)
            self.get_logger().info("Published fused sensor data")

def main(args=None):
    rclpy.init(args=args)
    node = FusionNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

👉 실제 구현에서는 센서 간 시간 동기화(Time Synchronization)EKF/Particle Filter 적용이 필요합니다.


📊 RViz2 시각화

  • /lidar_points → 3D 점군
  • /camera_image → 영상 스트리밍
  • /radar_points → 속도 + 거리 정보
  • /imu_data → 차량 자세/회전 정보
  • /fused_output → 최종 통합 상태 추정

🚘 자율주행 응용

  • 고속 주행 안정성: LiDAR 거리 + Radar 속도 + IMU 자세 → 정밀한 추정
  • 객체 인식: Camera 분류 결과 + LiDAR 점군 위치 → 정확도 향상
  • 악천후 대응: Radar로 안정성 확보, LiDAR/Camera로 세부 인식 보완

📌 정리

  • 센서 융합 종합 프로젝트는 지금까지 배운 기술을 총망라
  • ROS2 워크스페이스 기반으로 LiDAR, Camera, Radar, IMU 데이터를 통합
  • EKF/Particle Filter로 융합하면 실제 자율주행 소프트웨어와 유사한 구조를 실습할 수 있음
반응형

🚀 다음 글 예고

다음 글에서는 [Day 31: SLAM 개념, 문제 정의 (Localization + Mapping)] 을 다룹니다.
자율주행의 핵심인 동시적 위치추정 및 지도 작성 개념과 문제 정의를 정리하겠습니다.


✅ 오늘 글이 도움이 되셨다면 좋아요와 공유 부탁드립니다.


반응형