目录
〇、为什么学习ROS2
ROS Noeitc是 Open Robotics 的 ROS 1 的最终版本,维护截至日期是2025年,未来的 ROS 版本都将基于 ROS 2。
消息来源:
ROS Wiki官网:http://wiki.ros.org/Distributions
OpenRobotics官网:https://www.openrobotics.org/blog/2020/5/23/noetic-ninjemys-the-last-official-ros-1-release
一、为什么会有ROS2?
2010年,ROS1首次发布正式版本,其研发的初衷是为设计PR2(个人服务型机器人)共用的软件架构。但随着ROS1技术的普及,ROS1开始广泛融入各领域无人系统的研发,陆续暴露了系统的诸多问题。为了适应新时代机器人研发的需要。
2015年8月第一个ROS 2.0的alpha版本落地;2016年12月19日,ROS 2.0的beta版本正式发布;2017年12月8日,万众瞩目的ROS 2.0终于发布了第一个正式版——Ardent Apalone。2022年5月,ROS开发者团队推出ROS2 LTS版本ROS2 Humble。
1.1 ROS的特点
ROS最早的设计目标就是开发一款PR2家庭服务机器人,这款机器人绝大部分时间都是独立工作,其显着特征包括:
- 单一机器人;
- 机载工作站级计算资源;
- 没有实时性要求(或者任何实时性要求都会以某种专门方式得以满足);
- 良好的网络连接(有线网络或近距离高带宽无线网络);
- 主要应用学术研究中;
- 最大的灵活性,没有任何规定或禁止(如不封装main()函数)。
ROS满足了PR2机器人用例的要求,但也因在各类机器人上变得有用而超出了预期。今天我们看到ROS不仅用在PR2和类似PR2的机器人上,还用在各种尺寸的轮式机器人、腿式人形机器人、工业机械臂、户外地面车辆(包括自动驾驶汽车)、飞行器、地面车辆上,等等。
此外ROS在学术研究社区之外的许多领域中得到了应用。基于ROS的产品即将上市,包括制造机器人、农业机器人、商业清洁机器人等。预计NASA将会在其部署到国际空间站的Robonaut 2机器人上运行ROS。
1.2 ROS无法解决的机器人应用场景
随着ROS的普及,应用ROS的机器人类型有了天翻地覆的变化,其中ROS社区特别感兴趣的是以下机器人应用场景:
- 多机器人团队:虽然今天可以用ROS来构建多机器人系统,但没有标准方法,且都是基于ROS的单一主机结构之上的。
- 小型嵌入式平台:我们希望包括“裸机”微控制器在内的小型计算机也成为ROS环境中的一流参与者,而不会因设备驱动程序导致其与ROS相阻隔。
- 实时系统:我们希望直接在ROS中支持实时控制,包括进程间和机器间通信(假设有合适操作系统和/或硬件支持的情况下)。
- 非理想网络:我们希望ROS在网络连接因数据包丢失和/或延迟而降低时(从质量差的WiFi到地对空通信链路)表现得尽可能好。
- 生产环境:虽然ROS继续成为研究实验室的首选平台这一点至关重要,但我们希望确保基于ROS的实验室原型能进化为基于ROS的实际应用产品。
- 构建和结构化系统的规定模式:虽然我们将会继续保持作为ROS标志的底层灵活性,但我们也希望为生命周期管理和部署静态配置等功能提供清晰的模式和支持工具。
为解决上述应用场景中存在的问题,更加适合各种机器人应用的ROS2诞生了。
二、ROS2 特点
ROS2怀揣变革智能机器人时代的历史使命,在设计之初,就考虑到要满足各种各样机器人应用的需求。
- 多机器人系统:未来机器人一定不会是独立的个体,机器人和机器人之间也需要通信和协作,ROS2为多机器人系统的应用提供了标准方法和通信机制。
- 跨平台:机器人应用场景不同,使用的控制平台也会有很大差异,比如自动驾驶汽车中的算力性能肯定比AMR机器人强很多,为了让所有机器人都可以运行ROS2,ROS2可以跨平台运行于Linux、Windows、MacOS、RTOS,甚至是没有任何系统的微控制器(MCU)上,这样我们就不用纠结自己的控制器能不能用ROS了。
- 实时性:机器人运动控制和很多行为策略要求机器人具备实时性,比如机器人要可靠得在100ms内发现前方的行人,或者稳定的在1ms周期内完成运动学、动力学的解算,ROS2为类似这样的实时性需求提供了基本保障。
- 网络连接:无论在怎样的网络环境下,ROS2都可以尽量保障机器人大量数据的完整性和安全性,比如在wifi信号不好的时候数据也要尽力发送过去,在有黑客入侵风险的场景下要对数据进行加密解密。
- 产品化:,大量机器人已经走向我们的生活,未来还会越来越多,ROS2不仅可以用于机器人研发阶段,还可以直接搭载在产品中,走向消费市场,这对ROS2的稳定性、强壮性也提除了巨大挑战。
- 项目管理:机器人开发是一个复杂的系统工程,设计、开发、调试、测试、部署等全流程的项目管理工具和机制,也会在ROS2中体现,更方便我们去开发一款机器人。
ROS2官方在Science Robotic上发表了介绍ROS2的论文《Robot Operating System 2: Design, architecture, and uses in the wild》
顺便一提,NASA 在2023 年 11 月发射的月球极地探索漫游车 ( Volatiles Investigating Polar Exploration Rover,VIPER)的任务中,许多在地球上的工具软件、计算模块和高精度仿真都是基于 ROS 2 和 Gazebo。
三、ROS2设计思想
要满足上述需求,ROS2的设计和开发工作并不简单,ROS开发者面对的选择有两个,第一个是在ROS1的架构之上,进行修改和优化,类似一个盖好的房子,我们把它打成毛坯房,重新装修翻新一下,但肯定会受制于原本建筑的格局,长远来看并不是最佳选择,他们最终选择了第二种方案,那就是推倒重来。
ROS2官方的设计思想如下
3.1 新技术的发展
ROS的核心是一个几乎完全从头开始构建的匿名发布-订阅中间件系统。从2007年开始,我们构建了自己的发现、消息定义、序列化和传输系统。在这七年间,与ROS相关的几种新技术在所有这些领域中的得到了发展、改进和/或广泛应用,例如:
- 零配置网络服务规范(Zeroconf);
- Protocol Buffers数据序列化框架;
- 高速并发消息通信框架ZeroMQ(以及其他MQ);
- NoSQL数据库Redis;
- 网络套接字(WebSockets);
- 数据分发服务DDS(Data Distribution Service)。
现在可以使用现成的开源库来构建类似ROS的中间件系统。我们可以在很多方面从这种方法中受益匪浅,包括:
- 维护更少的代码,特别是机器人无关的代码;
- 可以利用超出ROS本身构建范围的那些软件库中的各种功能;
- 可以从其他人对这些软件库所做的持续改进中受益;
- 当人们问我们ROS是否“准备好迎接黄金时代”时,我们可以指出已经依赖这些软件库的现有产品系统。
3.2 API更改
构建ROS 2的另一个原因是利用这个机会来改进我们面向用户的 API。如今存在的大量ROS代码与早在2009年2月发布的0.4“Mango Tango”发行版中的客户端库仍然兼容。从稳定性的角度来看这非常好,但这也意味着我们仍然受制于几年前做出的各种API决策中,我们现在知道其中一些决策并不是最好的。
因此,在ROS 2中,我们将会设计新的API,尽最大努力将ROS社区的集体经验与第一代API结合起来。因此,虽然关键概念(分布式处理、匿名发布/订阅消息传递、带反馈的RPC即动作、语言中立性、系统自省性等)将保持不变,但您不能期望ROS 2的API与现有的ROS代码兼容。
但不要害怕:会有机制允许ROS 2代码与现有的ROS代码共存。至少会有翻译中继来支持两个系统之间的运行时交互。并且可能会有软件库填充程序允许现有的ROS代码针对ROS 2库进行编译/运行,其行为在性质上会与今天所看到的相类似。
3.3 为什么不是仅仅改进ROS 1
原则上,上述更改可以集成到现有的ROS核心代码中。例如,可以将新的传输技术添加到roscpp和rospy客户端库中。我们考虑了这个选项,并得出结论认为,鉴于实现我们所寻求的功能所需做出的变更的侵入性,改变如此众多用户所依赖的当前ROS系统存在太多风险。我们想让现今已有的ROS 1继续工作并且不受ROS 2开发的影响。因此ROS 2将会被构建为一组并行的软件包,可以与ROS 1一起安装并与ROS 1进行互操作(例如,通过消息桥接)。
英语原文网址:http://design.ros2.org/articles/why_ros2.html
3.4 总结
ROS2相对于ROS的更改主要体现在:
- 系统架构进行了颠覆性的变化:ROS1中所有节点都需要在节点管理器ROS Master的管理下进行工作,一旦Master出现问题,系统就面临宕机的风险,ROS2实现了真正的分布式,不再有Master这个角色,借助一种全新的通信框架DDS,为所有节点的通信提供可靠保障。
- 软件API进行了重新设计:ROS1原有的接口已经无法满足需求,ROS2结合C++最新标准和Python3语言特性,设计了更具通用性的API,虽然导致原有ROS1的代码无法直接在ROS2中运行,但是尽量保留了类似的使用方法,同时提供了大量移植的说明。
- 编译系统进行了升级:ROS1中使用的rosbuild和catkin问题诸多,尤其是针对代码较多的大项目以及Python编写的项目,编译、链接经常会出错,ROS2对这些问题也进行了优化,重新优化后的编译系统叫做ament和colcon。
四、ROS2系统框架
4.1 系统架构
下图展示ROS1和ROS2的系统架构对比,在这张图中,左侧是ROS1,右侧是ROS2。
- 进程管理:在ROS1中,需要开启中央节点管理器Master,统一管理所有节点。如果Master节点出现故障,将严重影响ROS系统功能。在ROS2中,系统引入节点自发现机制,可有效提高系统鲁棒性。
- 进程间通信:ROS1基于TCP和UDP协议自己开发了TCPROS和UDPROS协议,而在ROS2中,通信协议更换成了更加复杂但也更加完善的DDS系统。
- 进程内通信:如果是在进程内需要进行大量数据的通信,ROS1 和ROS2都提供了基于共享内存的通信方法,分别是Nodelet和 Intra-process模块。
- 跨平台:最下边是系统层,也就是可以将ROS安装在哪些操作系统上,ROS1主要安装在Linux上,ROS2可跨平台,如Linux、windows、MacOS、RTOS。
通过这样对比的方式,我们了解了ROS2的整体架构。
4.2 通信架构
2014年在ROSCon 2014上,ROS官方(Open Source Robotics Foundation,OSRF)正式发布了新一代ROS的设计架构(Next-generation ROS: Buildingon DDS),DDS正式成为ROS2的重要的组成部分。
ROS2设计了一个ROS Middleware(RMW),也就是指定一个标准的接口,比如如何发数据,如何收数据,数据的各种属性如何配置,比如发布一个图像的话题(publish),接收一个雷达的话题(subscribe),RMW会调用DDS来实现这些功能,如果DDS厂家想要接入ROS社区,就得按照ROS Middleware(RMW)这个标准写一个适配的接口,把自家的DDS给移植过来,这样就把问题交给了最熟悉自家DDS的厂商。
DDS全称 Data Distribution Service (数据分发服务),是由对象管理组(OMG,The Object Management Group)于 2003 年发布并于 2007 年修订的开分布式系统标准。DDS提供了一种实时发布订阅(RTPS,Real-Time Publish Subscribe)机制,该传输机制与ROS的发布-订阅传输机制非常相似,DDS 本身并没有定义应该如何发现各节点,而是在 RTPS 中定义该行为,RTPS 是 DDS 底层使用的协议。
在ROS2 LTS的Humble版本中,默认采用的 DDS 实现为 eProsima FastDDS,eProsima 提供的一张图可以很好的来表示 DDS 的实现原理,可以看到,DDS 基于 Topic 来实现发布-订阅模式,而且没有中心节点。
DDS提供的默认发现系统需要使用DDS的发布-订阅传输机制,这是一个分布式发现系统,允许任意两个DDS程序之间进行直接通信,而不需要像ROS主节点这样的工具,这使得系统具有更好的容错能力和灵活性。
ROS对于使用哪家厂商的DDS的不做硬性规定,用户根据自身需要选择适合的DDS,比如OpenSplice、FastRTPS等等,每一家的性能不同,适用的场景也不同,不同ROS2发行版支持的DDS厂家也不一样,ROS2 Humble支持的DDS厂家如下表:
产品名称 | License | RMW implementation | 状态 |
---|---|---|---|
eProsima Fast DDS | Apache 2 | rmw_fastrtps_cpp |
全力支持。默认RMW。打包为二进制版本 |
Eclipse Cyclone DDS | Eclipse Public License v2.0 | rmw_cyclonedds_cpp |
全力支持。打包为二进制版本 |
RTI Connext DDS | commercial, research | rmw_connextdds |
全力支持。支持包含在二进制文件中,但是需要单独安装Connext |
GurumNetworks GurumDDS | commercial | rmw_gurumdds_cpp |
社区支持。支持包含在二进制文件中,但是需要单独安装GurumDDS。 |
4.3 核心概念
ROS1应用已经非常广泛,全球有几百万开发者,大家已经熟悉了ROS1的开发方式以及其中的很多概念。ROS2尽量保留了这些概念,便于开发者从ROS1迁移到ROS2。
4.4 发行版本
ROS2与Ubuntu对应的发行版本与维护周期。
版本代号 | 发布日期 | EOL日期 | Ubuntu版本 |
---|---|---|---|
Ardent Apalone | 2017.12 | 2018.12 | Ubuntu 16.04(Xenial Xerus) |
Bouncy Bolson | 2018.7 | 2019.7 | Ubuntu 16.04(Xenial Xerus)、Ubuntu 18.04 (Bionic Beaver) |
Crystal Clemmys | 2018.12 | 2019.12 | Ubuntu 18.04 (Bionic Beaver) |
Dashing Diademata | 2019.5 | 2021.5 | Ubuntu 18.04 (Bionic Beaver) |
Eloquent Elusor | 2019.11 | 2020.11 | Ubuntu 18.04 (Bionic Beaver) |
Foxy Fitzroy | 2020.6 | 2023.5 | Ubuntu 20.04 (Focal Fossa) |
Galactic Geochelone | 2021.5 | 2022.11 | Ubuntu 20.04 (Focal Fossa) |
Humble Hawksbill | 2022.5 | 2027.5 | Ubuntu 22.04 (Jammy Jellyfish) |
Humble是ROS2的第一个LTS版本,支持日期为5年!
参考:
ROS2系统特性介绍,https://blog.csdn.net/zeye5731/article/details/125416314
古月居教程,https://www.guyuehome.com/37657
古月居ROS的起源:https://www.guyuehome.com/38273
ROS2官方文档翻译:https://zhuanlan.zhihu.com/p/450021212
ROS2支持的DDS,https://docs.ros.org/en/humble/Concepts/About-Different-Middleware-Vendors.html
DDS解析:https://keyou.github.io/blog/2020/09/21/dds-middleware/
论文:
Exploring the Performance of ROS2
Exploring Real-Time Executor on ROS 2
Robot Operating System 2: Design, architecture, and uses in the wild