ROS - Как мне опубликовать сообщение и немедленно получить подписанный обратный вызов - PullRequest
0 голосов
/ 30 октября 2019

У меня есть узел ROS, который позволяет вам «публиковать» в нем структуру данных, на которую он отвечает, публикуя выходные данные. Временная метка того, что я опубликовал, и того, что он публикует, совпадает.

Существует ли механизм для функции блокировки, когда я отправляю / публикую и выводю информацию, и она ждет, пока я не получу вывод?

Ответы [ 3 ]

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

Чтобы получить это поведение запроса / ответа, ROS имеет механизм, называемый Служба ROS .

Вы можете указать вход и выход вашей службы в файле службы, аналогичном определению сообщения ROS,Затем вы можете вызвать службу узла с помощью вашего ввода, и вызов получит вывод, когда служба будет завершена.

Здесь - руководство по использованию этого механизма в Python. Если вы предпочитаете C ++, есть и такой, вы должны его найти.

0 голосов
/ 01 ноября 2019

Поскольку вы хотите придерживаться публикации / подписчиков, исходя из вашего комментария, что услуги будут медленными, я бы посмотрел на waitForMessage ( Документация ).

И дляпример того, как его использовать, вы можете посмотреть на этот ответ на вопрос .

Все, что вам нужно сделать, это опубликовать ваши данные и немедленно вызвать waitForMessage в теме вывода и вручнуюпередать полученное сообщение вашему «обратному вызову».

Надеюсь, это то, что вы искали.

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

Я думаю, что вам нужен шаблон ROS_Services (клиент / сервер) вместо издателя / подписчика.


Вот простой пример, чтобы сделать это на Python:

Код клиентаФрагмент:

import rospy
from test_service.srv import MySrvFile

rospy.wait_for_service('a_topic')
try:
    send_hi = rospy.ServiceProxy('a_topic', MySrvFile)
    print('Client: Hi, do you hear me?')
    resp = send_hi('Hi, do you hear me?')
    print("Server: {}".format(resp.response))

except rospy.ServiceException, e:
    print("Service call failed: %s"%e)

Фрагмент кода сервера:

import rospy
from test_service.srv import MySrvFile, MySrvFileResponse

def callback_function(req):
    print(req)
    return MySrvFileResponse('Hello client, your message received.')

rospy.init_node('server')
rospy.Service('a_topic', MySrvFile, callback_function)
rospy.spin()

MySrvFile.srv

string request
---
string response

Выход сервера:

request: "Hi, do you hear me?"

Выход клиента:

Client: Hi, do you hear me?
Server: Hello client, your message received.

Подробнее в ros-wiki


[ОБНОВЛЕНИЕ]

  • Если вы ищете быструю связь, TCP-ROS связьне ваша цель, потому что он медленнее, чем коммуникатор без посредников, такой как ZeroMQ (он имеет низкую задержку и высокую пропускную способность):

    1. Эквивалент шаблона службы ROS в ZeroMQ равен REQ / REP (клиент/ сервер)
    2. ROS-эквивалент издателя / подписчика в ZeroMQ равен PUB / SUB
    3. ROS-издатель / подписчик с waitformessage эквивалентом в ZeroMQ равен PUSH / PULL

    ZeroMQ доступен как на Python, так и на C ++

  • Кроме того, для передачи огромных суммДля данных (т. е. pointcloud) в ROS существует механизм, называемый nodelet, который поддерживается только в C ++. Это взаимодействие основано на разделяемой памяти на машине вместо сокета TCP-ROS.

    Что такое узелок?

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