我有一个ROS节点,它允许您向其“发布”数据结构,并通过发布输出来响应该数据结构。我发布的内容和发布的内容的时间戳匹配。
是否存在用于发送/发布和输出的阻塞功能的机制,它会一直等到收到输出?
答案 0 :(得分:1)
我认为您需要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.
[更新]
如果您正在寻找快速通信,则TCP-ROS通信不是您的目的,因为它比ZeroMQ这样的无代理通信器(具有低延迟和高吞吐量)要慢:
waitformessage
的ROS发布者/订阅者为PUSH/PULL ZeroMQ在Python和C ++中均可用
此外,要传输大量数据(即pointcloud
),ROS中有一种机制叫nodelet
,只有C ++支持这种机制。此通信基于计算机上的共享内存,而不是基于TCP-ROS套接字。
答案 1 :(得分:0)
为了获得此请求/答复行为,ROS具有一种称为ROS service的机制。
您可以在类似于ROS消息定义的服务文件中指定服务的输入和输出。然后,您可以使用输入来调用节点的服务,当服务完成时,调用将收到输出。
Here是一个教程,介绍了如何在python中使用此机制。如果您更喜欢C ++,也应该找到它。
答案 2 :(得分:0)
由于您希望坚持使用发布/订阅者,因此从您的评论中假定服务会变慢,我将看看$str = Get-Item -Path 'C:\Path\To\WW-459-1-6401HR5.txt' | Select-Object -Property Name -ExpandProperty Name
$newStr = $str.Substring(0,$str.IndexOf("640")-1)
$newstr
$ext = $str.Substring($str.IndexOf("."),$str.Length - $str.IndexOf("."))
$ext
$finalStr = $newStr + $ext
$finalStr
(Documentation)。
有关如何使用它的示例,您可以查看this ros answers question。
您需要做的就是发布数据并立即在输出主题上调用waitForMessage并将接收到的消息手动传递给您的“回调”。
我希望这就是您想要的。