관리 메뉴

Wiredwisdom

FUSION Code review 본문

Autonomous Driving/Turtlebot3

FUSION Code review

Duke_Wisdom 2024. 7. 8. 21:31
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