【问题标题】:How to publish/subscribe a python “list of list” as topic in ROS如何在 ROS 中发布/订阅 Python “列表列表”作为主题
【发布时间】:2017-03-31 00:15:47
【问题描述】:

我是 ROS 和 rospy 的新手,不熟悉非简单数据类型作为主题。

我想构建一个 ROS 节点作为订阅者和发布者:它接收一个主题(两个 float64 的列表),并使用一个函数(比如 my_function)返回一个列表列表 @987654323 @,然后将此列表列表发布为主题。

为此,我构建了一个节点,如下所示:

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 不是消息数据,但我不知道如何修复它,因为它不是整数也不是整数列表。

【问题讨论】:

    标签: python publish-subscribe ros rospy


    【解决方案1】:

    ROS 论坛上的This post 为您提供了大部分所需内容。 This 也很有用。您可以define a new message typeFloatList.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 Forums 上,因为在那里您更有可能得到问题的答案。

    【讨论】:

      【解决方案2】:

      您可以通过在 msg 中定义一个新的 ros 类型来使自己复杂化,或者使用默认且易于实现的 std_msgs 类型,也许会使用 json 模块很有用,因此您在发布之前序列化数据并在接收后将其反序列化回另一端...

      其余的 Pub/Sub 、主题和处理程序保持不变 :)

      【讨论】:

      • 我对 ROS 很陌生,并且正在尝试构建一个 ROS 节点作为订阅者和发布者(无论主题的数据类型如何)。通过使用全局 pubsub 变量来实现这一目标是否被认为是一种好的做法?还是将pub 作为参数传递给callback 会更好?
      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      相关资源
      最近更新 更多