Я работаю над отправкой ввода с геймпада через rosbridge, используя модуль ввода python для получения ввода с геймпада. Каждое событие геймпада имеет три части информации: тип события (afaik для передачи между аналоговым и кнопочным вводом), код события (название кнопки / джойстика) и состояние события (аналоговые значения). Если я отправляю каждый из этих кусочков информации отдельно как свои собственные Сообщения, все работает нормально, но я пытаюсь отправить все три в одном сообщении. Источники Roslibpy и readthedocs утверждают, что сообщения являются просто словарями и могут рассматриваться как таковые, но если я пытаюсь отправить сообщение с парой значений ключа больше, чем я, я получаю сообщения об ошибках на консоли сервера rosbridge. РЕДАКТИРОВАТЬ: я использую roslibpy, потому что узел говорящего находится на Windows 7, и я посылаю информацию на сервер ROS Melodic на Ubuntu 18.04 через rosbridge.
В приведенном ниже примере, если я вызываю 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 [счетчик]):
[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?