我有这个问题:我需要一个节点来发布矩阵/二维字符串数组(或二维字符串列表),该数组是
sherd_1::link goHome0
sherd_2::link goHome0
sherd_3::link goHome0
sherd_5::link goHome0
sherd_6::link goHome1
sherd_9::link goHome1
sherd_10::link goHome2
sherd_11::link goHome1
sherd_12::link goHome0
sherd_13::link goHome2
以下如何使用ROS发布2D列表?我想出了写两条自定义消息,
一个是
sherd_array.msg
string[] sherds
string[] homes
有了这个,我就可以毫无问题地发布和订阅了
然后我尝试这样定义
matrix.msg
sherd_array[][] data
但是当我尝试使用
catkin_make
构建它时,我收到此错误
genmsg.base.InvalidMsgSpec: braccio_moveit_gazebo_noetic/custom_msgs/msg/matrix.msg: invalid field: Currently only support 1-dimensional array types: custom_msgs/sherd_array[][]
make[2]: *** [braccio_moveit_gazebo_noetic/custom_msgs/CMakeFiles/_custom_msgs_generate_messages_check_deps_matrix.dir/build.make:70: braccio_moveit_gazebo_noetic/custom_msgs/CMakeFiles/_custom_msgs_generate_messages_check_deps_matrix] Errore 1
make[1]: *** [CMakeFiles/Makefile2:1023: braccio_moveit_gazebo_noetic/custom_msgs/CMakeFiles/_custom_msgs_generate_messages_check_deps_matrix.dir/all] Errore 2
make: *** [Makefile:146: all] Errore 2
Invoking "make -j8 -l8" failed
如果我尝试以这种方式构建
matrix.msg
sherd_array[2] data
这样看来发布消息的节点没有问题,但是当我尝试使用矩阵消息订阅主题时,发布的节点崩溃并在其终端中收到此错误消息
line 60, in serialize length = len(val1.sherds)
AttributeError: 'numpy.ndarray' object has no attribute 'sherds'
我能做什么?
谢谢!
编辑 如果我在为matrix_msg构建的msg上使用rospy.loginfo我会得到正确的输出
[INFO] [1697191139.662418, 201.596000]: data:
- ['sherd_1::link' 'sherd_2::link' 'sherd_3::link' 'sherd_5::link'
'sherd_6::link' 'sherd_9::link' 'sherd_10::link' 'sherd_11::link'
'sherd_12::link' 'sherd_13::link']
- ['goHome0' 'goHome0' 'goHome0' 'goHome0' 'goHome1' 'goHome1' 'goHome2'
'goHome1' 'goHome0' 'goHome2']
编辑 下面nogabemist的回答效果很好,谢谢!
ROS 1 本身不支持自定义消息中的多维数组。你可以尝试这个 hacky 解决方案。
定义你的 sherd_array.msg:
string[] sherds
string[] homes
然后,定义你的matrix.msg:
sherd_array[] data
在您的发布者中,创建并填写消息:
import rospy
from custom_msgs.msg import sherd_array, matrix
rospy.init_node("matrix_publisher")
pub = rospy.Publisher('matrix_data', matrix, queue_size=10)
# Populate the data
mat_msg = matrix()
array_msg_1 = sherd_array()
array_msg_1.sherds = ['sherd_1::link', 'sherd_2::link', ...]
array_msg_1.homes = ['goHome0', 'goHome0', ...]
array_msg_2 = sherd_array()
array_msg_2.sherds = [...]
array_msg_2.homes = [...]
mat_msg.data = [array_msg_1, array_msg_2]
pub.publish(mat_msg)
在您的订阅者中:
import rospy
from custom_msgs.msg import matrix
def callback(data):
sherds_1 = data.data[0].sherds
homes_1 = data.data[0].homes
sherds_2 = data.data[1].sherds
homes_2 = data.data[1].homes
# Process the data ...
rospy.init_node("matrix_subscriber")
sub = rospy.Subscriber('matrix_data', matrix, callback)
rospy.spin()
您正在尝试直接序列化 numpy 数组。处理 ROS 消息时,请始终确保消息数据类型和结构与您在自定义消息文件中定义的内容一致。