1.5 ROS2体系框架【万字干货来啦,快来码住】
1.5 ROS2体系框架
在1.1.2 ROS2组成体系一节中,我们已经简单了解了ROS2的体系框架,并且随着前面介绍了ROS2功能包的编写、编译、执行流程,也对ROS2应用程序的构建有了基本的认识。本节会进一步从微观和宏观两个维度来介绍ROS2的不同部分,以帮助大家了解ROS2的学习、工作内容以及以后可选择的发展方向。
微观上会介绍ROS2的文件系统、ROS2的核心模块(通信与工具),这些都是官方提供的标准内容。宏观上会介绍关于ROS2的技术支持、ROS2的应用方向,这部分则是得益于ROS2的强大社区。
1.5.1 ROS2文件系统
立足系统架构,如下图所示,ROS2可以划分为三层:
操作系统层(OS Layer)
如前所述,ROS虽然称之为机器人操作系统,但实质只是构建机器人应用程序的软件开发工具包,ROS必须依赖于传统意义的操作系统,目前ROS2可以运行在Linux、Windows、Mac或RTOS上。中间层(Middleware Layer)
主要由数据分发服务DDS与ROS2封装的关于机器人开发的中间件组成。DDS是一种去中心化的数据通讯方式,ROS2还引入了服务质量管理 (Quality of Service)机制,借助该机制可以保证在某些较差网络环境下也可以具备良好的通讯效果。ROS2中间件则主要由客户端库、DDS抽象层与进程内通讯API构成。应用层(Application Layer)
是指开发者构建的应用程序,在应用程序中是以功能包为核心的,在功能包中可以包含源码、数据定义、接口等内容。

对于一般开发者而言,工作内容主要集中在应用层,开发者一般通过实现具有某一特定功能的功能包来构建机器人应用程序。对应的我们所介绍的ROS2文件系统主要是指在硬盘上以功能包为核心的目录与文件的组织形式。
1.概览
功能包是ROS2应用程序的核心,但是功能包不能直接构建,必须依赖于工作空间,一个ROS2工作空间的目录结构如下:


上述这些目录也可以定义为其他名称,或者根据需要创建其他一些目录。
2.源文件说明
在1.3 ROS2快速体验中,实现第一个ROS2程序时,都需要创建节点,无论是C++实现还是Python实现,都是直接实例化的Node对象。
C++实例化Node示例如下:

Python实例化Node示例如下:

但是在ROS2中,上述编码风格是不被推荐的,更推荐以继承Node的方式来创建节点对象。
C++继承Node实现示例如下:

Python继承Node实现示例如下:

之所以继承比直接实例化Node更被推荐,是因为继承方式可以在一个进程内组织多个节点,这对于提高节点间的通信效率是很有帮助的,但是直接实例化则与该功能不兼容。
3.配置文件说明
在ROS2功能包中,经常需要开发者编辑一些配置文件以设置功能包的构建信息,功能包类型不同,所需修改的配置文件也有所不同。C++功能包的构建信息主要包含在package.xml与CMakeLists.txt中,Python功能包的构建信息则主要包含在package.xml和setup.py中,接下来我们就简单了解一下这些配置文件。
1.package.xml
不管是何种类型的功能包,package.xml的格式都是类似的,在该文件中包含了包名、版本、作者、依赖项的信息,package.xml可以为colcon构建工具确定功能包的编译顺序。一个简单的package.xml示例如下:
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>pkg01_helloworld_cpp</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="ros2@todo.todo">ros2</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend> <depend>rclcpp</depend>
<test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
1.根标签
<package>:该标签为整个xml文件的根标签,format属性用来声明文件的格式版本。
2.元信息标签
<name>:包名;
<version>:包的版本号;
<description>:包的描述信息;
<maintainer>:维护者信息;
<license>:软件协议;
<url>:包的介绍网址;
<author>:包的作者信息。
3.依赖项
<buildtool_depend>:声明编译工具依赖;
<build_depend>:声明编译依赖;
<build_export_depend>:声明根据此包构建库所需依赖;
<exec_depend>:声明执行时依赖;
<depend>:相当于<build_depend>、<build_export_depend>、<exec_depend>三者的集成;
<test_depend>:声明测试依赖;
<doc_depend>:声明构建文档依赖。
2.CMakeLists.txt
C++功能包中需要配置CMakeLists.txt文件,该文件描述了如何构建C++功能包,一个简单的CMakeLists.txt示例如下:

在示例中关于文件的使用已经通过注释给出了简短说明,其实关于CMakeLists.txt的配置是比较复杂的,后续随着学习的深入,还会给出更多的补充说明。
3.setup.py
Python功能包中需要配置setup.py文件,该文件描述了如何构建Python功能包,一个简单的setup.py示例如下:C

使用语法可参考上述示例中的注释。
4.操作命令
ROS2的文件系统核心是功能包,我们可以通过编译指令colcon
和ROS2内置的工具指令ros2
来实现功能包的创建、编译、查找与执行等相关操作。
1.创建
新建功能包语法如下:
ros2 pkg create 包名 --build-type 构建类型 --dependencies 依赖列表 --node-name 可执行程序名称
格式解释:
--build-type:是指功能包的构建类型,有cmake、ament_cmake、ament_python三种类型可选;
--dependencies:所依赖的功能包列表;
--node-name:可执行程序的名称,会自动生成对应的源文件并生成配置文件。
2.编译
编译功能包语法如下:
colcon build
或
colcon build --packages-select 功能包列表
前者会构建工作空间下的所有功能包,后者可以构建指定功能包。
3.查找
在ros2 pkg
命令下包含了多个查询功能包相关信息的参数。
ros2 pkg executables [包名] # 输出所有功能包或指定功能包下的可执行程序。
ros2 pkg list # 列出所有功能包
ros2 pkg prefix 包名 # 列出功能包路径
ros2 pkg xml # 输出功能包的package.xml内容
4.执行
执行命令语法如下:
ros2 run 功能包 可执行程序 参数
小提示:
可以通过
命令 -h
或命令 --help
来获取命令的帮助文档。
1.5.2 ROS2核心模块
通信与工具是ROS2的核心模块,也是我们以后学习和工作的重点所在,本节将会介绍通信和工具中涉及到的一些知识点。
1.通信模块
通信模块是整个ROS2架构中的重中之重,比如你可能想要了解在ROS2中是如何控制机器人底盘运动的?雷达、摄像头、imu、GPS等这些传感器数据是如何传输到ROS2系统的?人机交互时调用者如何下发指令,机器人又是如何反馈数据的?导航、机械臂等系统性实现不同模块之间是如何交互数据的......等等,其实这些都离不开通信模块。另外,开发者构建应用程序时,通信部分在工作内容中占有相当大的比重。
2.功能包应用
功能包的应用主要有三种方式:
1.二进制安装
ROS官方或社区提供的功能包可以很方便的通过二进制方式安装,安装命令如下:
sudo apt install ros-ROS2版本代号-功能包名称
小提示:
可以调用
apt search ros-ROS2版本代号-* | grep -i 关键字
格式的命令,根据关键字查找所需的功能包。
2.源码安装
也可以直接下载官方、社区或其他第三方提供的源代码,一般我们会从github获取源码,下载命令如下:
git clone 仓库地址
源码下载后,需要自行编译。
3.自实现
开发者按照业务需求自己编写功能包实现。
3.分布式
ROS2是一个分布式架构,不同的ROS2设备之间可以方便的实现通信,这在多机器人设备协同中是极其重要的。
4.终端命令与rqt
在ROS2中提供了丰富的命令行工具,可以方便的调试程序、提高开发效率。
rqt是一个图形化工具,它的功能与命令行工具类似,但是图形化的交互方式更为友好。
示例1:使用命令行工具在turtlesim_node中生成一只新乌龟。

示例2:使用rqt在turtlesim_node中生成一只新乌龟。

5.launch文件
通过launch文件,可以批量的启动ROS2节点,这是在构建大型项目时启动多节点的常用方式。
示例:一次性启动多个turtlesim_node节点。

6.TF坐标变换
TF坐标变换可以实现机器人不同部件或不同机器人之间的相对位置关系的转换。
示例1:发布机器人不同部件之间的坐标系关系。

示例2:使用turtlesim_node模拟多机器人编队。

7.可视化
ROS2内置了三维可视化工具rviz2,它可以图形化的方式显示机器人模型或显示机器人系统中的一些抽象数据。
示例1:显示传感器数据。

示例2:显示机器人模型。

1.5.3 ROS2技术支持
ROS社区提供了多种技术支持机制,主要包括:包文档、问答、论坛、包索引以及问题跟踪,每种机制都有自己的用途,合适的选择技术支持机制可以避免问题的重复提问、减少问题解决时间并对新思想的交流很有帮助。
ROS包文档
ROS核心包的文档以及包的特定内容托管在ROS包文档上,可以查找到ROS的官方教程、文档和API文档。
ROS问答
如果在学习和工作中,遇到解决不了的问题,那么可以访问ROS问答,在ROS问答模块已经涉及到60000多个问题且大部分都给出了答案。开发者可以先搜索遇到的问题,如果该问题尚未提出,那么可以自行发布相关问题(在发布之前请先查看问题发布指南)。
ROS论坛
在ROS论坛我们可以了解ROS社区的最新动态。请注意:论坛是发布公告、新闻和讨论共同爱好的地方,请不要在此提出技术问题或提交异常报告。
ROS包索引
在ROS包索引可以查找特定功能包的信息。
问题跟踪器
当用户发现系统BUG或者想请求新功能时,可以在问题跟踪器上提交报告。如果是报告BUG,那么请务必提供问题的详细描述、问题产生的环境以及可能有助于开发人员重现问题的任何细节,最好能够提供调试回溯。
除了上述多种技术支持之外,ROS社区还会举办一年一度的ROSCon(ROS开发者大会),ROSCon为所有级别的 ROS 开发人员(从初学者到专家)提供了一个机会,所有的开发者可以建立联系、相互学习、分享想法或是向专家请教。ROSCon一般为期两天,主要包括技术讲座和一些ROS教程,期间将介绍新的工具和库,也会介绍已有的工具和库的深层次知识。
ROS官方的目标是让ROSCon代表整个ROS社区,这个社区是全球性和多样化的。无论你是谁,无论你做什么,无论在哪,只要对ROS感兴趣,那么都希望能够加入ROSCon。尤其鼓励女性、少数派成员和其他不具代表性的群体成员参加ROSCon。
1.5.4 ROS2应用方向
许多ROS团队伴随ROS成长到今日,其规模已经发展到足以被认为是独立组织的程度了。在导航、机械臂、无人驾驶、无人机等诸多领域大放异彩,下面列出了其中的一些团队项目,这些项目对我们以后的进阶发展,也提供了指导。
NAV2
NAV2项目继承自ROS Navigation Stack。该项目旨在可以让移动机器人从A点安全的移动到B点。它也可以应用于涉及机器人导航的其他应用,例如跟随动态点。NAV2将用于实现路径规划、运动控制、动态避障和恢复行为等一系列功能。
OpenCV
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。OpenCV旨在为计算机视觉应用程序提供通用基础架构,并加速机器感知在商业产品中的使用。OpenCV允许企业轻松地使用和修改代码。
MoveIt
MoveIt是一组ROS软件包, 主要包含运动规划、碰撞检测、运动学、3D感知、操作控制等功能。它可以用于构建机械臂的高级行为。MoveIt现在可以用于市面上的大多数机械臂,并被许多大公司使用。
The Autoware Foundation
Autoware Foundation是ROS下属的非营利组织,支持实现自动驾驶的开源项目。Autoware基金会在企业发展和学术研究之间创造协同效应,为每个人提供自动驾驶技术。
F1 Tenth
F1 Tenth是将模型车改为无人车的竞速赛事,是一个由研究人员、工程师和自主系统爱好者组成的国际社区。它最初于 2016 年在宾夕法尼亚大学成立,但后来扩展到全球许多其他机构。
microROS
在基于ROS的机器人应用中,micro-ROS正在弥合性能有限的微控制器和一般处理器之间的差距。micro-ROS在各种嵌入式硬件上运行,使ROS能直接应用于机器人硬件。
Open Robotics
Open Robotics与全球ROS社区合作,为机器人创建开放的软件和硬件平台,包括 ROS1、ROS2、Gazebo模拟器和Ignition模拟器。Open Robotics使用这些平台解决一些重要问题,并通过为各种客户组织提供软件和硬件开发服务来帮助其他人做同样的事情。
PX4
PX4是一款用于无人机和其他无人驾驶车辆的开源飞行控制软件。该项目为无人机开发人员提供了一套灵活的工具,用于共享技术并为无人机应用程序创建量身定制解决方案。
ROS-Industrial
ROS-Industrial是一个开源项目,将 ROS 软件的高级功能扩展到工业相关硬件和应用程序。
1.5.4 ROS2应用方向
许多ROS团队伴随ROS成长到今日,其规模已经发展到足以被认为是独立组织的程度了。在导航、机械臂、无人驾驶、无人机等诸多领域大放异彩,下面列出了其中的一些团队项目,这些项目对我们以后的进阶发展,也提供了指导。
NAV2
NAV2项目继承自ROS Navigation Stack。该项目旨在可以让移动机器人从A点安全的移动到B点。它也可以应用于涉及机器人导航的其他应用,例如跟随动态点。NAV2将用于实现路径规划、运动控制、动态避障和恢复行为等一系列功能。
OpenCV
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。OpenCV旨在为计算机视觉应用程序提供通用基础架构,并加速机器感知在商业产品中的使用。OpenCV允许企业轻松地使用和修改代码。
MoveIt
MoveIt是一组ROS软件包, 主要包含运动规划、碰撞检测、运动学、3D感知、操作控制等功能。它可以用于构建机械臂的高级行为。MoveIt现在可以用于市面上的大多数机械臂,并被许多大公司使用。
The Autoware Foundation
Autoware Foundation是ROS下属的非营利组织,支持实现自动驾驶的开源项目。Autoware基金会在企业发展和学术研究之间创造协同效应,为每个人提供自动驾驶技术。
F1 Tenth
F1 Tenth是将模型车改为无人车的竞速赛事,是一个由研究人员、工程师和自主系统爱好者组成的国际社区。它最初于 2016 年在宾夕法尼亚大学成立,但后来扩展到全球许多其他机构。
microROS
在基于ROS的机器人应用中,micro-ROS正在弥合性能有限的微控制器和一般处理器之间的差距。micro-ROS在各种嵌入式硬件上运行,使ROS能直接应用于机器人硬件。
Open Robotics
Open Robotics与全球ROS社区合作,为机器人创建开放的软件和硬件平台,包括 ROS1、ROS2、Gazebo模拟器和Ignition模拟器。Open Robotics使用这些平台解决一些重要问题,并通过为各种客户组织提供软件和硬件开发服务来帮助其他人做同样的事情。
PX4
PX4是一款用于无人机和其他无人驾驶车辆的开源飞行控制软件。该项目为无人机开发人员提供了一套灵活的工具,用于共享技术并为无人机应用程序创建量身定制解决方案。
ROS-Industrial
ROS-Industrial是一个开源项目,将 ROS 软件的高级功能扩展到工业相关硬件和应用程序。

B站有完整的ros系列教程视频,可以观看完整内容ros课程ROS2理论与实践
更多内容将在猛狮知识星球社区更新最新课程,后续将推出更多优质内容——详情可关注猛狮集训营公众号和猛狮集训营官方网站。