我试图在ROS msg中发布一个布尔数组。布尔阵列由Open边缘检测器生成。因此,数组中只有真值或假值。该数组具有图像大小,在我的例子中是1280x1024。
我正在尝试使用来自ByteMultiArray的std_msgs消息。下面显示了我到目前为止得到的代码(这只是解决这个问题的重要内容):
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帮不了我。虽然我认为这个msgs/html/msg/ByteMultiArray.html和这个msgs/html/msg/MultiArrayLayout.html以某种方式找到了答案,但遗憾的是,对我来说并非如此。
谢谢您的每一个帮助和提示!
发布于 2014-12-10 14:40:47
我建议仅仅发布图像信息,如果这是实际对应的数据。为此,已经有了一个助手库,用于在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的详细信息,请参阅本教程:bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython
如果您真的想使用ByteMultiArray,那么您可以这样做,但是您确实需要创建一个描述数据维度的MultiArrayLayout。但是,这样做有点麻烦,而且您将无法使用标准的ROS工具来可视化图像。
而且,在将来,你最好在http://answers.ros.org上问这样的问题
https://stackoverflow.com/questions/27398443
复制相似问题