本文作为
ROS
系列教程中的序言,介绍了什么是ROS
,以及为什么要学习ROS
ROS教程 0:ROS介绍
在我的小破站一周岁之际,我许下了一个心愿,就是希望能够在小破站新的一岁中,完成几个我心心念念的项目,其中就包括写一个ROS
教程出来。恰逢最近完成了上一个心愿:写完一个自己的操作系统,值此之际我就开始ROS
教程这一个新的系列。
而作为ROS系列教程的序言,本文就将介绍如何什么是ROS
。
1. 机器人简介
1.1 什么是机器人
当我们说到机器人的时候,我们脑子中会出现一个什么样的形象?类似终结者中的人形机器人?类似下面的NAO
机器人?
中文将Robot
译为“机器人”,但实际上Robot
所指的机器人并不一定为人形,无论形状,只要满足定义,皆可被称为“机器人”,而若要专门指代人形的机器人,则被称为Android
,即人形机器人,又称安卓。
而机器人的定义有很多,比较广泛接受的定义是1967年日本科学家森政弘与合田周平提出:
机器人
是一种具有移动性、个体性、智能性、通用性、半机械半人性、自动性、奴隶性等7个特征的柔性机器
因此,按照上述定义,机器人本质上依旧是机器。讲到这里,我们需要先说说机械和机器的区别
- 机械是单纯的以力学原理组成的装置结构
- 机器是在机械的基础上,添加了电子电器控制系统,从而使得需要人来控制的机械可以自动化的运行
因此,机器 = 机械 + 电子电器
因此,明白了机器的定义之后,我们就明白了什么是机器人。机器人在机器的基础上,又具有了移动性、自动性等特性。因此,机器人 = 机械结构 + 电子电气控制系统 + 自动化
1.2 机器人的组成
经过上面的介绍,我们明白了什么是机器人。也明白了创造出一个机器人需要的全部内容:
1.3 软件层面的机器人开发:ROS
对于机器人从底层到高层的所有流程中,机械结构、电气驱动、电子控制和系统管理都还好说,都有专门的解决方案,例如:机械运用可以用AutoCAD
、Rhino
来进行设计、测试,电气驱动则有专门的电机厂商,电机芯片也可以单独购买,系统有Linux
、Ubuntu
等等开源操作系统。
唯独只有上层的软件控制我们没法找到一个解决方案。因此,ROS
正是诞生在这个背景下。ROS
是软件层面的机器人开发工具,用官网的话来说:
ROS
是一套软件库和工具的集合:
- 软件库包括从驱动程序到算法
- 工具则包括各种开发工具
The
Robot Operating System
(ROS
) is a set ofsoftware libraries
andtools
that help you build robot applications. Fromdrivers
to state-of-the-artalgorithms
, and with powerfuldeveloper 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
已与OpenRAVE
,Orocos
和Player
集成。 - 语言独立性:包括
Java
,C++
,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
目前已经发布了ROS1
的终极版本: noetic
。在noetic
版本之后,ROS
官方推出的发行版就将是基于ROS2
的发行版
2.4 ROS
的版本:ROS1
和ROS2
上面我们说到了noetic
是ROS1
的最终版,之后的版本都是ROS2
,而这就意味着ROS
有两个版本:ROS1
和ROS2
。这到底是为什么呢?
上面说到,ROS1
的发展历史可以追溯到2007年,当时斯坦福大学的人工智能实验室(AI Lab)开始开发一个用于机器人研究的软件框架,即ROS1
的前身。ROS1
于2010年首次发布,并迅速成为机器人领域的主流开源框架。在过去的十多年里,ROS1
积累了庞大的用户和开发者社区,并得到了广泛应用于学术研究、工业应用和个人项目等领域。
然而,随着时间的推移,ROS1
也暴露出一些局限性和不足之处。其中一些问题包括通信机制的性能瓶颈、实时性的限制、安全性的缺乏以及对多种编程语言的支持不足等。为了解决这些问题并满足日益增长的机器人应用需求,ROS2
于2014年开始开发,并于2017年发布了首个稳定版本。
ROS2
在设计上采用了一种全新的通信机制DDS
(Data Distribution Service
),它提供了高性能、实时、可靠的通信能力,更适合大规模机器人系统。此外,ROS2
还引入了对多种编程语言的广泛支持,包括C++
、Python
、Java
和JavaScript
等,使得开发者可以使用自己熟悉的语言编写ROS2
应用程序。
为什么会有两个版本的区分呢?这主要是由于ROS2
的设计目标和一些重大变化导致的。ROS2
在设计时考虑了一些ROS1
存在的问题,并进行了一系列的改进和优化。然而,由于ROS1
的广泛应用和庞大的用户社区,直接替换ROS1
可能会导致现有的ROS1
应用程序无法兼容或迁移困难。因此,为了平衡新旧版本之间的过渡和兼容性,ROS2
作为一个新的版本并行存在,并逐渐发展壮大自己的用户和开发者社区。
ROS2
的目标是逐渐取代ROS1
,成为未来机器人应用开发的主流框架。尽管如此,ROS1
仍然是一个活跃的项目,并且在一些特定的应用场景或项目中仍然被广泛使用。因此,ROS1
和ROS2
的并行存在为用户提供了更灵活的选择,可以根据自身需求和现有代码库的情况选择使用适合的版本。
2.5 学习建议
ROS2
是在ROS1
的基础上改进得到的版本,其中的诸多概念都得到了继承和发展,因此对于初学者而言,学习ROS1
可能更容易上手,更容易掌握ROS
的基础概念。
而虽然ROS1
仍然广泛使用,但ROS2
被认为是未来机器人应用开发的主流框架。ROS2
的社区在不断发展壮大,新功能和改进不断推出。所以在学习完ROS1
之后,我们还需要学习ROS2
。