ROS发布/订阅是多对多(在连接方面)和单向的
数据传输。它是异步的,这意味着你的代码不会阻塞,你需要实现一个异步的回调函数。在
另一方面,ROS服务是同步的、一对一的双向数据传输,这意味着客户机阻塞并等待来自服务器的响应。在
考虑以下情况:想象一个机器人和一个带有机器人模型的模拟器。模拟器需要实时更新机器人的模型(当真实世界中的机器人改变配置时,模拟器需要更新模型以反映这种变化,这样模拟器中的机器人模型总是与真实机器人的当前配置保持同步)。在
设想一个控制机器人收银员的节点。此节点需要使用机器人的摄像头检测到客户,以开始交互。在
在第一种情况下,您将需要一个发布/订阅模型,因为模拟器在执行其他操作时需要数据实时流动。因此,机器人将把它的关节值发布到一个主题,模拟器将使用一个回调函数订阅该主题,该函数将实时异步更新模拟器中的机器人模型。在
然而,在第二种情况下,您不希望节点不断检查客户,也不是您希望经常做的事情。在程序逻辑中,您知道何时需要检测客户。当您第一次启动节点时,您知道需要阻塞并等待客户进来。在这里使用服务更合适。当你想检测一个客户时,你会向服务器发送一个请求(结果你的程序会阻塞等待响应)。服务器将使用摄像头检测客户(使用某种检测算法),并相应地向您作出响应。在
一般来说,当您需要数据持续流动并想异步处理这些数据时,您将使用发布/订阅;当您需要同步进行特定计算时,您将使用服务。在