반응형
안녕하세요! ✨
앞서 우리는 개별 센서들의 원리와 Python/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 기반 융합 처리
└── 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()
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)] 을 다룹니다.
자율주행의 핵심인 동시적 위치추정 및 지도 작성 개념과 문제 정의를 정리하겠습니다.
✅ 오늘 글이 도움이 되셨다면 좋아요와 공유 부탁드립니다.
반응형
'자율주행' 카테고리의 다른 글
Day 32: EKF-SLAM 수학적 원리 학습 (0) | 2025.09.28 |
---|---|
Day 31: SLAM 개념, 문제 정의 (Localization + Mapping) (0) | 2025.09.27 |
📡 Day 29: Radar + LiDAR 융합 실습 (0) | 2025.09.25 |
📷 Day 28: LiDAR + Camera 융합 (Feature matching) (0) | 2025.09.24 |
🎯 Day 27: Particle Filter 구현 실습 (0) | 2025.09.23 |