ROS - 如何发布消息并立即获得订阅的回调
ROS - How do I publish a message and get the subscribed callback immediately
我有一个 ROS 节点,允许您向它 "publish" 一个数据结构,它通过发布输出来响应它。我发布的和它发布的时间戳是匹配的
是否有一种阻塞函数的机制,我 send/publish 并输出,它会一直等到我收到输出?
我认为您需要 ROS_Services (client/server) 模式而不是 publisher/subscriber.
这是在 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.
- GitHub 上的项目回购。
[更新]
- 如果您正在寻找快速通信,TCP-ROS 通信不是您的目的,因为它比像 ZeroMQ 这样的无代理通信器慢(它具有低延迟和高吞吐量):
- ZeroMQ 中等效的 ROS 服务模式是 REQ/REP (client/server)
- ROS publisher/subscriber 在 ZeroMQ 中等效的模式是 PUB/SUB
- ROS publisher/subscriber 与
waitformessage
等价于 ZeroMQ 是 PUSH/PULL
ZeroMQ is available in both Python and C++
- 此外,为了传输大量数据(例如
pointcloud
),ROS 中有一种机制称为 nodelet
,它仅在 C++ 中受支持。这种通信基于机器上的共享内存而不是 TCP-ROS 套接字。
要获得此 request/reply 行为,ROS 有一种称为 ROS service 的机制。
您可以在类似于 ROS 消息定义的服务文件中指定您的服务的输入和输出。然后,您可以使用您的输入调用节点的服务,该调用将在服务完成时收到输出。
Here 是如何在 python 中使用此机制的教程。如果你更喜欢 C++,也有一个,你应该找到它。
既然你想坚持使用发布/订阅者,根据你的评论假设服务速度很慢,我会看看 waitForMessage
(Documentation)。
有关如何使用它的示例,您可以查看 this ros answers question。
您需要做的就是发布您的数据并立即在输出主题上调用 waitForMessage 并将收到的消息手动传递给您的 "callback"。
希望这就是您要找的。
我有一个 ROS 节点,允许您向它 "publish" 一个数据结构,它通过发布输出来响应它。我发布的和它发布的时间戳是匹配的
是否有一种阻塞函数的机制,我 send/publish 并输出,它会一直等到我收到输出?
我认为您需要 ROS_Services (client/server) 模式而不是 publisher/subscriber.
这是在 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.
- GitHub 上的项目回购。
[更新]
- 如果您正在寻找快速通信,TCP-ROS 通信不是您的目的,因为它比像 ZeroMQ 这样的无代理通信器慢(它具有低延迟和高吞吐量):
- ZeroMQ 中等效的 ROS 服务模式是 REQ/REP (client/server)
- ROS publisher/subscriber 在 ZeroMQ 中等效的模式是 PUB/SUB
- ROS publisher/subscriber 与
waitformessage
等价于 ZeroMQ 是 PUSH/PULL
ZeroMQ is available in both Python and C++
- 此外,为了传输大量数据(例如
pointcloud
),ROS 中有一种机制称为nodelet
,它仅在 C++ 中受支持。这种通信基于机器上的共享内存而不是 TCP-ROS 套接字。
要获得此 request/reply 行为,ROS 有一种称为 ROS service 的机制。
您可以在类似于 ROS 消息定义的服务文件中指定您的服务的输入和输出。然后,您可以使用您的输入调用节点的服务,该调用将在服务完成时收到输出。
Here 是如何在 python 中使用此机制的教程。如果你更喜欢 C++,也有一个,你应该找到它。
既然你想坚持使用发布/订阅者,根据你的评论假设服务速度很慢,我会看看 waitForMessage
(Documentation)。
有关如何使用它的示例,您可以查看 this ros answers question。
您需要做的就是发布您的数据并立即在输出主题上调用 waitForMessage 并将收到的消息手动传递给您的 "callback"。
希望这就是您要找的。