从本文起,我们开始系统学习ros2。之前本人用两个系列博客,系统学习了ros1 noetic,即:ROS高效入门系列 和 ROS高效进阶系列 。
由于机器人行业的发展,以及 ros 本身的迭代需求,用在ubuntu20.04的 noetic 将是 ros1 最后一个长期支持版,并截至到 2025年停更,具体可以看 ros1的发版历史:ros1 Distributions 。因此,我们需要学习 ros2,这是下一个十年机器人领域主流的行业标准。本文参考资料如下:
(1)ROS高效入门第一章 – ROS历史与现状
(2)ROS2对比ROS1
(3)DDS与FastRTPS
(4)古月 DDS 介绍
(5)fishros DDS 介绍
(6)DDS Specification
(7)DDSI-RTPS
(8)Fast-RTPS github 链接为:Fast-RTPS github
(9)Fast-RTPS 官方文档链接:Fast-RTPS Doc
(1)ros1引入:说ros2之前,我们先解释 ros 或者说 ros1 的由来。ros1最早是柳树车库设计的PR2(Personal Robot,个人机器人2代)的软件部分。PR2有高算力的计算平台,不用担心性能问题;PR2是标准的单机系统,不用担心网络通信问题,因此可以说 ros1 有很强的实验室属性,这为 ros2 诞生埋下了伏笔。
更多信息,建议阅读本人之前的博客:ROS高效入门第一章 – ROS历史与现状
(2)ros1痛点:ros1一经推出,很快引燃了机器人领域,各类机器人大爆发,大家都用开源ros1搭建原型,甚至做量产产品,包括自动驾驶汽车这种大型机器人系统。尽管ros1一直在迭代升级,但依然无法回避几个痛点:
第一,量产机器人一般使用嵌入式计算平台,性能受限,ros1的使用体验不好,尤其是中间件通信负载很高。
第二,量产机器人要求在各种条件下,都具备很高的通信稳定性。ros1基于TCP/IP自己实现的中心化的中间件通信方式,难以满足复杂场景的通信需求。
鉴于ros1的现状,很多公司自己动手做优化,尤其是中间件优化,比如百度Apollo Cyber RT 。
(3)ros2版本选择:看着业内各方动手对ros1进行完善升级,ROS官方自然也不会闲着。早在2015年,ROS官方就已经启动了ros2的设计开发,并一直与ros1并行前进,见下图。直到2022年5月,ROS 官方推出了 ros2 的第一个五年长期支持版 Humble Hawksbill(谦逊的玳瑁龟),标志着 ros2 的成熟,更详细的发版历史可以参考:ros2 releases。自此,ros 彻底切到了 ros2,本系列博客文章也将使用 ros2 Humble 版本进行研究。
(1)系统架构:下图是网上广为流传的ros1和ros2架构比对图,我们逐块分析。
第一,ros1采用中心化的通信拓扑,所有通信节点由 master 管理。明眼人一看就知道,这种通信方式很脆弱,master挂了,整个系统就跪了。加之 ros1 基于TCP/IP自己实现的这套中间件,在通信服务质量QOS,通信加密等方面的羸弱表现,最终导致 ROS 官方彻底放弃了自研中间件 ,转为使用更成熟稳定的 DDS(下节深入讨论)。
第二,client library是对通信接口的统一封装,方便开发者直接使用
第三,由于 DDS 是一套标准规范,有很多厂商提供各种类型的 DDS 通信库,因此 ros2 设计了 DDS 抽象层,封装底层变化。
第四,intra-process api 类似 ros1 的 nodelet api,使用共享内存用于大量数据传输的情况。
第五,ros1 主要用在 linux 上,ros2 大大扩大了自己的使用范围,甚至可以放在 RTOS 上。
(2)编译和编码方式:ros1 先后使用了 rosbuild 和 catkin 两版编译方式,你看他一直在变,就说明不完美。因此 ros2 引入了colcon包构建工具,生成 ament 格式的软件包。除此之外,ros2 将更加依赖面向对象的编程方式,编码难度也会增加一些。以后我们将通过众多的样例学习,体验 ros2 的编译编码方式。
(3)命令行:ros2 也对 ros1 的命令行风格进行了重构,功能差不多,但是命令更集中了,所有的命令都以ros2打头,如:ros2 bag info <==> rosbag info。
(1)通信模型:在讲解 DDS 之前,我们需要先梳理不同时期的通信模型,为 DDS 找一个位置。
第一,点对点的 C/S 模型,web 服务基本都是这个。一个服务器角色被许多的客户端使用,每次通信时,client 必须知道 server 的信息,然后通信双方再建立一条连接。最大的问题是节点越多,连接越多,server 一坏,所有 client 都跪了。
第二,经纪人 Pub/Sub 模型,这就是 ros1 的通信模型,所有节点通过中间人 master 管理,大家通信只要向 master 注册就行,使用起来比较方便。最大的问题是 master 跪了,整个系统都跪了。
第三,广播 Pub/Sub 模型,这个模型取消了 master 中心节点,也不用注册,所有节点都可以直接广播消息,也可以接收所有消息,但需要识别出自己关心的消息,比如 can 总线就是这个模型。最大的问题是总线上消息那么多,每个节点都要对所有消息进行筛选,冗余操作太多。
第四,数据分发模型:这种模型与广播模型有些类似,所有人都可以在 DataBus 上发布和读取消息。但它更进一步的是,通信中包含了很多并行的通路,每个人可以只关心自己感兴趣的消息,自动忽略自己不需要的消息。DDS 就是这个模型,第四代通信模型。
(2)DDS 简介:Data Distribution Service,数据分发服务,2004年由对象管理组织 Object Management Group(简称OMG)发布和维护,是一套专门为实时系统设计的数据分发/订阅标准。DDS强调以数据为中心,可以提供丰富的 QOS 服务质量策略,以保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。DDS 最早来源于美国海军,现已在各行各业落地生根,包括 ROS2。
(3)DDS 组成:DDS 一般分为两大部分
一是 DDS Specification,描述了以数据为中心的发布-订阅模型。该规范定义了API和通信语义(行为和服务质量),使消息从消息生产者有效地传递到匹配的消费者。DDS规范的目的可以概括为:“能够在正确的时间将正确的信息高效,可靠地传递到正确的位置”。标准文档链接:DDS Specification
二是 DDSI-RTPS:描述了RTPS(Real Time Publish Subscribe Protocol)协议。该协议通过UDP等不可靠的传输,实现最大努力(Best-Effort)和可靠的发布-订阅通信。RTPS是DDS实现的标准协议,它的目的和范围是确保基于不同DDS供应商的应用程序可以实现互操作。标准文档链接:DDSI-RTPS。
(4)DDSI-RTPS 在 TCP/IP 协议栈的位置:其位于TCP/IP 协议栈的应用层,并且通常是基于 UDP(User Datagram Protocol)来实现的,而不是基于 TCP(Transmission Control Protocol)。选择 UDP 的原因在于:
第一,实时特性:UDP 提供了更低的传输延迟相对于 TCP,这对于需要快速反应的实时应用来说是关键。
第二,多播和广播通信:UDP 支持多播和广播,使得数据可以同时发送给多个订阅者,这与 DDS 的发布-订阅模型非常契合。
第三,控制性:RTPS 协议在应用层处理数据包的可靠性和排序,这允许更多的灵活性和针对特定应用需求的定制。
虽然 UDP 本身不保证数据的可靠性、顺序和完整性,但是 RTPS 在应用层实现了必要的机制,例如消息确认、重传请求和顺序保证,以确保可靠的通信。使用 UDP 的代价是,开发者或者 RTPS 实现需要在应用层处理那些通常由 TCP 自动管理的功能,如流量控制和拥塞避免。但这样使得 RTPS 协议能够为实时和高可靠性的应用提供定制化的网络服务。
(5)DDS 在汽车和自动驾驶行业的应用:首先 AUTOSAR Adaptive Platform 18.03 已经包含了 DDS 协议。ROS2 架构也以 DDS 为基础。DDS的实时特性可能特别适合自动驾驶系统。在这类系统中,通常会存在感知,预测,决策和定位模块,这些需要非常高速和频繁的交换数据。借助DDS,可以很好的满足它们的通信需求。
(6)DDS 提供商:由于 DDS 只是一套规范,具体实现有很多厂商做,提供不同版本,包括IBM,Apple Computer,Sun Microsystems等。这里我们只讲 ros2 默认的 DDS 版本,即Fast-RTPS,早先也叫 Fast-DDS,其是 eprosima (欧洲的一家中间件公司)对于 RTPS的C++实现,这是一个免费开源软件,遵循Apache License 2.0。
Fast-RTPS github 链接为:Fast-RTPS github
Fast-RTPS 官方文档链接:Fast-RTPS Doc
(7)ROS2 选择 DDS 的优劣:
第一,DDS已经应用在军事、潜艇各个领域,稳定性实时性经过实际检验。
第二,使用DDS需要维护的代码要少得多,可以让ROS2开发人员腾出手专注机器人开发,让专业人做专业事。
第三,劣处是 DDS API复杂,灵活性是以复杂性为代价的,系统开销也增加了,后面的学习我们会有体会。
本文系统梳理了 ros1 和 ros2 的区别,并为大家引入了 DDS ,这部分内容将作为后面学习的理论基础。