ROS教程 0:ROS介绍


ROS官网

本文作为ROS系列教程中的序言,介绍了什么是ROS,以及为什么要学习ROS

ROS教程 0:ROS介绍

在我的小破站一周岁之际,我许下了一个心愿,就是希望能够在小破站新的一岁中,完成几个我心心念念的项目,其中就包括写一个ROS教程出来。恰逢最近完成了上一个心愿:写完一个自己的操作系统,值此之际我就开始ROS教程这一个新的系列。

而作为ROS系列教程的序言,本文就将介绍如何什么是ROS

1. 机器人简介

1.1 什么是机器人

当我们说到机器人的时候,我们脑子中会出现一个什么样的形象?类似终结者中的人形机器人?类似下面的NAO机器人?

NAO机器人

中文将Robot译为“机器”,但实际上Robot所指的机器人并不一定为人形,无论形状,只要满足定义,皆可被称为“机器人”,而若要专门指代人形的机器人,则被称为Android,即人形机器人,又称安卓。

而机器人的定义有很多,比较广泛接受的定义是1967年日本科学家森政弘与合田周平提出:

机器人是一种具有移动性个体性智能性通用性半机械半人性自动性奴隶性等7个特征的柔性机器

因此,按照上述定义,机器人本质上依旧是机器。讲到这里,我们需要先说说机械和机器的区别

  • 机械是单纯的以力学原理组成的装置结构
  • 机器是在机械的基础上,添加了电子电器控制系统,从而使得需要人来控制的机械可以自动化的运行

因此,机器 = 机械 + 电子电器

机械和机器的区别

因此,明白了机器的定义之后,我们就明白了什么是机器人。机器人在机器的基础上,又具有了移动性自动性等特性。因此,机器人 = 机械结构 + 电子电气控制系统 + 自动化

1.2 机器人的组成

经过上面的介绍,我们明白了什么是机器人。也明白了创造出一个机器人需要的全部内容:

创造一个机器人需要的内容

1.3 软件层面的机器人开发:ROS

对于机器人从底层到高层的所有流程中,机械结构、电气驱动、电子控制和系统管理都还好说,都有专门的解决方案,例如:机械运用可以用AutoCADRhino来进行设计、测试,电气驱动则有专门的电机厂商,电机芯片也可以单独购买,系统有LinuxUbuntu等等开源操作系统。

唯独只有上层的软件控制我们没法找到一个解决方案。因此,ROS正是诞生在这个背景下。ROS是软件层面的机器人开发工具,用官网的话来说:

ROS是一套软件库和工具的集合:

  • 软件库包括从驱动程序到算法
  • 工具则包括各种开发工具

The Robot Operating System (ROS) is a set of software libraries and tools that help you build robot applications. From drivers to state-of-the-art algorithms, and with powerful developer tools, ROS has what you need for your next robotics project. And it’s all open source.

因此,作为程序员,我们是从软件的角度去开发机器人的,就必须要学会ROS

2. ROS介绍

2.1 ROS简介

机器人体系是相当庞大的,其复杂度之高,以至于没有任何个人、组织甚至公司能够独立完成系统性的机器人研发工作。因此,一种更合适的策略是:让机器人研发者专注于自己擅长的领域,其他模块则直接复用相关领域更专业研发团队的实现,当然自身的研究也可以被他人继续复用。这种不重复发明轮子的原则,显然是可以大大提高机器人的研发效率的,尤其是随着机器人硬件越来越丰富,软件库越来越庞大,这种复用性和模块化开发需求也愈发强烈。

在此大背景下,于 2007 年,一家名为 柳树车库(Willow Garage)的机器人公司发布了 ROS(机器人操作系统),ROS是一套机器人通用软件框架,可以提升功能模块的复用性,并且随着该系统的不断迭代与完善,如今 ROS 已经成为机器人领域的事实标准。

不要重复造轮子

2.2 ROS的特点

机器人开发的分工思想,实现了不同研发团队间的共享和协作,提升了机器人的研发效率,为了服务“ 分工”,ROS有如下的特点:

  • 代码复用ROS的目标不是成为具有最多功能的框架,ROS的主要目标是支持机器人技术研发中的代码重用
  • 分布式ROS是进程(也称为Nodes)的分布式框架,ROS中的进程可分布于不同主机,不同主机协同工作,从而组成机器人集群
  • 松耦合ROS中功能模块封装于独立的功能包或元功能包,便于分享,功能包内的模块以节点为单位运行,以ROS标准的IO作为接口,开发者不需要关注模块内部实现,只要了解接口规则就能实现复用,实现了模块间点对点的松耦合连接
  • 精简ROS被设计为尽可能精简,以便为ROS编写的代码可以与其他机器人软件框架一起使用。ROS易于与其他机器人软件框架集成:ROS已与OpenRAVEOrocosPlayer集成。
  • 语言独立性:包括JavaC++Python等。为了支持更多应用开发和移植,ROS被实现为为一种语言弱相关的框架结构,使用简洁,中立的定义语言描述模块间的消息接口,在编译中再产生所使用语言的目标文件,为消息交互提供支持,同时允许消息接口的嵌套使用
  • 易于测试ROS具有称为rostest的内置单元/集成测试框架,可轻松安装和拆卸测试工具。
  • 大型应用ROS适用于大型运行时系统和大型开发流程。
  • 丰富的组件化工具包:ROS可采用组件化方式集成一些工具和软件到系统中并作为一个组件直接使用,如RVIZ(3D可视化工具),开发者根据ROS定义的接口在其中显示机器人模型等,组件还包括仿真环境和消息查看工具等
  • 免费且开源:开发者众多,功能包多

正是因为ROS有如此多的优点,目前为止,软件层面上开发机器人就等价于ROS开发。

2.3 ROS的发展历程

学习一个东西,我们还需要知道这个东西的发展历史

ROS诞生之前,很多学者认为,机器人研究需要一个开放式的协作框架,并且已经有不少类似的项目致力于实现这样的框架。这些工作有:

  • 斯坦福STandford AI Robot, STAIR(人工智能机器人)项目
  • Personal Robots, PR(个人机器人)项目

在上述项目中,创建了一系列用于机器人开发的软件,可以用于机器人学研究。

2007年,一家名为Willow Garage(柳树车库)的公司,为斯坦福大学机器人项目提供了大量资金支持,并自愿将项目中的软件系统进行扩展与完善,最终,在无数研究人员的共同努力下,斯坦福大学中的诸多项目逐渐汇集在一起,最终形成了ROS

ROS的完善是Willow Garage在开发PR2机器人时候完成的。PR2是一种人形机器人(即上文说的Android),可以在已知环境中自主导航。Willow Garage知道PR2不会是市场上唯一的机器人,所以在完善斯坦福的程序的时候,预期把这些程序写成PR2`的个性化程序,不如该进程一个通用的、可扩展的标准软件,以在未来改进或修改机器人。

因此,他们通过定义对其他机器人有用的抽象级别来开发中间件ROS。他们以PR2特征为指导:

  • 单体机器人
  • 无实时要求
  • 出色的网络连接
  • 跨平台(例如,在移动基地和人形机器人上同样有效)

最终就得到了ROS的早期版本。

需要注意的是,早期版本的ROS其实依旧非常不完善,在后续的版本中ROS经过不断改进,才形成了现在这样完善的机器人开发框架。ROS每年会发行一个新的版本,称为发行版(ROS Distribution, ROS Distro),类似于Ubuntu的长期支持版,新的发行版中对旧的发行版的一些工具、软件包进行了升级。

推出ROS发行版本的目的在于使开发人员可以使用相对稳定的代码库的同时不断更新工具,而为了实现这么目的,每一个发行版都有一个生命周期(End of Life, EOL)的概念。

所谓生命周期的概念,指的是在生命周期内,ROS官方会对这一版本的ROS中的工具、软件库中的bug进行修复,同时提供对核心软件包的效率上的改进,直到这一版本的ROS发行版生命期结束。因此,这样做的好处就是给使用者提前进行了通知,给用户预留了足够的时间让用户提前学习、切换到新的发行版。

需要说明的是,版本之间的工具的升级可能是功能上的升级,例如为函数添加了新的参数,从在原有的功能的基础上新加了功能,生命周期内同一个版本的工具的升级,往往是效率上的升级,而非功能上的增加。

下面是ROS的所有公开的版本,每个版本都有自己的名称、海报、生命周期和乌龟标志。

ROS各个发行版的名称、发行日期以及生命期

ROS版本特点: 按照英文字母顺序命名,ROS 目前已经发布了ROS1 的终极版本: noetic。在noetic版本之后,ROS官方推出的发行版就将是基于ROS2的发行版

2.4 ROS的版本:ROS1ROS2

上面我们说到了noeticROS1的最终版,之后的版本都是ROS2,而这就意味着ROS有两个版本:ROS1ROS2。这到底是为什么呢?

上面说到,ROS1的发展历史可以追溯到2007年,当时斯坦福大学的人工智能实验室(AI Lab)开始开发一个用于机器人研究的软件框架,即ROS1的前身。ROS1于2010年首次发布,并迅速成为机器人领域的主流开源框架。在过去的十多年里,ROS1积累了庞大的用户和开发者社区,并得到了广泛应用于学术研究、工业应用和个人项目等领域。

然而,随着时间的推移,ROS1也暴露出一些局限性和不足之处。其中一些问题包括通信机制的性能瓶颈、实时性的限制、安全性的缺乏以及对多种编程语言的支持不足等。为了解决这些问题并满足日益增长的机器人应用需求,ROS2于2014年开始开发,并于2017年发布了首个稳定版本。

ROS2在设计上采用了一种全新的通信机制DDSData Distribution Service),它提供了高性能、实时、可靠的通信能力,更适合大规模机器人系统。此外,ROS2还引入了对多种编程语言的广泛支持,包括C++PythonJavaJavaScript等,使得开发者可以使用自己熟悉的语言编写ROS2应用程序。

为什么会有两个版本的区分呢?这主要是由于ROS2的设计目标和一些重大变化导致的。ROS2在设计时考虑了一些ROS1存在的问题,并进行了一系列的改进和优化。然而,由于ROS1的广泛应用和庞大的用户社区,直接替换ROS1可能会导致现有的ROS1应用程序无法兼容或迁移困难。因此,为了平衡新旧版本之间的过渡和兼容性,ROS2作为一个新的版本并行存在,并逐渐发展壮大自己的用户和开发者社区。

ROS2的目标是逐渐取代ROS1,成为未来机器人应用开发的主流框架。尽管如此,ROS1仍然是一个活跃的项目,并且在一些特定的应用场景或项目中仍然被广泛使用。因此,ROS1ROS2的并行存在为用户提供了更灵活的选择,可以根据自身需求和现有代码库的情况选择使用适合的版本。

2.5 学习建议

ROS2是在ROS1的基础上改进得到的版本,其中的诸多概念都得到了继承和发展,因此对于初学者而言,学习ROS1可能更容易上手,更容易掌握ROS的基础概念。

而虽然ROS1仍然广泛使用,但ROS2被认为是未来机器人应用开发的主流框架。ROS2的社区在不断发展壮大,新功能和改进不断推出。所以在学习完ROS1之后,我们还需要学习ROS2


文章作者: Jack Wang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Wang !
  目录