我正在尝试通过rosbridge从游戏手柄发送输入,使用inputs python模块从游戏手柄获取输入。每个游戏手柄事件都有三部分信息:事件类型(用于在模拟输入与按钮输入之间进行区分的afaik),事件代码(按钮/游戏杆的名称)和事件状态(模拟值)。如果我分别将这些信息中的每条信息作为它们自己的消息发送时,则一切正常,但是我尝试将所有三条信息发送到一个消息中。 Roslibpy的资料来源和readthedocs都声称消息只是字典,可以这样对待,但是如果我尝试发送的消息超过键值对,则会在rosbridge服务器的控制台上收到错误消息。编辑:我使用roslibpy,因为讲话者节点在Windows 7上,并且我通过rosbridge将信息发送到ubuntu 18.04上的ROS Melodic服务器。
在下面的示例中,如果我使用包含单个键值对字典的消息调用talker.publish(),则消息将成功发送。字典中有多对,如下所示,我会出错。
发话者节点:
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()
错误消息(有很多错误消息,但唯一更改的是发布:/ 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
这是徒劳的练习吗,我应该尝试将所有游戏手柄事件信息连接到一个字符串中,或者是否缺少某些内容,并且确实可以在一个字典中使用多于一对的字典ROS消息?
答案 0 :(得分:0)
很少。一,您看过Joy
吗?它是一个标准节点,用于从游戏手柄中读取事件并作为ROS sensor_msgs/Joy消息发布。
第二,您不应使用roslibpy,而应使用rospy
。请参阅这些示例。
最后,如果您尝试使用ROS定义的标准消息类型,则将获得更大的成功(使用rospy之后)。如果尝试使用rospy(和joy_node?)后仍然遇到问题,请提出一个新问题。
答案 1 :(得分:0)
我可能已找到所需的信息。 The Docs for ROS message types表明,虽然每种消息类型都可以视为字典,但它对可以将每种键类型和数据类型放入每种消息类型都有硬性定义。我没有意识到这一点,并且正在假设我可以在任何消息类型中使用任何名称的多个条目,只要它们是正确的数据类型即可。因此,就我的问题而言,似乎最好将游戏手柄提供的三条信息连接成一个字符串(因为std_msgs/String仅包含一个名为data的字符串)并具有侦听器收到消息后再次将字符串分开。