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.

Learn more in ros-wiki

  • GitHub 上的项目回购。

[更新]

  • 如果您正在寻找快速通信,TCP-ROS 通信不是您的目的,因为它比像 ZeroMQ 这样的无代理通信器慢(它具有低延迟和高吞吐量):
  1. ZeroMQ 中等效的 ROS 服务模式是 REQ/REP (client/server)
  2. ROS publisher/subscriber 在 ZeroMQ 中等效的模式是 PUB/SUB
  3. ROS publisher/subscriber 与 waitformessage 等价于 ZeroMQ 是 PUSH/PULL

ZeroMQ is available in both Python and C++

  • 此外,为了传输大量数据(例如 pointcloud),ROS 中有一种机制称为 nodelet,它仅在 C++ 中受支持。这种通信基于机器上的共享内存而不是 TCP-ROS 套接字。

    What exactly is a nodelet?

要获得此 request/reply 行为,ROS 有一种称为 ROS service 的机制。

您可以在类似于 ROS 消息定义的服务文件中指定您的服务的输入和输出。然后,您可以使用您的输入调用节点的服务,该调用将在服务完成时收到输出。

Here 是如何在 python 中使用此机制的教程。如果你更喜欢 C++,也有一个,你应该找到它。

既然你想坚持使用发布/订阅者,根据你的评论假设服务速度很慢,我会看看 waitForMessage (Documentation)。

有关如何使用它的示例,您可以查看 this ros answers question

您需要做的就是发布您的数据并立即在输出主题上调用 waitForMessage 并将收到的消息手动传递给您的 "callback"。

希望这就是您要找的。