- ROS机器人开发实践
- 胡春旭
- 2355字
- 2022-05-18 19:41:14
1.1 ROS是什么
1.1.1 ROS的起源
硬件技术的飞速发展在促进机器人领域快速发展和复杂化的同时,也对机器人系统的软件开发提出了巨大挑战。机器人平台与硬件设备越来越丰富,致使软件代码的复用性和模块化需求越发强烈,而已有的机器人系统又不能很好地适应需求。相比硬件开发,软件开发明显力不从心。为迎接机器人软件开发面临的巨大挑战,全球各地的开发者与研究机构纷纷投入机器人通用软件框架的研发工作当中。在近几年里,产生了多种优秀的机器人软件框架,为软件开发工作提供了极大的便利,其中最为优秀的软件框架之一就是机器人操作系统(Robot Operating System,ROS)。
ROS是一个用于编写机器人软件的灵活框架,它集成了大量的工具、库、协议,提供了类似操作系统所提供的功能,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间的消息传递、程序发行包管理,可以极大简化繁杂多样的机器人平台下的复杂任务创建与稳定行为控制。
ROS最初应用于斯坦福大学人工智能实验室与机器人技术公司Willow Garage合作的个人机器人项目(Personal Robots Program),2008年后由Willow Garage维护。该项目研发的机器人PR2在ROS框架的基础上可以完成打台球、插插座、叠衣服、做早饭等不可思议的功能(见图1-1),由此引起了越来越多的关注。2010年,Willow Garage正式以开放源码的形式发布了ROS框架,并很快在机器人研究领域掀起了ROS开发与应用的热潮。
图1-1 PR2已经可以完成丰富的应用功能
在短短的几年时间里,ROS得到了广泛应用(见图1-2),各大机器人平台几乎都支持ROS框架,如Pioneer、Aldebaran Nao、TurtleBot、Lego NXT、AscTec Quadrotor等。同时,开源社区内的ROS功能包呈指数级增长,涉及的应用领域包括轮式机器人、人形机器人、工业机器人、农业机器人等,美国NASA已经开始研发下一代基于ROS的火星探测器。
图1-2 不同国籍ROS开发者的比例变化、ROS关注度最高的功能包、ROS相关论文的数量变化
ROS在机器人领域的浪潮也涌入国内,近年来国内机器人开发者也普遍采用ROS开发机器人系统,不少科研院校和高新企业已经在ROS的集成方面取得了显著成果,并且不断反哺ROS社区,促进了开源社区的繁荣发展。
ROS的迅猛发展已经使它成为机器人领域的事实标准。
1.1.2 ROS的设计目标
ROS的设计目标是提高机器人研发中的软件复用率,所以它被设计成为一种分布式结构,使得框架中的每个功能模块都可以被单独设计、编译,并且在运行时以松散耦合的方式结合在一起。ROS主要为机器人开发提供硬件抽象、底层驱动、消息传递、程序管理、应用原型等功能和机制,同时整合了许多第三方工具和库文件,帮助用户快速完成机器人应用的建立、编写和多机整合。而且ROS中的功能模块都封装于独立的功能包(Package)或元功能包(Meta Package)中,便于在社区中共享和分发。
从机器人的角度来看,那些人类微不足道的行为常常基于复杂的任务需求和环境影响,对于这些问题的处理具有极大的复杂度,单一的开发者、实验室或者研究机构都无法独立完成。ROS的出现就是为了鼓励更多的开发者、实验室或者研究机构共同协作来开发机器人软件(见图1-3)。例如一个拥有室内地图建模领域专家的实验室可能会开发并发布一个先进的地图建模系统;一个拥有导航方面专家的组织可以使用建模完成的地图进行机器人导航;另一个专注于机器人视觉的组织可能开发出了一种物体识别的有效方法。ROS为这些组织或机构提供了一种相互合作的高效方式,可以在已有成果的基础上继续自己工作的构建。
图1-3 ROS由核心通信机制、开发工具、应用功能和生态系统四个部分组成
1.1.3 ROS的特点
ROS的核心——分布式网络,使用了基于TCP/IP的通信方式,实现了模块间点对点的松耦合连接,可以执行若干种类型的通信,包括基于话题(Topic)的异步数据流通信,基于服务(Service)的同步数据流通信,还有参数服务器上的数据存储等。总体来讲,ROS主要有以下几个特点。
(1)点对点的设计
在ROS中,每一个进程都以一个节点的形式运行,可以分布于多个不同的主机。节点间的通信消息通过一个带有发布和订阅功能的RPC传输系统,从发布节点传送到接收节点。这种点对点的设计可以分散定位、导航等功能带来的实时计算压力,适应多机器人的协同工作。
(2)多语言支持
为了支持更多应用的移植和开发,ROS被设计成为一种语言弱相关的框架结构。ROS使用简洁、中立的定义语言描述模块之间的消息接口,在编译过程中再产生所使用语言的目标文件,为消息交互提供支持,同时也允许消息接口的嵌套使用。目前已经支持Python、C++、Java、Octave和LISP等多种不同的语言,也可以同时使用这些语言完成不同模块的编程。
(3)架构精简、集成度高
在已有繁杂的机器人应用中,软件的复用性是一个巨大的问题。很多驱动程序、应用算法、功能模块在设计时过于混乱,导致其很难在其他机器人或应用中进行移植和二次开发。而ROS框架具有的模块化特点使得每个功能节点可以进行单独编译,并且使用统一的消息接口让模块的移植、复用更加便捷。同时,ROS开源社区中移植、集成了大量已有开源项目中的代码,例如Open Source Computer Vision Library(OpenCV库)、Point Cloud Library(PCL库)等,开发者可以使用丰富的资源实现机器人应用的快速开发。
(4)组件化工具包丰富
移动机器人的开发往往需要一些友好的可视化工具和仿真软件,ROS采用组件化的方法将这些工具和软件集成到系统中并可以作为一个组件直接使用。例如3D可视化工具rviz(Robot Visualizer),开发者可以根据ROS定义的接口在其中显示机器人3D模型、周围环境地图、机器人导航路线等信息。此外,ROS中还有消息查看工具、物理仿真环境等组件,提高了机器人开发的效率。
(5)免费并且开源
ROS遵照的BSD许可给使用者较大的自由,允许其修改和重新发布其中的应用代码,甚至可以进行商业化的开发与销售。ROS开源社区中的应用代码以维护者来分类,主要包含由Willow Garage公司和一些开发者设计、维护的核心库部分,以及由不同国家的ROS社区组织开发和维护的全球范围的开源代码。在短短的几年里,ROS软件包的数量呈指数级增长,开发者可以在社区中下载、复用琳琅满目的机器人功能模块,这大大加速了机器人的应用开发。