Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何使用ROS 2在python节点中发布一批图像?_Python 3.x_Ros_Ros2 - Fatal编程技术网

Python 3.x 如何使用ROS 2在python节点中发布一批图像?

Python 3.x 如何使用ROS 2在python节点中发布一批图像?,python-3.x,ros,ros2,Python 3.x,Ros,Ros2,我在ROS 2中有一个发布者,发布图像消息如下: #!/usr/bin/env python3 # Revision $Id$ import rclpy from rclpy.node import Node from std_msgs.msg import String from cv_bridge import CvBridge from sensor_msgs.msg import Image import cv2 import numpy as np class MinimalPu

我在ROS 2中有一个发布者,发布图像消息如下:

#!/usr/bin/env python3
# Revision $Id$

import rclpy
from rclpy.node import Node
from std_msgs.msg import String
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
import cv2
import numpy as np


class MinimalPublisher(Node):

    def __init__(self):

        super().__init__('minimal_publisher')
        self.publisher_ = self.create_publisher(Image, 'Image', 10)
        timer_period = 0.5  # seconds
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.i = 0
        self.im_list = []
        
        self.cv_image = cv2.imread('test.jpg') ### an RGB image 
        self.bridge = CvBridge()
       
    def timer_callback(self):
        
        self.publisher_.publish(self.bridge.cv2_to_imgmsg(np.array(self.cv_image), "bgr8"))
        self.get_logger().info('Publishing an image')
       

def main(args=None):

    rclpy.init(args=args)
    minimal_publisher = MinimalPublisher()
    rclpy.spin(minimal_publisher)
    minimal_publisher.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()
它可以很好地处理单个图像。但我想发布一批具有给定形状的图像:

[12,3,224,224]=>[批次、通道、宽度、高度]

我试图将其作为图像列表发送,但失败了。如何做到这一点

更多信息:

python 3.6
ROS 2-雄辩(源代码构建)
Ubuntu 18


最后,我构建了一条自定义消息,如下所示:

#!/usr/bin/env python3
# Revision $Id$


import rclpy
from rclpy.node import Node
from custom_batch.msg import Batch #### import custom message
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
import cv2
import numpy as np


class MinimalPublisher(Node):

    def __init__(self):
        super().__init__('minimal_publisher')
        self.publisher_ = self.create_publisher(Batch, 'Image', 10) #### change here
        timer_period = 0.5  # seconds
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.i = 0
        self.im_list = []
        self.cv_image1 = cv2.imread('3.jpg')
        self.cv_image2 = cv2.imread('2.jpg')
        self.bridge = CvBridge()

    def timer_callback(self):

        #### custom message
        my_msg = Batch()
        my_msg.data[0] = self.bridge.cv2_to_imgmsg(np.array(self.cv_image1), "bgr8")
        my_msg.data[1] = self.bridge.cv2_to_imgmsg(np.array(self.cv_image2), "bgr8")
        #####
        self.publisher_.publish(my_msg) ## custom message
        self.get_logger().info('Publishing a batch of images')

def main(args=None):

    rclpy.init(args=args)
    minimal_publisher = MinimalPublisher()
    rclpy.spin(minimal_publisher)
    minimal_publisher.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
     main()
传感器msgs/图像[2]数据

批量大小为2

然后,将其添加到我的发布服务器,如下所示:

#!/usr/bin/env python3
# Revision $Id$


import rclpy
from rclpy.node import Node
from custom_batch.msg import Batch #### import custom message
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
import cv2
import numpy as np


class MinimalPublisher(Node):

    def __init__(self):
        super().__init__('minimal_publisher')
        self.publisher_ = self.create_publisher(Batch, 'Image', 10) #### change here
        timer_period = 0.5  # seconds
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.i = 0
        self.im_list = []
        self.cv_image1 = cv2.imread('3.jpg')
        self.cv_image2 = cv2.imread('2.jpg')
        self.bridge = CvBridge()

    def timer_callback(self):

        #### custom message
        my_msg = Batch()
        my_msg.data[0] = self.bridge.cv2_to_imgmsg(np.array(self.cv_image1), "bgr8")
        my_msg.data[1] = self.bridge.cv2_to_imgmsg(np.array(self.cv_image2), "bgr8")
        #####
        self.publisher_.publish(my_msg) ## custom message
        self.get_logger().info('Publishing a batch of images')

def main(args=None):

    rclpy.init(args=args)
    minimal_publisher = MinimalPublisher()
    rclpy.spin(minimal_publisher)
    minimal_publisher.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
     main()

您可以在ROS2中找到有关自定义消息的有用说明。

最后,我构建了一个自定义消息,如下所示:

#!/usr/bin/env python3
# Revision $Id$


import rclpy
from rclpy.node import Node
from custom_batch.msg import Batch #### import custom message
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
import cv2
import numpy as np


class MinimalPublisher(Node):

    def __init__(self):
        super().__init__('minimal_publisher')
        self.publisher_ = self.create_publisher(Batch, 'Image', 10) #### change here
        timer_period = 0.5  # seconds
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.i = 0
        self.im_list = []
        self.cv_image1 = cv2.imread('3.jpg')
        self.cv_image2 = cv2.imread('2.jpg')
        self.bridge = CvBridge()

    def timer_callback(self):

        #### custom message
        my_msg = Batch()
        my_msg.data[0] = self.bridge.cv2_to_imgmsg(np.array(self.cv_image1), "bgr8")
        my_msg.data[1] = self.bridge.cv2_to_imgmsg(np.array(self.cv_image2), "bgr8")
        #####
        self.publisher_.publish(my_msg) ## custom message
        self.get_logger().info('Publishing a batch of images')

def main(args=None):

    rclpy.init(args=args)
    minimal_publisher = MinimalPublisher()
    rclpy.spin(minimal_publisher)
    minimal_publisher.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
     main()
传感器msgs/图像[2]数据

批量大小为2

然后,将其添加到我的发布服务器,如下所示:

#!/usr/bin/env python3
# Revision $Id$


import rclpy
from rclpy.node import Node
from custom_batch.msg import Batch #### import custom message
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
import cv2
import numpy as np


class MinimalPublisher(Node):

    def __init__(self):
        super().__init__('minimal_publisher')
        self.publisher_ = self.create_publisher(Batch, 'Image', 10) #### change here
        timer_period = 0.5  # seconds
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.i = 0
        self.im_list = []
        self.cv_image1 = cv2.imread('3.jpg')
        self.cv_image2 = cv2.imread('2.jpg')
        self.bridge = CvBridge()

    def timer_callback(self):

        #### custom message
        my_msg = Batch()
        my_msg.data[0] = self.bridge.cv2_to_imgmsg(np.array(self.cv_image1), "bgr8")
        my_msg.data[1] = self.bridge.cv2_to_imgmsg(np.array(self.cv_image2), "bgr8")
        #####
        self.publisher_.publish(my_msg) ## custom message
        self.get_logger().info('Publishing a batch of images')

def main(args=None):

    rclpy.init(args=args)
    minimal_publisher = MinimalPublisher()
    rclpy.spin(minimal_publisher)
    minimal_publisher.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
     main()
您可以在ROS2中找到有关自定义消息的有用说明