[英]How to publish/subscribe a python “list of list” as topic in ROS
我是 ROS 和 rospy 的新手,我不熟悉非简单数据类型作为主题。
我想构建一个 ROS 节点作为订阅者和发布者:它接收一个主题(两个float64
的列表),并使用 function (比如my_function
)返回一个float64
列表的列表,然后将此列表发布为一个话题。
为此,我构建了一个节点,如下所示:
from pymongo import MongoClient
from myfile import my_function
import rospy
import numpy as np
pub = None
sub = None
def callback(req):
client = MongoClient()
db = client.block
lon = np.float64(req.b)
lat = np.float64(req.a)
point_list = my_function(lon, lat, db)
pub.publish(point_list)
def calculator():
global sub, pub
rospy.init_node('calculator', anonymous=True)
pub = rospy.Publisher('output_data', list)
# Listen
sub = rospy.Subscriber('input_data', list, callback)
print "Calculation finished. \n"
ros.spin()
if __name__ == '__main__':
try:
calculator()
except rospy.ROSInterruptException:
pass
我清楚地知道订阅者和发布者中的list
不是消息数据,但我无法弄清楚如何修复它,因为它不是 integer 也不是 integer 列表。
ROS论坛上的这篇文章为您提供了所需的大部分内容。 这也很有用。 您可以使用以下规范定义新消息类型 FloatList.msg
:
float64[] elements
然后第二个消息类型FloatArray.msg
定义为:
FloatList[] lists
然后你的功能可能如下所示:
def callback(req):
client = MongoClient()
db = client.block
lon = np.float64(req.b)
lat = np.float64(req.a)
point_list = my_function(lon, lat, db)
float_array = FloatArray()
for i in range(len(point_list)):
float_list = FloatList()
float_list.elements = point_list[i]
float_array.lists[i] = float_list
pub.publish(float_array)
然后你可以解压缩它:
def unpack_callback(float_array_msg):
for lst in float_array_msg.lists:
for e in lst.elements:
print "Here is an element: %f" % e
一般来说,建议您将ROS相关问题放在ROS论坛上,因为您更有可能在那里得到问题的答案。
你可以通过在msg中定义一个新的ros类型来复杂化自己,或者使用默认的并且易于实现std_msgs类型,可能对使用json模块很有用,所以你在发布之前序列化数据,然后在另一侧反序列化它接收...
其余的Pub / Sub,主题和处理程序保持不变:)
我同意这个解决方案,我考虑过组织一下
在您拥有所有其他消息文件的 src 文件夹中的catkin_ws
中创建一个文件FloatArray.msg
。
使用catkin_make
或 catkin catkin build
构建您的环境。
在您的脚本(例如 Python 脚本)中导入消息类型并在订阅者中使用它,例如
joint_state_publisher_Unity = rospy.Publisher("/joint_state_unity", FloatArray, queue_size = 10)
具体案例(奖励:)):如果您使用 Unity 和 ROS# 在 Unity 中构建消息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.