일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- differentiablerendering
- vectorfields
- gaussiansplatting
- turtlebot
- 3dmapping
- turtlebot3
- rospackages
- raspberrypi
- 3dgaussiansplatting
- realtimerendering
- covariancematrix
- rosnoetic
- alphablending
- ComputerVision
- adaptivedensitycontrol
- tilebasedrasterizer
- vectorcalculus
- NERF
- sensorfusion
- catkinworkspace
- Slam
- usbcamera
- imageprocessing
- electromagnetism
- rostopics
- LIDAR
- pointcloud
- opencv
- Ros
- roslaunch
- Today
- Total
Wiredwisdom
FUSION Code review 본문
def __init__(self):
rospy.init_node('camera_lidar_fusion', anonymous=True)
# Initialize subscribers and publishers
self.bridge = CvBridge()
self.image_sub = rospy.Subscriber("/camera/image_raw", Image, self.image_callback)
self.pc_sub = rospy.Subscriber("/camera/depth/points", PointCloud2, self.pc_callback)
self.fusion_pub = rospy.Publisher("/fusion_image", Image, queue_size=10)
# Initialize variables to store the data
self.image_data = None
self.pc_data = None
rospy.init_node('camera_lidar_fusion', anonymous=True)
rospy.init_node는 ROS 노드를 초기화하는 함수
'camera_lidar_fusion'은 이 노드의 이름을 정의
anonymous=True는 고유한 이름을 자동으로 생성하여 노드 이름의 중복을 피하도록 함.
이를 통해 동일한 프로그램을 여러 번 실행할 때 이름 충돌을 방지.
self.bridge = CvBridge()
CvBridge는 ROS 이미지 메시지(sensor_msgs/Image)와 OpenCV 이미지 (cv::Mat 형식) 간의 변환을 도와주는 클래스.
이 브리지를 사용하여 ROS 이미지 메시지를 OpenCV 이미지로 변환하고, 반대로 OpenCV 이미지를 ROS 이미지 메시지로 변환.
self.image_sub = rospy.Subscriber("/camera/image_raw", Image, self.image_callback)
rospy.Subscriber는 ROS 토픽을 구독하기 위한 함수.
"/camera/image_raw"은 구독할 토픽의 이름. 이 토픽은 카메라에서 실시간으로 들어오는 원시 이미지 데이터를 포함.
Image는 구독할 메시지 타입을 지정. 여기서 sensor_msgs/Image 타입을 의미.
self.image_callback은 이 토픽에 새로운 메시지가 들어올 때 호출될 콜백 함수. 이 함수에서 이미지를 처리.
self.pc_sub = rospy.Subscriber("/camera/depth/points", PointCloud2, self.pc_callback)
"/camera/depth/points"은 구독할 포인트 클라우드 데이터의 토픽 이름.
PointCloud2는 구독할 메시지 타입을 지정합니다. 여기서 sensor_msgs/PointCloud2 타입을 의미.
self.pc_callback은 이 토픽에 새로운 메시지가 들어올 때 호출될 콜백 함수입니다. 이 함수에서 포인트 클라우드 데이터를 처리.
self.fusion_pub = rospy.Publisher("/fusion_image", Image, queue_size=10)
rospy.Publisher는 ROS 토픽을 퍼블리시하기 위한 함수.
"/fusion_image"은 퍼블리시할 토픽의 이름입니다. 이 토픽은 퓨전된 이미지 데이터를 포함.
Image는 퍼블리시할 메시지 타입을 지정.
queue_size=10은 메시지 큐의 크기를 설정.
큐의 크기가 클수록 퍼블리셔가 빠르게 데이터를 보낼 수 있지만, 메모리 사용량도 증가합니다.
self.image_data = None
self.pc_data = None
self.image_data와 self.pc_data는 각각 카메라 이미지와 포인트 클라우드 데이터를 저장할 변수를 초기화.
초기값으로 None을 설정하여 아직 데이터가 수신되지 않았음을 나타냄.
이 변수들은 콜백 함수에서 수신된 데이터를 저장하고, 이후에 데이터 퓨전 작업에 사용.
def image_callback(self, image_msg):
try:
# Convert the ROS Image message to a NumPy array
yuy_image = self.bridge.imgmsg_to_cv2(image_msg, "passthrough")
# Convert YUYV to BGR
self.image_data = cv2.cvtColor(yuy_image, cv2.COLOR_YUV2BGR_YUYV)
except CvBridgeError as e:
rospy.logerr(e)
콜백 함수 정의:
image_callback(self, image_msg):
image_msg라는 매개변수를 받는 ROS의 이미지 메시지를 처리하는 콜백 함수.
이 함수는 클래스 메서드일 것으로 가정.
ROS 메시지 변환:
yuy_image = self.bridge.imgmsg_to_cv2(image_msg, "passthrough"):
CvBridge를 사용하여 ROS의 sensor_msgs/Image 메시지인 image_msg를 OpenCV의 numpy.ndarray 형식인 yuy_image로 변환.
"passthrough" 인자는 변환 방식을 지정하는 인자로, 여기서는 원본 데이터를 그대로 가져오도록 지정.
이미지 포맷 변환:
self.image_data = cv2.cvtColor(yuy_image, cv2.COLOR_YUV2BGR_YUYV):
변환된 yuy_image를 OpenCV의 cv2.cvtColor 함수를 사용하여 YUYV 포맷에서 BGR 포맷으로 변환.
YUYV는 YUV 색상 포맷 중 하나로, 이를 BGR로 변환하여 일반적으로 사용되는 컬러 이미지 형식으로 변환. cv2.COLOR_YUV2BGR_YUYV는 OpenCV에서 제공하는 컬러 변환 코드로, YUYV를 BGR로 변환하라는 의미.
예외 처리:
except CvBridgeError as e:: imgmsg_to_cv2 함수에서 발생할 수 있는 예외인 CvBridgeError를 처리.
예외가 발생할 경우, rospy.logerr(e)를 호출하여 ROS의 로그 시스템을 통해 에러 메시지를 기록.
'Autonomous Driving > Turtlebot3' 카테고리의 다른 글
Fusion Final Code analysis (1) | 2024.07.14 |
---|---|
FUSION [LiDAR+Camera] (0) | 2024.07.11 |
Fusion (0) | 2024.07.08 |
센서 퓨전 패키지 (0) | 2024.07.08 |
LiDAR Base Coordinate & Convert (0) | 2024.07.08 |