roslibpy Сообщения не содержат более одной пары ключ-значение - PullRequest
2 голосов
/ 10 октября 2019

Я работаю над отправкой ввода с геймпада через 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?

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Возможно, я нашел информацию, которую искал. Документы для типов сообщений ROS показывают, что, хотя каждый тип сообщения можно рассматривать как словарь, в нем есть четкое определение того, какие пары значений ключей и типы данных могут быть помещены в каждый тип сообщения. Я не знал об этом, и работал в предположении, что у меня может быть несколько записей с любым именем в любом типе сообщения, если они являются правильным типом данных. Так что в контексте моего вопроса, в частности, кажется, что было бы лучше объединить три фрагмента информации, предоставляемой геймпадом, в одну строку (потому что std_msgs / String содержит только одну строку с именем data)и попросите слушателя снова разорвать строку после получения сообщения.

0 голосов
/ 11 октября 2019

Мало вещей. Один, ты видел Joy? Это стандартный узел для чтения событий с геймпада и публикации в виде сообщения ROS sensor_msgs / Joy .

Во-вторых, вы не должны использовать roslibpy, вы должны использовать rospy. Посмотрите эти примеры.

Наконец, у вас будет гораздо больший успех (после использования rospy), если вы попытаетесь использовать стандартные типы сообщений, определенные ROS. Если у вас все еще есть проблемы после попытки использовать rospy (и joy_node?), Задайте новый вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...