ROS-如何发布消息并立即获取订阅的回调

时间:2019-10-30 16:32:11

标签: ros

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

是否存在用于发送/发布和输出的阻塞功能的机制,它会一直等到收到输出?

3 个答案:

答案 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.

  

Learn more in ros-wiki

  • GitHub上的项目存储库。

[更新]

  • 如果您正在寻找快速通信,则TCP-ROS通信不是您的目的,因为它比ZeroMQ这样的无代理通信器(具有低延迟和高吞吐量)要慢:

    1. ZeroMQ中等效于ROS的服务模式为REQ/REP (client/server)
    2. ZeroMQ中等效的ROS发布者/订阅者模式为PUB/SUB
    3. 在ZeroMQ中等效于waitformessage的ROS发布者/订阅者为PUSH/PULL
      

    ZeroMQ在Python和C ++中均可用

  • 此外,要传输大量数据(即pointcloud),ROS中有一种机制叫nodelet,只有C ++支持这种机制。此通信基于计算机上的共享内存,而不是基于TCP-ROS套接字。

      

    What exactly is a nodelet?

答案 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并将接收到的消息手动传递给您的“回调”。

我希望这就是您想要的。