Я думаю, что вам нужен шаблон 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 (он имеет низкую задержку и высокую пропускную способность):
- Эквивалент шаблона службы ROS в ZeroMQ равен REQ / REP (клиент/ сервер)
- ROS-эквивалент издателя / подписчика в ZeroMQ равен PUB / SUB
- ROS-издатель / подписчик с
waitformessage
эквивалентом в ZeroMQ равен PUSH / PULL
ZeroMQ доступен как на Python, так и на C ++
Кроме того, для передачи огромных суммДля данных (т. е. pointcloud
) в ROS существует механизм, называемый nodelet
, который поддерживается только в C ++. Это взаимодействие основано на разделяемой памяти на машине вместо сокета TCP-ROS.
Что такое узелок?