반응형
안녕하세요! ✨
앞서 Day 28에서는 LiDAR + Camera 융합 (Feature Matching) 을 다뤘습니다.
오늘은 또 다른 조합인 Radar + LiDAR 융합을 실습해보겠습니다.
🔍 Radar + LiDAR 융합의 필요성
- Radar
- 장점: 속도 추정(Doppler 효과), 악천후(비, 안개)에도 안정적
- 단점: 해상도가 낮아 물체의 모양·위치 정밀도가 부족
- LiDAR
- 장점: 고해상도 3D 점군 데이터, 정밀한 거리·위치 정보 제공
- 단점: 악천후 환경에 약함, 속도 측정 기능 부족
👉 따라서 두 센서를 융합하면:
- Radar → 속도 및 강인성 제공
- LiDAR → 위치 및 형상 정확도 보완
⚙️ ROS2 기반 융합 흐름
- Radar 노드 → /radar_points 퍼블리시
- LiDAR 노드 → /lidar_points 퍼블리시
- Fusion 노드 → 두 데이터를 결합하여 /fused_objects 퍼블리시
🧑💻 Python Fusion 노드 예제
python
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import PointCloud2
from custom_msgs.msg import RadarObject, FusedObjectArray
class RadarLidarFusion(Node):
def __init__(self):
super().__init__('radar_lidar_fusion')
self.sub_radar = self.create_subscription(RadarObject, '/radar_points', self.radar_callback, 10)
self.sub_lidar = self.create_subscription(PointCloud2, '/lidar_points', self.lidar_callback, 10)
self.pub_fused = self.create_publisher(FusedObjectArray, '/fused_objects', 10)
self.radar_data = None
self.lidar_data = None
def radar_callback(self, msg):
self.radar_data = msg
self.fuse_data()
def lidar_callback(self, msg):
self.lidar_data = msg
self.fuse_data()
def fuse_data(self):
if self.radar_data and self.lidar_data:
fused_msg = FusedObjectArray()
fused_msg.header.stamp = self.get_clock().now().to_msg()
# 단순화된 예제: 실제는 최근접 매칭 + EKF 추정 필요
self.pub_fused.publish(fused_msg)
self.get_logger().info("Radar + LiDAR Fused Objects published!")
def main(args=None):
rclpy.init(args=args)
node = RadarLidarFusion()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
from rclpy.node import Node
from sensor_msgs.msg import PointCloud2
from custom_msgs.msg import RadarObject, FusedObjectArray
class RadarLidarFusion(Node):
def __init__(self):
super().__init__('radar_lidar_fusion')
self.sub_radar = self.create_subscription(RadarObject, '/radar_points', self.radar_callback, 10)
self.sub_lidar = self.create_subscription(PointCloud2, '/lidar_points', self.lidar_callback, 10)
self.pub_fused = self.create_publisher(FusedObjectArray, '/fused_objects', 10)
self.radar_data = None
self.lidar_data = None
def radar_callback(self, msg):
self.radar_data = msg
self.fuse_data()
def lidar_callback(self, msg):
self.lidar_data = msg
self.fuse_data()
def fuse_data(self):
if self.radar_data and self.lidar_data:
fused_msg = FusedObjectArray()
fused_msg.header.stamp = self.get_clock().now().to_msg()
# 단순화된 예제: 실제는 최근접 매칭 + EKF 추정 필요
self.pub_fused.publish(fused_msg)
self.get_logger().info("Radar + LiDAR Fused Objects published!")
def main(args=None):
rclpy.init(args=args)
node = RadarLidarFusion()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
👉 실제 구현에서는 최근접 탐색(Nearest Neighbor) 또는 칼만필터(EKF) 기반 추정을 통해 Radar 속도 + LiDAR 위치를 결합해야 합니다.
📊 RViz2에서 확인
- /radar_points : Radar 검출 물체 (속도 포함)
- /lidar_points : LiDAR 점군 데이터
- /fused_objects : 융합된 물체 추정 (위치 + 속도 포함)
🚘 자율주행 활용
- 차량 및 보행자 추적: 속도 + 위치 동시 추정
- 악천후 환경 대응: Radar의 강인성과 LiDAR의 정밀도를 동시에 활용
- ADAS 시스템: 긴급 제동, 차간 거리 유지, 추돌 방지 기능 개선
📌 정리
- Radar와 LiDAR는 서로 보완적인 센서
- ROS2 기반으로 데이터 융합 시 더욱 정확하고 안정적인 인식 가능
- 실제 구현에서는 센서 캘리브레이션 + 추정 알고리즘이 핵심
반응형
🚀 다음 글 예고
다음 글에서는 [Day 30: 센서 융합 종합 프로젝트 (ROS2 기반)] 을 다룹니다.
앞서 학습한 LiDAR, Camera, Radar, IMU 센서를 종합적으로 융합해 하나의 프로젝트로 구현해보겠습니다.
✅ 오늘 글이 도움이 되셨다면 좋아요와 공유 부탁드립니다.
반응형
'자율주행' 카테고리의 다른 글
Day 31: SLAM 개념, 문제 정의 (Localization + Mapping) (0) | 2025.09.27 |
---|---|
🛰️ Day 30: 센서 융합 종합 프로젝트 (ROS2 기반) (0) | 2025.09.26 |
📷 Day 28: LiDAR + Camera 융합 (Feature matching) (0) | 2025.09.24 |
🎯 Day 27: Particle Filter 구현 실습 (0) | 2025.09.23 |
🎯 Day 26: Particle Filter 개념 학습 (0) | 2025.09.22 |