首页 > 解决方案 > ROS - 如何发布消息并立即获取订阅的回调

问题描述

我有一个 ROS 节点,允许您向它“发布”一个数据结构,它通过发布输出来响应它。我发布的内容和它发布的内容的时间戳是匹配的。

是否有一种阻止功能的机制,我可以在其中发送/发布和输出,它会一直等到我收到输出?

标签: ros

解决方案


我认为您需要 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. ZeroMQ 中等效的 ROS 服务模式是REQ/REP(客户端/服务器)
    2. ZeroMQ 中等效的 ROS 发布者/订阅者模式是PUB/SUB
    3. waitformessageZeroMQ 中等效的ROS 发布者/订阅者是PUSH/PULL

    ZeroMQ 在 Python 和 C++ 中都可用

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

    究竟什么是nodelet?


推荐阅读