如何使用ROS发布和订阅2D字符串数组/列表?

问题描述 投票:0回答:1

我有这个问题:我需要一个节点来发布矩阵/二维字符串数组(或二维字符串列表),该数组是

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的回答效果很好,谢谢!

python arrays ros
1个回答
0
投票

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 消息时,请始终确保消息数据类型和结构与您在自定义消息文件中定义的内容一致。

© www.soinside.com 2019 - 2024. All rights reserved.