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.
- GitHub 上的项目仓库。
[更新]
如果您正在寻找快速通信,TCP-ROS 通信不是您的目的,因为它比 ZeroMQ 之类的无代理通信器慢(它具有低延迟和高吞吐量):
- ZeroMQ 中等效的 ROS 服务模式是REQ/REP(客户端/服务器)
- ZeroMQ 中等效的 ROS 发布者/订阅者模式是PUB/SUB
waitformessage
ZeroMQ 中等效的ROS 发布者/订阅者是PUSH/PULL
ZeroMQ 在 Python 和 C++ 中都可用
此外,为了传输大量数据(即
pointcloud
),ROS 中有一种机制称为nodelet
,该机制仅在 C++ 中支持。这种通信基于机器上的共享内存而不是 TCP-ROS 套接字。
推荐阅读
- apache-spark - 如何在 Kubernetes 集群中自动扩展 Spark 作业
- go - 我可以在配置文件中指定 GO 构建文件名吗?
- c++ - 在 Linux 中读取 UTF-16 文件
- java - Java 8 使用流来区分具有重复字段值的对象
- c++ - 如何在 std::array<> 上使用 std::for_each 并对每个元素应用 lambda 函数?
- java - 限制类属性大小
- javascript - PHP/HTML 动态表
- machine-learning - GridSearchCV 冻结与线性支持向量机
- html - Windows 10 上的表格渲染添加了空白
- python - 通过激活按钮更改标签上的文本