我试图在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.html和http://docs.ros.org/api/std_msgs/html/msg/MultiArrayLayout.html以某种方式导致答案,但遗憾的是不适合我。
提前感谢您的每一个帮助和提示!
答案 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
上提出这样的问题。