ROS简介
- 个人理解,如有纰漏请指出。
什么是ROS
ROS是面向机器人的开源的元操作系统(meta-operating system)。它能够提供类似传统操作系统的诸多功能,如硬件抽象、底层设备控制、常用功能实现、进程间消息传递和程序包管理等。此外,它还提供相关工具和库,用于获取、编译、编辑代码以及在多个计算机之间运行程序完成分布式计算。
这是维基上的解释,让我们结合项目仔细分析一下。
假设我们要制作一个无人机,进行路径规划算法的验证,有一些传感器比如GPS,陀螺仪,气压计作为输入,上位机通过一些运算,计算出无人机行进的路线,然后将路线传给飞控,飞控对电机进行控制,最终实现无人机的路线规划。
如果整个框架都要自己来写,那我们需要了解各个传感器的通信方式,电机的控制,还需要将这些与顶层算法进行交互,这需要懂得东西就很多了,现在有了飞控,对底层的传感器已经做了一层抽象,将同一时刻的各个传感器的数据组成一个数据包以MAVLink协议的形式向上层传输。处理计算机需要做的就是读出这个以MAVLink协议的数据包,作为输入,进行一系列计算,输出目标点的经度、纬度、高度等信息,并交由飞控对飞机进行调整,飞往目标点。换句话说,我们需要一个中间件,来翻译MAVLink协议,这就有很多种选择了,为了开发方便,我们选用了ROS作为这一个翻译者,但ROS的作用远不止翻译的功能。
分布式计算
- 一些机器人搭载多台计算机,每台计算机用于控制机器人的部分驱动器或传感器
- 即使只有一台计算机,通常仍将程序划分为独立运行且相互协作的小的模块来完成复杂的控制任务,这也是常见的做法
- 当多个机器人需要协同完成一个任务时,往往需要互相通信来支撑任务的完成
- 用户通常通过台式机、笔记本或者移动设备发送指令控制机器人,这种人机交互接口可以认为是机器人软件的一部分
ROS1只是相对的分布式计算,对节点来说是分布式的,但Master层面上并不是分布式,还是需要主从节点的方式,ROS2在这个基础上进行了底层通信方式的改进,使用DDS(Data Distribution Service)数据分发服务进行真正意义上的分布式计算。
软件复用
ROS标准包(Standard Packages)提供稳定、可调式的各类重要机器人算法实现。
ROS通信接口正在成为机器人软件互操作的事实标准,也就是说绝大部分最新的硬件驱动和最前沿的算法实现都可以在ROS中找到。例如,在ROS的官方网页上有着大量的开源软件库,这些软件使用ROS通用接口,从而避免为了集成它们而重新开发新的接口程序。
快速测试
精心设计的ROS系统框架将底层硬件控制模块和顶层数据处理与决策模块分离,从而可以使用模拟器替代底层硬件模块,独立测试顶层部分,提高测试效率。
ROS另外提供了一种简单的方法可以在调试过程中记录传感器数据及其他类型的消息数据,并在试验后按时间戳回放。通过这种方式,每次运行机器人可以获得更多的测试机会。例如,可以记录传感器的数据,并通过多次回放测试不同的数据处理算法。在ROS术语中,这类记录的数据叫作包(bag),一个被称为rosbag的工具可以用于记录和回放包数据
软件结构
我们可以通过ROS的分布式计算来一窥其软件结构和设计思想。
节点
ROS用节点(Node)的概念表示一个应用程序,不同node之间通过事先定义好格式的话题(Topic),服务(Service),动作(Action)来实现连接。
话题
消息传递的理念是:当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或者多个话题;当一个节点想要接收信息时,它就会订阅(subscribe)它所需要的一个或者多个话题。ROS节点管理器负责确保发布节点和订阅节点能找到对方;而且消息是直接地从发布节点传递到订阅节点,中间并不经过节点管理器转交。
所有订阅该话题的节点都会收到该话题上的所有消息,不管你是否想要接收。
详细点讲:”生产”消息的程序只管发布消息,而不用关心该消息是如何被消费的; 消费消息的程序只管订阅该话题或者他所需要消息的所有话题,而不用关心这些消息数据是如何生产的。
这个特性十分重要,这就意味着我们在这种通信机制中是一对多或者多对一的机制,而在下一种通信机制中将是一对一的机制!
服务
服务调用是双向的,一个节点给另一个节点发送信息并等待响应,因此信息流是双向的。作为对比,当消息发布后,并没有响应的概念,甚至不能保证系统内有节点订阅了这些消息。
服务调用实现的是一对一通信。每一个服务由一个节点发起,对这个服务的响应返回同一个节点。另一方面,每一个消息都和一个话题相关,这个话题可能有很多的发布者和订阅者。
最后,总结一下
ROS的优点
首先是开源,带来的是完善的社区,遇到的大部分问题基本都能搜到,也带来了更多的扩展,MATLAB2015以后版本内建了ROS的支持,模块化使得其可以随意增删功能,使用了语言无关的消息类型,使其可以支持多种编程语言,C++,Python,JAVA等都支持,可以很方便的进行数据的绘制,也是PX飞控推荐使用的交互方式之一。
ROS的不足
- 多个机器人组成的集群; ROS的单master结构就蛋疼了。
- 小型嵌入式平台,甚至“裸奔”的微控制器;依赖于Ubuntu的ROS太重了。
- 实时系统:包括进程间和跨机器通信,ROS做不到。
- 非理想的网络;ROS延迟很大,甚至断网再连接时会挂。
- 生产制造等环境:ROS可靠性还不够。