ROS发布布尔数组

时间:2014-12-10 10:18:27

标签: python arrays

我试图在ROS消息中发布一个布尔数组。 布尔数组由Open CV Canny边缘检测器生成。所以数组中只有True或False值。该数组具有图像的大小,在我的例子中为1280x1024。

我试图使用std_msgs中的ByteMultiArray消息。下面显示了我到目前为止所获得的代码(只是这个问题的重要内容):

import rospy
from std_msgs.msg import ByteMultiArray

NeedleBorder = rospy.Publisher('NeedleBorder', ByteMultiArray, queue_size=10)

frame_edges = cv2.Canny(frame_gray, threshold1, threshold2)
frame_edges_bool = frame_edges.astype(bool)

NeedleBorder.publish(frame_edges_bool)

如果我运行此代码,我会收到以下错误:

Traceback (most recent call last):
  File "VideoPublisher.py", line 73, in <module>
    NeedleBorder.publish(frame_edges_bool)
  File "/opt/ros/indigo/lib/python2.7/dist-packages/rospy/topics.py", line 816, in publish
    data = args_kwds_to_message(self.data_class, args, kwds)
  File "/opt/ros/indigo/lib/python2.7/dist-packages/rospy/msg.py", line 122, in args_kwds_to_message
    return data_class(*args)
  File "/opt/ros/indigo/lib/python2.7/dist-packages/std_msgs/msg/_ByteMultiArray.py", line 72, in __init__
    super(ByteMultiArray, self).__init__(*args, **kwds)
  File "/opt/ros/indigo/lib/python2.7/dist-packages/genpy/message.py", line 276, in __init__
    raise TypeError("Invalid number of arguments, args should be %s"%str(self.__slots__)+" args are"+str(args))
TypeError: Invalid number of arguments, args should be ['layout', 'data'] args are(array([[False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       ..., 
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False]], dtype=bool),)

在这种情况下,ROS wiki对我没有帮助。虽然我认为http://docs.ros.org/api/std_msgs/html/msg/ByteMultiArray.htmlhttp://docs.ros.org/api/std_msgs/html/msg/MultiArrayLayout.html以某种方式导致答案,但遗憾的是不适合我。

提前感谢您的每一个帮助和提示!

1 个答案:

答案 0 :(得分:0)

我建议只发布图片信息,如果这是数据实际对应的内容。为此,已经有一个帮助库,用于在opencv2类型和ROS消息类型之间进行转换:

import rospy
from cv_bridge import CvBridge
from sensor_msgs.msg import Image

image_pub = rospy.Publisher("image_topic_2",Image)

frame_edges = cv2.Canny(frame_gray, threshold1, threshold2)

image_pub.publish(self.bridge.cv2_to_imgmsg(frame_edges, "mono8"))

有关cv_bridge的更多详细信息,请参阅本教程:http://wiki.ros.org/cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython

如果确实想要使用ByteMultiArray,那么您可以这样做,但您需要创建一个描述数据维度的MultiArrayLayout。尽管如此,这样做有点麻烦,而且您无法使用标准ROS工具对图像进行可视化。

此外,将来,您最好在http://answers.ros.org

上提出这样的问题。