来源:第三维度
节选自:机器人操作系统(ROS)浅析
作者: Jason M. O’Kane(美)
编译:肖军浩
因为集成了全世界机器人领域顶级科研机构,包括斯坦福大学、麻省理工学院、慕尼黑工业大学、加州大学伯克利分校、佐治亚理工大学、弗莱堡大学、东京大学等多年的研究成果,开源机器人操作系统(Robot Operating System,简称 ROS)甫一问世便受到了科研人员的广泛关注。随后,ROS 又借助开源的魅力吸引了世界各地机器人领域的仁人志士群策群力,推动其不断进步。
2013 年麻省理工学院科技评论(MIT Technology Review)指出:“从 2010 年发布 1.0 版本以来,ROS 已经成为机器人软件的事实标准(de facto standard)”。
近年来,机器人领域取得了举世瞩目的进展。性价比较高的机器人平台,包括地面移动机器人、旋翼无人机和类人机器人等,得到了广泛应用。更令人感到振奋的是,越来越多的高级智能算法让机器人的自主等级逐步提高。尽管如此,对于机器人软件开发人员来说,仍然存在着诸多挑战。
机器人操作系统 (RobotOperating System, 或简称 ROS)可以帮助提高机器人软件的开发效率。ROS 系统的官方定义如下:ROS是面向机器人的开源的元操作系统(meta-operatingsystem)。它能够提供类似传统操作系统的诸多功能,如硬件抽象、底层设备控制、常用功能实现、进程间消息传递和程序包管理等。此外,它还提供相关工具和库,用于获取、编译、编辑代码以及在多个计算机之间运行程序完成分布式计算。
虽然上述定义很准确,强调了 ROS 与传统操作系统的异同,但可能仍然无法让读者抓住 ROS 的核心要义,尤其是使用 ROS 能够给机器人软件开发带来哪些优势。一般而言,学习一个新的系统框架,特别是 ROS 这样复杂多样的框架,往往要耗费大量的时间和精力,因此我们必须确保付出这个代价是有意义的。
下面简单列举几个使用 ROS 能够解决的机器人软件开发问题。
分布式计算
现代机器人系统往往需要多个计算机同时运行多个进程,例如:一些机器人搭载多台计算机,每台计算机用于控制机器人的部分驱动器或传感器;即使只有一台计算机,通常仍将程序划分为独立运行且相互协作的小的模块来完成复杂的控制任务,这也是常见的做法;
● 当多个机器人需要协同完成一个任务时,往往需要互相通信来支撑任务的完成;
● 用户通常通过台式机、笔记本或者移动设备发送指令控制机器人,这种人机交互接口可以认为是机器人软件的一部分。
● 单计算机或者多计算机不同进程间的通信问题是上述例子中的主要挑战。ROS 为实现上述通信提供两种相对简单、完备的机制,我们将在第三章和第八章进行详细讨论。
软件复用
随着机器人研究的快速推进,诞生了一批应对导航、路径规划、建图等通用任务的算法。当然,任何一个算法实用的前提是其能够应用于新的领域,且不必重复实现。事实上,如何将现有算法快速移植到不同系统一直是一个挑战,ROS 通过以下两种方法解决这个问题。
● ROS 标准包(Standard Packages)提供稳定、可调式的各类重要机器人算法实现。
● ROS通信接口正在成为机器人软件互操作的事实标准,也就是说绝大部分最新的硬件驱动和最前沿的算法实现都可以在ROS中找到。
例如,在ROS的官方网页上有着大量的开源软件库,这些软件使用ROS通用接口,从而避免为了集成它们而重新开发新的接口程序。
综上所述,开发人员如果使用 ROS 可以——当然,在具备 ROS基础知识后——将更多的时间用于新思想和新算法的设计与实现,尽量避免重复实现已有的研究结果。
快速测试
为机器人开发软件比其他软件开发更具挑战性,主要是因为调试准备时间长,且调试过程复杂。况且,因为硬件维修、经费有限等因素,不一定随时有机器人可供使用。ROS 提供两种策略来解决上述问题。
● 精心设计的 ROS 系统框架将底层硬件控制模块和顶层数据处理与决策模块分离,从而可以使用模拟器替代底层硬件模块,独立测试顶层部分,提高测试效率。
● ROS 另外提供了一种简单的方法可以在调试过程中记录传感器数据及其他类型的消息数据,并在试验后按时间戳回放。通过这种方式,每次运行机器人可以获得更多的测试机会。
例如,可以记录传感器的数据,并通过多次回放测试不同的数据处理算法。在 ROS 术语中,这类记录的数据叫作包(bag),一个被称为 rosbag 的工具可以用于记录和回放包数据,采用上述方案的一个最大优势是实现代码的“无缝连接”,因为实体机器人、仿真器和回放的包可以提供同样(至少是非常类似)的接口,上层软件不需要修改就可以与它们进行交互,实际上甚至不需要知道操作的对象是不是实体机器人。
当然,ROS 操作系统并不是唯一具备上述能力的机器人软件平台。在笔者看来,ROS 的最大不同在于来自机器人领域诸多开发人员的认可和支持,这种支持将促使 ROS 的未来不断发展、完善、进步。
对 ROS 的误解…
让我们用一点时间来澄清容易对 ROS 产生的误解,另一个侧面来认识 ROS。
● ROS不是一种编程语言。实际上,ROS的主要代码由C++语言编写,本书后续章节也会介绍如何在ROS中使用C++进行编程。客户端库的编写还可以使用Python、Java5和Lisp6等其他多种语言 7编写。
● ROS 不仅是一个函数库,除包含客户端库(Client Libraries)外,还包含一个中心服务器(Central Server)、一系列命令行工具、图形化界面工具以及编译环境。
● ROS不是集成开发环境。虽然ROS没有规定软件开发环境,但几乎所有的主流IDE都可用于基于ROS的软件开发。此外,我们还可以根据个人喜好,使用普通的文本编辑器和命令行来完成相应的开发,而无需任何IDE。