ROS通信原理介绍
扫描二维码
随时随地手机看文章
本文将主要对clearpathrobotics网站关于ROS的介绍进行翻译。
1,何为ROS?
ROS(Robot Operating System)是遵从BSD许可的系统,它可以在PC上控制机器人的各个组件。ROS系统由多个各自独立的节点(组件)组成,并且各个节点之间可以通过发布/订阅(publish/subscribe)消息模型进行通信。例如,我们将一个特定传感器的驱动模块作为一个ROS节点,其将传感器数据发布(publish)到消息流。这些消息可能会被某些节点获取到,例如滤波器、记录器、更高级系统中的应用如导航、路径查找等节点。
(从此段可以理解,ROS的publish操作为某个节点将其自身数据或传感器数据发送到一个注册到ROS中的消息池中,其他节点可以申请获取数据,而publish数据的节点不关心哪些节点需要,其他节点如何获取数据将在下面介绍。)
2,为何使用ROS?
ROS中的节点可以运行在不同的系统、平台,甚至是不同的架构中。假如有一个Arduino publish的消息,你可以使用笔记本订阅(subscribe)此消息,也可以使用android手机驾驶摩托。对于用户的需求,ROS具有灵活适应性,并且它还是开源的,任何人都可以对它进行维护。
3,核心概念
ROS启动于ROS Master。Master允许其他ROS中不同软件片(节点)查找对方或与对方交流。那样,我们就不必指定“发送传感器数据到IP为127.0.0.1的电脑”,我们只需要简单的告诉Node1发送消息到Node2.
如何实现节点间消息传递呢?通过publishing 和 subscribing Topics。
设想有一部相机安装在机器人上,我们希望可以从相机中或者笔记本上看到图像,同时让机器人也可以看到这些图像。
在我们的例子中,我们定义一个Camera Node,用于和相机通信(驱动),一个Image Processing Node运行在机器人上处理图像数据,一个Image Display Node用于将图像显示在屏幕上。开始阶段,所有节点(Node)都要注册到Master上。Master可以认为是一个查询表,各个节点可以查询它要把消息发送到哪个节点(peer to peer communication)。
注册到ROS Master后,Camera Node 声明它要Publish一个Topic叫做/image_data。另外两个节点(Image Processing Node and Image Display Node)声明他们Subscribe这个Topic /image_data。因此,一旦Camera Node 收到Camera发送的数据,就立即将数据/image_data直接发送到另外两个节点。(实际上,这就类似于TCP/IP直连,不同的是他们是通过同一个通道image_data,这个image_data应该就类似于共享内存,这个理解不知道是否正确或者恰当。)
那么你又想了,如果Image Processing Node想主动获取Camera Node收到的数据怎么办呢?ROS定义了Services用于解决这个问题。
节点可以在ROS Master上注册一个特定的service,就像注册它的消息(topic)一样。在我们的例子中,Image Processing Node第一次请求/image_data,Camera Node将收集Camera的数据,然后发送给Image Processing Node。