반응형
안녕하세요! ✨
앞서 Day 19에서는 Kalman Filter를 활용한 센서 퓨전 개념을 소개했습니다.
오늘은 ROS2 환경에서 LiDAR와 Camera 센서를 융합하는 간단한 실습을 진행해보겠습니다.
🔍 센서 융합 실습 개요
자율주행차는 하나의 센서만 사용하지 않고, 여러 센서 데이터를 동시에 받아들여 융합합니다.
ROS2에서는 이 과정을 노드(Node)와 토픽(Topic)을 통해 구현할 수 있습니다.
- LiDAR → 장애물의 3D 위치 정보
- Camera → 시각적 객체 인식 정보
- 융합 → Camera가 인식한 객체를 LiDAR의 거리 정보와 결합해 더 정확한 결과 생성
⚙️ ROS2 센서 융합 흐름도
- LiDAR 노드 → /lidar_points 토픽 퍼블리시
- Camera 노드 → /camera_detections 토픽 퍼블리시
- Fusion 노드 → 두 데이터를 구독(Subscribe) 후 융합 → /fusion_result 퍼블리시
🧑💻 ROS2 Fusion 노드 예제 (Python)
python
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import PointCloud2, Image
from std_msgs.msg import String
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_detections', self.camera_callback, 10)
self.publisher_ = self.create_publisher(String, '/fusion_result', 10)
self.lidar_data = None
self.camera_data = None
def lidar_callback(self, msg):
self.lidar_data = msg
self.fuse_data()
def camera_callback(self, msg):
self.camera_data = msg
self.fuse_data()
def fuse_data(self):
if self.lidar_data and self.camera_data:
result = "Fusion: Camera + LiDAR data combined"
self.publisher_.publish(String(data=result))
self.get_logger().info(result)
def main(args=None):
rclpy.init(args=args)
node = FusionNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
from rclpy.node import Node
from sensor_msgs.msg import PointCloud2, Image
from std_msgs.msg import String
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_detections', self.camera_callback, 10)
self.publisher_ = self.create_publisher(String, '/fusion_result', 10)
self.lidar_data = None
self.camera_data = None
def lidar_callback(self, msg):
self.lidar_data = msg
self.fuse_data()
def camera_callback(self, msg):
self.camera_data = msg
self.fuse_data()
def fuse_data(self):
if self.lidar_data and self.camera_data:
result = "Fusion: Camera + LiDAR data combined"
self.publisher_.publish(String(data=result))
self.get_logger().info(result)
def main(args=None):
rclpy.init(args=args)
node = FusionNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
👉 위 예시는 단순히 Camera와 LiDAR 데이터를 동시에 받으면 문자열로 “Fusion 완료” 를 퍼블리시하는 코드입니다.
실제 프로젝트에서는 객체 인식 좌표(Camera)와 거리 정보(LiDAR) 를 매칭하는 로직이 들어갑니다.
📊 RViz2에서 결과 확인
- /lidar_points 와 /camera_detections 를 동시에 시각화
- /fusion_result 토픽을 출력해 융합 상태 확인
🚘 응용 포인트
- 보행자 인식 강화: Camera 객체 인식 + LiDAR 거리 정보
- 차량 추적: Camera 차종 분류 + Radar 속도 정보
- 주차 보조: 초음파 센서 + Camera 결합
👉 센서 융합은 자율주행의 정확성과 안전성을 높이는 핵심 기술입니다.
📌 정리
- ROS2에서 여러 센서를 구독하고 하나의 노드에서 융합 가능
- Python 코드로 Fusion 노드 구현 → /fusion_result 퍼블리시
- 실제 응용에서는 Camera 좌표와 LiDAR 거리 정보를 매칭해 활용
🚀 다음 글 예고
다음 글에서는 [Day 21: 기본 칼만필터 (선형 KF 수학적 유도)] 를 다룹니다.
Kalman Filter의 수학적 원리를 단계별로 유도하면서, 센서 융합에 어떻게 적용되는지 정리해드리겠습니다.
✅ 오늘 글이 도움이 되셨다면 좋아요와 공유 부탁드립니다.
반응형
'자율주행' 카테고리의 다른 글
📐 Day 21: 기본 칼만필터 (선형 KF 수학적 유도) (0) | 2025.09.17 |
---|---|
🔄 Day 19: 센서 퓨전 개념 (Kalman Filter 소개) (0) | 2025.09.15 |
🔎 Day 18: 센서별 장단점 정리 (LiDAR vs Camera vs Radar) (0) | 2025.09.14 |
📡 Day 17: 초음파 센서 ROS2 연동 (0) | 2025.09.13 |
📡 Day 16: 초음파 센서 원리 및 주차 보조 사례 (0) | 2025.09.12 |