我正在通过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消息中使用具有多个对的字典?你知道吗
没什么。第一,你见过^{} 吗?它是从gamepad读取事件并作为ROSsensor_msgs/Joy消息发布的标准节点。你知道吗
第二,不应该使用roslibpy,应该使用^{} 。看看这些例子。你知道吗
最后,如果您尝试使用ROS定义的标准消息类型,您将获得更大的成功(在使用rospy之后)。如果在尝试使用rospy(和joy\u node?),提出新问题。你知道吗
我可能找到了我要找的信息。The Docs for ROS message types表明,虽然每个消息类型都可以被视为一个字典,但对于每个消息类型中可以放入哪些键值对和数据类型,它有一个硬定义。我没有意识到这一点,我的工作假设是,我可以在任何消息类型中有多个具有任何名称的条目,只要它们是正确的数据类型。因此,在我的问题中,似乎最好将gamepad给出的三条信息串联成一个字符串(因为std_msgs/String只包含一个名为data的字符串),并让侦听器在收到消息后再次将字符串分开。你知道吗
相关问题 更多 >
编程相关推荐