前言

已有的通讯模型

Topic通讯

Topic通讯解决了数据共享的问题,在机器人领域,我们可以理解成一些传感器设备,例如GPS,摄像头,激光雷达等传感器,可以不间断的发布数据,这些传感器也不关心有没有接收者,也不关心接收者是否有收到数据,这个就是Topic的特点。

Service通讯

Service通讯解决了控制交互的问题,在机器人领域,我们可以理解成一些实时的指令操作,或者是实时的数据处理。例如发出指令去打开照明灯,这个时候是需要知道是否打开的。再比如说,对于一些需要算力的实时逻辑操作,有的设备算力不够,就需要算力比较高的机器进行计算,将计算结果返回。例如图片处理,本地算了不够,交给算力够的处理,结果返回即可。

通讯形式的不足

在机器人控制领域中,我们有一些场景,需要一些特殊的通讯形式。例如,现在有一个机械臂,希望通过指令控制机械臂运动到一个特定的位置。那么这个操作,我们会带来一些思考:

  • 机械臂不是立刻马上就能到一个具体的位置。这是一个延时的操作。
  • 机械臂什么时候能到这个指定的位置呢,因为只有到了指定的位置我才能控制它做下一步操作。需要知道执行结果通知。
  • 在机械臂去往指定目标位置时,我想知道距离目标还有多远。想要获得执行的进度信息。
  • 在机械臂去往指定目标位置时,我突然不想让它去了。可以控制操作的取消。

以上这些的思考,是真实的业务需求。这里牵涉到了控制模块和机械臂模块间通讯的问题。

这里的通讯需求,不同意Service通讯,是一个异步操作,是可以获得操作进度的,是可以获得操作结果的,是可以随时取消的。

这个时候ROS提供了新的通讯模式:Action通讯

几种通讯模式特点对比

Topic Service Action
响应机制 结果响应 进度响应,结果响应
同步性 异步 同步 异步
通讯模型 PublisherSubscriber ClientServer ClientServer
Node对应关系 多对多 多(Client)对一(Server) 多(Client)对一(Server)