자율사물캡스톤디자인/알고리즘 정리
Image Message type 변경하기.
융J
2023. 12. 11. 11:33
지난번에 Unity에서 ROS로 topic을 publish해주고 파이썬 코드를 이용해 띄워보는 것까지 했다.
그런데 문제가 하나 생겼는데.. UNIYT에서 이미지를 Publish해줄때, Message type이 Compressed Image로 고정이 되어 있다는 점이다.
이게 뭐가 문제이냐 하면, Compressed Image는 rviz에도, rqt에도 띄울 수가 없다.
Compressed Image를 이용해 파이썬에서 코드를 돌리고 딥러닝을 돌리는 것에도 문제가 없지만, 파이썬 코드에서 여러대의 카메라 Subscribe를 받고 여러 window를 띄우게 되면.. 내 노트북이 너무 아파해서 문제가 되었다.. 또한, 그 외에 여러 기능들을 사용하지 못한다는게 너무 아쉬워서 메세지 타입을 바꿔주는 코드를 만들었다.
물론 Publish를 할 때 Image message type을 바꾼채로 보낼 수 있지 않을까? 라는 생각으로 script를 수정해보았으나.. message type을 변경하고 run을 하면 unity내에서 계속 에러가 나는 바람에 포기했다...
#!/usr/bin/env python
#-*-coding:utf-8-*-
import rospy
import cv2
import numpy as np
from sensor_msgs.msg import Image, CompressedImage
from cv_bridge import CvBridge
class ImageConverter:
def __init__(self):
self.cameras = {
'front': {'pub': rospy.Publisher('/converted/front_cam', Image, queue_size=1),
'sub': rospy.Subscriber('/camera/front_cam', CompressedImage, partial(self.callback_compressed_image, 'front'))},
'back': {'pub': rospy.Publisher('/converted/back_cam', Image, queue_size=1),
'sub': rospy.Subscriber('/camera/back_cam', CompressedImage, partial(self.callback_compressed_image, 'back'))},
'left': {'pub': rospy.Publisher('/converted/left_cam', Image, queue_size=1),
'sub': rospy.Subscriber('/camera/left_cam', CompressedImage, partial(self.callback_compressed_image, 'left'))},
'right': {'pub': rospy.Publisher('/converted/right_cam', Image, queue_size=1),
'sub': rospy.Subscriber('/camera/right_cam', CompressedImage, partial(self.callback_compressed_image, 'right'))}
}
self.bridge = CvBridge()
def callback_compressed_image(self, camera_name, data):
image = self.bridge.compressed_imgmsg_to_cv2(data)
image_msg = self.bridge.cv2_to_imgmsg(image, encoding="bgr8")
image_msg.header = data.header
self.cameras[camera_name]['pub'].publish(image_msg)
def main():
rospy.init_node('camera_input')
image_converter = ImageConverter()
rospy.spin()
if __name__ == '__main__':
main()
Compressed Image로 들어오는 이미지를 바로 Image로 변환해서 다시 Subscribe를 해주는 코드이다.
callback함수를 여러개 만들자니 너무 지저분해서 딕셔너리 형태로 구성했다.
그리하여 아래의 rqt_graph와 같이 토픽을 잘 주고받을 수 있게 되었다.