roslibpy消息不包含多个键值

2024-09-27 22:20:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过rosbridge从gamepad发送输入,使用inputs python模块从gamepad获取输入。每个gamepad事件都有三条信息:事件类型(用于区分模拟和按钮输入的afaik)、事件代码(按钮/操纵杆的名称)和事件状态(模拟值)。如果我把每一条信息单独地作为它们自己的信息发送,事情会很顺利,但我正在尝试将所有三条信息都发送到一条消息中。Roslibpy的source和readthedocs都声称消息只是字典,可以这样对待,但是如果我尝试发送一个包含超过keyvalue对的消息,我会在rosbridge服务器的控制台上收到错误消息。编辑:我使用roslibpy是因为talker节点在windows7上,我正在通过rosbridge向ubuntu18.04上的ROS-Melodic服务器发送信息。你知道吗

在下面的例子中,如果我打电话talker.发布()对于包含单个键值对字典的消息,消息将成功发送。在字典中有多对,如下所示,我得到了错误。你知道吗

对讲机节点:

from __future__ import print_function
import time

import roslibpy

from inputs import get_gamepad

def main():
    client = roslibpy.Ros(host='localhost', port=9090)
    client.run()

    talker = roslibpy.Topic(client, '/chatter', 'std_msgs/String')

    while client.is_connected:
        events = get_gamepad()
        for event in events:
            talker.publish(roslibpy.Message({'data': str(event.ev_type), 'btype': str(event.code), 'value': str(event.state) }))
            print('Sending message...\n')

    talker.unadvertise()

    client.terminate()

if __name__ == "__main__":
    main()

侦听器节点:

from __future__ import print_function
import roslibpy

def main():
    client = roslibpy.Ros(host='localhost', port=9090)
    client.run()

    listener = roslibpy.Topic(client, '/chatter', 'std_msgs/String')
    listener.subscribe(lambda message: out(message))

    try:
        while True:
            pass
    except KeyboardInterrupt:
        client.terminate()

def out( dict ):

    print('input type: ' + dict['data'])
    print('input button: ' + dict['btype'])
    print('button value: ' + dict['value'])


if __name__ == "__main__":
    main()

错误消息(有很多,但唯一改变的是publish:/chatter[a counter]):

[ERROR] [1570653818.070547]: [Client 26] [id: publish:/chatter:35] publish: Message type std_msgs/String does not have a field btype
[ERROR] [1570653818.070547]: [Client 26] [id: publish:/chatter:36] publish: Message type std_msgs/String does not have a field btype

这是徒劳的练习,我应该尝试将所有的gamepad事件信息连接到一个字符串中,还是我遗漏了什么,并且真的可以在ros消息中使用具有多个对的字典?你知道吗


Tags: importclient信息消息字典main事件publish
2条回答

没什么。第一,你见过^{}吗?它是从gamepad读取事件并作为ROSsensor_msgs/Joy消息发布的标准节点。你知道吗

第二,不应该使用roslibpy,应该使用^{}。看看这些例子。你知道吗

最后,如果您尝试使用ROS定义的标准消息类型,您将获得更大的成功(在使用rospy之后)。如果在尝试使用rospy(和joy\u node?),提出新问题。你知道吗

我可能找到了我要找的信息。The Docs for ROS message types表明,虽然每个消息类型都可以被视为一个字典,但对于每个消息类型中可以放入哪些键值对和数据类型,它有一个硬定义。我没有意识到这一点,我的工作假设是,我可以在任何消息类型中有多个具有任何名称的条目,只要它们是正确的数据类型。因此,在我的问题中,似乎最好将gamepad给出的三条信息串联成一个字符串(因为std_msgs/String只包含一个名为data的字符串),并让侦听器在收到消息后再次将字符串分开。你知道吗

相关问题 更多 >

    热门问题