1.1  ROS生态介绍

ROS生态系统不仅仅是一款开源工具,更是一个开源、蓬勃的生态开发系统。同时,ROS系统通过众多开发者不断地开发、更新功能包以及版本的不断迭代,目前ROS版本为“ROS 2”。本节将对ROS 2与机器人之间的关系、ROS 2系统概述、各版本以及ROS 2开发工具进行介绍。

1.1.1  ROS 2与机器人的关系

ROS 2(Robot Operating System 2)与机器人之间的关系可以理解为“核心开发框架”与“应用平台”的关系,可以类比为人类的神经系统在皮肤、眼睛、耳朵等感官感受外界信号之后,通过神经系统传输到大脑,大脑处理信号后将执行信号反馈给对应的执行器进行动作(例如,肌肉的运动、眨眼等感知动作)。ROS 2不是机器人本身,而是为构建复杂、可靠、实时的机器人系统提供所必需的开发工具、库和通信基础的软件库和工具集。

在开发过程中,ROS 2并不会直接参与管理硬件资源(CPU、内存等)和直接提供底层硬件设备的驱动(ROS 2可以集成驱动),它主要在通用操作系统(例如Linux、Windows、macOS等)上构建一种中间件和开发框架,提供一套标准化的通信机制(基于DDS)、开发工具(构建、调试、可视化)、通用功能库(导航、感知、控制算法)以及软件包管理生态系统,用以解决用户在机器人控制系统开发中共通、底层、复杂的问题。

一般情况下,机器人系统由分布在多个计算节点(可能是不同计算机或微控制器)上的多个独立软件模块(节点)组成(例如传感器驱动、定位算法、路径规划、运动控制、用户界面)。ROS 2可以在各个节点之间提供高效可靠、跨语言(C++、Python等)、跨平台的消息传递机制(发布/订阅、服务、动作),使各个节点模块能够便捷地交换数据和协调工作。

备注:在GitHub等平台和开源社区中提供了大量的功能包(如导航、点云处理、硬件驱动接口)供用户开发使用,用户可以像搭积木一样快速构建机器人应用,避免重复造轮子,提高开发效率。同时,在ROS 2中提供了强大的开发、调试和可视化工具(例如,rqt系列工具、RViz2-3D可视化工具、ros2 bag数据记录与回放工具),极大地提高了开发效率。

ROS 2本身是没有任何物理形态的,其价值主要是通过在各种物理机器人平台上运行而实现用户控制目的。例如,扫地机器人、自动驾驶汽车、工业协作机器人、实验室自动化机械臂、手术机器人等。在这些机器人上,ROS 2主要负责协调传感器数据流(例如摄像头、激光雷达等)、运行算法(例如目标检测、SLAM等)、执行决策规划(例如路径规划、任务调度等)、发送控制命令给执行器(例如电机、舵机等)。

ROS 2的典型应用场景。例如,一个移动机器人可以使用ROS 2节点完成以下功能:

(1)读取激光雷达数据。

(2)根据数据运行SLAM节点进行建图与定位。

(3)将地图和位置信息发送给导航节点进行路径规划。

(4)导航节点生成速度命令。

(5)发送给底盘控制节点驱动电机。

综上所述,ROS 2是机器人的核心开发框架,不直接管理硬件资源和提供底层驱动,而是在通用操作系统上构建中间件和开发框架。其提供标准化通信机制、开发工具、通用功能库及软件包管理生态,以节点形式分解功能,方便模块数据交换与协作,借助开源社区资源可快速构建应用,提高开发效率,缩短开发周期。

1.1.2  ROS 2系统概述及版本介绍

ROS 2是一套可以用于构建机器人系统的开源中间件和开发框架,旨在解决机器人开发中跨节点通信、功能模块化、软硬件协同等存在的共性问题。ROS 2的核心价值在于可以为机器人系统开发者提供统一、标准化的开发工具和开发机制,帮助开发者高效、快速地构建复杂机器人应用,而非直接控制机器人硬件或替代机器人底层操作系统。ROS 2系统架构如图1.1所示。

图1.1  ROS 2系统架构

ROS 2系统可以分为操作系统层、DDS(Data Distribution Service,数据分发服务)实现层、DDS接口层、ROS 2客户端层以及应用层,各层具体含义介绍如下。

1. 操作系统层

操作系统层是整个ROS 2软件栈运行的基础,包含操作系统内核、系统库、驱动程序和网络协议栈等。该层为ROS 2提供底层驱动,使其可以与各种传感器(摄像头、激光雷达)、执行器(电机、舵机)进行交互。ROS 2的核心优势之一是支持多种操作系统,包括Linux(尤其是Ubuntu)、Windows、macOS,以使代码能够在不同的系统环境下运行,增强代码的可移植性。

2. DDS实现层

DDS是由对象管理组织(Object Management Group,OMG)发布的一个第三方通信组件标准,专为高性能、高可靠性、实时性的分布式数据通信而设计。DDS是基于Real-Time Publish-Subscribe Protocol实现数据分发服务的。

3. DDS接口层

DDS接口层是连接上层ROS 2客户端层和底层DDS实现层的抽象层和适配器,提供统一的调用接口。由于需要支持不同厂家的DDS和标准的统一,因此在ROS 2中定义了ROS中间件接口 (ROS Middleware Interface,RMW)。DDS接口层类似于一个统一的USB接口标准,使不同厂家生产的USB硬件设备通过这个统一的接口标准能够在不同的计算机上使用,而不同厂家生产的USB硬件设备就是前面所述的DDS实现层。

4. ROS 2客户端层

ROS 2客户端层提供了不同编程语言(例如C++、Python等)所需的客户端库(ROS 2 Client Library),开发者通过RCL客户端的应用程序编程接口(API),可以完成ROS 2话题、服务、参数通信以及动作通信机制等核心功能的调用。

5. 应用层

开发者基于RCL客户端库所开发的ROS 2程序都属于应用层,是机器人系统具体功能的实现层。

另外,ROS 2机器人系统应用开发在通信机制、模块化开发、开发工具支持以及场景适配等方面具有非常强大的支持,具体介绍如下。

1)通信机制

基于DDS(数据分发服务),ROS 2可以在跨语言(C++、Python等)、跨平台(Linux、Windows等)的各个节点之间实现通信,支持话题发布/订阅、服务、动作等模式,能够确保各个分布式模块(如传感器、算法、执行器)进行高效协同与动作。其中,节点、话题、服务等具体说明如下。

(1)节点(Node):一个独立的、执行特定计算任务的模块(例如,驱动一个传感器、处理数据、控制电机)。

(2)话题(Topic):基于发布/订阅(Publish/Subscribe)模型的异步通信通道。节点可以发布消息到话题,或者订阅话题来接收消息(主要用于连续的数据流,例如传感器数据)。

(3)服务(Service):基于客户端/服务器(Client/Server)模型的同步通信方式。客户端发出请求,服务器处理并返回响应(主要用于偶尔调用的任务,例如开关服务、计算等)。

(4)动作(Action):一种更高级的通信机制,可以用于长时间运行、可抢占的任务。其本身由目标(Goal)、反馈(Feedback)和结果(Result)三个部分组成(例如,用于导航、抓取等任务)。

(5)参数(Parameter):节点的动态配置值,可以在运行时通过命令行或者图形化工具获取和修改。

2)模块化设计

以节点为功能单元,将机器人系统拆解为各自独立并且可以复用的功能模块,然后通过配合开源社区的海量功能包(如导航、感知算法等),支持开发者“搭积木”式地开发,缩短开发周期,大大提高了开发质量和开发效率。

3)工具链支持

ROS 2提供RViz2(3D可视化)、rqt(调试工具)、ros2 bag(数据记录)、TF(运动学坐标转换与管理)等工具。同时,开源社区基于ROS 2提供了强大、丰富的开源工具与开发框架(例如,仿真工具Gazebo、移动机器人导航工具Navigation 2开发框架等),为ROS 2开发者简化机器人系统应用开发、调试与测试的流程,提高开发效率。

4)跨场景适配

ROS 2无物理形态,需要在具体机器人硬件(如移动机器人、机械臂、自动驾驶车辆等)、机器人底层系统上运行,负责协调传感器数据处理、算法运行、控制命令传递等核心流程。

ROS 2的版本迭代一直围绕通信效率、实时性、硬件兼容性、工具链优化等核心方向展开,并且不同版本针对特定场景和需求进行了强化。一般情况下,ROS 2发布模式采用时间线式,并使用形容词作为版本代号,易于记忆。截至目前,ROS 2已发布版本如表1.1所示,同时开发者可以访问http://docs.ros.org/en/humble/Releases.html查看最新的数据。

表1.1  ROS 2已发布版本及当前状态说明

版本代号

发布日期

支持截止日期

Ubuntu版本

状态与说明

Jazzy Jalisco

2024年5月

2024—2025年

Ubuntu 24.04

进一步优化DDS通信效率,增强与AI框架(例如TensorFlow)的集成,完善调试工具链

Iron Irwini

2023年5月

2024年11月

Ubuntu 22.04

最新常规版本。包含最新特性和功能,支持到下一个版本发布后

Humble Hawksbill

2022年5月

2027年5月

Ubuntu 22.04

当前推荐使用的LTS版本。非常稳定,拥有丰富的社区资源和长期支持。新手入门首选

Galactic Geochelone

2021年5月

2022年11月

Ubuntu 20.04

已停止支持

Foxy Fitzroy

2020年6月

2023年5月

Ubuntu 20.04

第一个LTS版本,已停止支持

Eloquent Elusor

2019年11月

2020年11月

Ubuntu 18.04

已停止支持

Dashing Diademata

2019年5月

2021年5月

Ubuntu 18.04

已停止支持

Crystal Clemmys

2018年12月

2019年12月

Ubuntu 18.04

已停止支持

Bouncy Bolson

2018年7月

2019年7月

Ubuntu 18.04

已停止支持

Ardent Apalone

2017年12月

2018年12月

Ubuntu 16.04

已停止支持

如表1.1所示,在ROS 2已发布的主要版本中,开发者可以根据实际需要选择对应的版本进行开发。对于ROS 2开发,使用的发布版本建议如下:

(1)对于工业级、长期项目或者ROS 2开发初学者而言,优先选择LTS版本(例如Humble),其拥有最长的支持周期(到2027年),非常稳定,拥有最广泛的文档、教程和社区支持。几乎所有常用的功能包都已支持Humble。

备注:本书将基于Humble版本和Ubuntu 22.04进行知识点讲解和应用。

(2)短期开发或需尝鲜新功能,可选择非LTS版本(例如Jazzy),但在使用时需要注意更新频率和维护周期。

(3)对于新项目和ROS 2的初学者而言,不建议再使用Foxy Fitzroy LTS版本。虽然Ubuntu 20.04本身还在支持期内,但其版本上的ROS 2 Foxy软件栈已经停止更新。如果Foxy中的某个包被发现存在安全漏洞,官方也不会再进行修复,对于项目系统而言是一个非常重要且致命的风险。

备注:在新安装的Ubuntu 20.04系统上,开发者仍然可以按照官方文档安装Foxy,但需要注意的是,Foxy是一个已废弃的ROS 2版本,官方不再支持对安全漏洞进行修复,开发的项目存在致命风险。

1.1.3  ROS 2开发工具介绍

ROS 2提供了一系列强大的开发、调试、可视化和管理工具,帮助开发者高效构建、测试和部署机器人系统。本小节将介绍ROS 2开发所需的各类工具、常用的命令及其使用格式等。

ROS 2开发工具集合如图1.2所示。

如图1.2所示,ROS 2开发工具包括核心与构建工具、调试工具、可视化管理工具、仿真工具以及集成开发环境等。对于各类开发工具的作用及其常用方法,介绍如下。

图1.2  ROS 2开发工具集合

1. 核心命令行工具(ROS 2 CLI)

ROS 2 CLI是与ROS 2交互最基础、最常用的工具集,通过ros2命令调用。其主要功能是管理、检查、调试和运行ROS 2系统的各个方面。在Ubuntu系统下,ROS 2 CLI在系统命令行窗口或者集成开发环境VSCode的命令行窗口中使用,如图1.3[yx1] 和图1.4所示。

企业微信截图_17788512191965

图1.4 [yx2]  在集成开发环境的命令行终端中使用ROS 2 CLI

备注:在Ubuntu系统中,可以使用组合键Ctrl+Alt+T打开系统命令行窗口;在集成开发环境VSCode中,可以使用组合键Ctrl+ `打开命令行终端。

ROS 2 CLI常用的命令及格式如下:

(1)ros2 run:运行功能包中的一个可执行文件(节点)。

(2)ros2 launch:通过一个启动文件(launch file)的启动,可以配置同时启动多个节点。

(3)ros2 topic list/info/echo/pub:查看话题列表和查看话题信息、打印消息、发布消息。

(4)ros2 service list/call:查看服务列表、调用服务。

(5)ros2 node list/info:查看节点列表、查看节点详细信息。

(6)ros2 param list/get/set:管理参数。

(7)ros2 bag record/play:录制和回放话题数据,用于数据保存和后续分析。

备注:ROS 2 CLI是日常开发调试的必备基础,ROS 2的初学者必须熟练掌握。对于命令中的具体参数,将在后面的实例应用中具体讲解。

2. 构建工具:colcon

在ROS 2中,采用colcon构建工具编译、构建和安装ROS 2工作空间(workspace)中的功能包(package),colcon构建方式:在终端中输入命令“colcon”+子命令参数,如图1.5所示。

图1.5[yx3]   colcon命令构建功能包

colcon常用命令格式及简单说明如下。

(1)colcon build:编译工作空间中的所有功能包。

(2)colcon build --packages-select <pkg_name>:只编译指定的功能包,可以大大提高编译效率。

(3)colcon test:运行功能包的测试。

(4)colcon list:列出工作空间中的所有功能包。

备注:对比ROS 1中的构建工具catkin_make而言,colcon更高效、更科学,能够更好地处理功能包之间的依赖关系。

3. 可视化调试工具(rqt)

rqt是ROS 2中的GUI工具框架,基于Qt开发。它由一系列可以停靠的插件(plugins)组成,开发者可以根据实际项目需要自定义工作视图。rqt启动方式:在终端中输入命令“rqt”+命令参数,如图1.6所示。

图1.6[yx4]   使用rqt命令打开可视化工具

备注:一般情况下,大多数完整的ROS桌面版安装已经默认包含rqt及其核心插件。但基础版或最小化安装则没有包含。如果开发者不确定是否已安装rqt工具,或者在终端中输入“rqt”命令后提示“未找到命令”,则需要在系统中手动安装,手动安装命令为sudo apt install ros -<your_ros2_version>-rqt,其中“<your_ros2_version>”是当前所使用的ROS 2版本,例如humble、foxy等。以humble为例,安装命令为sudo apt install ros-humble-rqt。也可以直接使用ROS 2的环境变量代替版本,安装命令为sudo apt install ros-$ROS_DISTRO-rqt-tf-tree -y。

在rqt工具中,常用的插件以及启动命令如下。

(1)rqt_graph:可视化当前系统的计算图(节点、话题、服务之间的连接关系)。因为此插件可以一目了然地看到通信结构,是开发中最常用的调试工具之一。

(2)rqt_console:查看和过滤节点的日志消息(例如INFO、WARN、ERROR等),便于开发者调试和排查问题。

(3)rqt_plot:将发布到话题上的数值数据(例如浮点数等)以实时曲线图的形式绘制出来,该命令适合开发者用于调试传感器数据或控制命令。

(4)rqt_image_view:查看通过话题发布的图像消息,主要用于调试摄像头驱动或图像处理算法。

(5)rqt_top:类似Linux系统中的top命令,可以查看节点对CPU和内存的占用情况。

(6)rqt_reconfigure:在运行时动态调整节点的参数,无须重启节点,适用于算法调参。

4. 3D可视化工具:RViz2

RViz(ROS Visualization)可以将机器人发出的各种抽象、非直观的数据(特别是存在于三维空间中的数据),以直观、图形化的方式渲染在一个3D场景中并显示出来。RViz2启动方式:在终端中输入命令“rviz2”,如图1.7所示。

在RViz2中,通过“显示插件(Displays)”模块化地添加各种可视化元素后可以显示内容,如下所示。

(1)机器人模型(Unified Robot Description Format,URDF):显示机器人的三维外观和运动状态。

(2)传感器数据:点云、激光扫描、图像、深度图等。

(3)变换框架(Transform Framework,TF):显示所有坐标系之间的变换关系。

(4)路径规划:显示地图(栅格地图、点云地图)、规划出的全局和局部路径。

(5)标记(Markers):开发者可以自定义各种几何形状(箭头、立方体、线框等)来可视化算法中间结果。

(6)图像(Image):显示摄像头话题中获取到的图像,可以看作是“rqt_image_view”的3D版。

备注:3D可视化工具RViz2对于开发ROS 2非常重要,几乎所有基于感知和运动的机器人项目都离不开RViz2。

5. 仿真工具

仿真工具Gazebo是可以在不需要真实硬件的情况下开发和测试算法的仿真器。Gazebo不仅可以提供3D渲染(RViz2),还可以提供物理引擎(重力、碰撞、摩擦)、传感器模拟(摄像头、激光雷达、IMU的噪声模型)和执行器控制等,开发者可以用于测试机器人算法在接近真实世界环境中的运行情况。

备注:在ROS 2开发中,用户可以手动安装仿真工具Gazebo,安装命令是sudo apt install ros-humble-gazebo-ros-pkgs,执行该命令后,即可安装Gazebo仿真器及其所有必要的ROS集成包。关于Gazebo工具的具体使用,将在后面的章节实例中进行详细介绍。

6. 集成开发环境(IDE)

ROS 2代码虽然在任何文本编辑器中都可以编写,但在项目实际开发过程中使用一款配置完整的集成开发工具能够极大地提升开发者的开发效率。所以在本书中,我们以Visual Studio Code(VSCode)为集成开发工具,如图1.8所示。

图1.8[yx5]   Visual Studio Code集成开发环境界面

在Visual Studio Code中配置相应的插件,能够有效地帮助开发者提高开发效率和开发质量。它配置的插件介绍如下。

(1)ROS插件(ms-ros):能够提供大量ROS 2的开发功能。例如,能够自动化进行环境配置、提供ROS特定文件的智能编辑、集成ROS 2核心工具的图形化操作、简化调试流程、自动补全(.msg、.srv、.action文件等)、轻松启动launch文件、查看计算图等,可以为ROS 2开发者提供开发过程中的许多重要帮助。

(2)CMake插件:帮助处理和管理CMakeLists.txt文件。

(3)C++/Python插件:提供代码高亮、智能感知、调试等程序开发辅助功能。

(4)YAML插件:主要用于编辑package.xml和launch文件,在Visual Studio Code中集成。

备注:除了Visual Studio Code外,CLion也是一款强大的C++开发集成工具,特别是对CMake项目支持极好,适合大型C++项目的开发。但是在本书中,是以Visual Studio Code作为集成开发工具进行讲解的,同时也强烈建议用户在ROS 2学习中使用该集成开发工具。

本小节主要介绍了ROS 2开发过程中涉及的几种工具的作用,以及在终端中使用命令启动的方法,并通过命令的使用格式及参数说明具体功能,以帮助开发者高效构建、测试和部署机器人系统。


 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐