1. ROS2 概述
ROS2 是机器人操作系统(Robot Operating System)的第二代版本,但严格来说,ROS2 不是操作系统。它本身运行需要依赖Linux、 Windows等操作系统。相比ROS1,它具有以下核心优势:
| 特性 | 说明 |
|---|---|
| 实时性 | 支持实时操作系统(RTOS),满足工业级应用需求 |
| 安全性 | 内置DDS安全机制,支持加密通信 |
| 多平台 | 支持Linux、Windows、macOS、RTOS等 |
| 可扩展性 | 支持多机器人协同、云边端协同 |
| 生命周期管理 | 节点状态可管理,便于系统监控和维护 |
2.ROS2 系统架构总览
graph TB
subgraph 应用层["应用层 (Application Layer)"]
A1[节点 Nodes]
A2[生命周期节点 Lifecycle Nodes]
A3[组件 Components]
end
subgraph 中间件层["中间件层 (Middleware Layer)"]
B1[客户端库<br/>Client Libraries]
B2[rcl<br/>C API]
B3[rmw<br/>Middleware Interface]
end
subgraph 通信层["通信层 (Communication Layer)"]
C1[数据分发服务<br/>DDS]
C2[RMW Implementation<br/>Fast-DDS / Cyclone DDS / Connext]
end
subgraph 操作系统层["操作系统层 (OS Layer)"]
D1[Linux]
D2[Windows]
D3[macOS]
D4[RTOS]
end
A1 --> B1
A2 --> B1
A3 --> B1
B1 --> B2
B2 --> B3
B3 --> C1
C1 --> C2
C2 --> D1
C2 --> D2
C2 --> D3
C2 --> D4
🔹 节点(Nodes)
节点是ROS2中最基本的执行单元,每个节点负责一个具体的功能模块。
🔹 客户端库(Client Libraries)
ROS2提供多种语言的客户端库:
| 库名称 | 语言 | 说明 |
|---|---|---|
| rclcpp | C++ | 高性能,适合生产环境 |
| rclpy | Python | 快速开发,适合原型验证 |
| rclrs | Rust | 内存安全,适合关键系统 |
rcl是ROS2底层的客户端库,是一个纯C语言库,包含了所有核心功能。rclcpp、rclpy都是构建在rcl之上的客户端库,rcl是上层语言特定客户端库(如 rclcpp、rclpy)与ROS2中间件之间的桥梁。除了C++ 和 Python外,大多数其他语言的客户端库都由开源社区支持,例如Rust(rclrs)、Node.js(rclnodejs)。
3. ROS2核心概念
- 工作空间 (Workspace): 开发过程中放置各种开发文件的地方。
- 功能包(Package): 功能源码的聚集地,用于实现特定机器人功能。
- **节点(Node): **机器人的工作细胞,是代码编译生成的一个可执行文件。
- 话题 (Topic): 节点间传递数据的桥梁,周期性传递各功能之间的信息。
- **服务 (Service): **节点间的“你问我答”,用于某些机器人功能和参数的配置。
- 通信接口 (Interface): 数据传递的标准结构,规范了机器人的各种数据形态。
- 参数 (Parameter): 机器人系统的全局字典,可定义或查询机器人的配置参数。
- 动作 (Action): 完整行为的流程管理,控制机器人完成某些动作。
- 分布式通信(Distributed Communication): 多计算平台的任务分配,实现快速组网。
- DDS(Data Distribution Service): 机器人的神经网络,完成数据的高效安全传送。
4.ROS2 通信机制
graph TB
subgraph 通信模式
T[话题 Topics]
S[服务 Services]
A[动作 Actions]
P[参数 Parameters]
end
T --> T1["单向通信<br/>传感器数据流"]
S --> S1["双向通信<br/>请求-响应"]
A --> A1["长时间任务<br/>带反馈"]
P --> P1["节点配置<br/>键值对"]
5.ROS2 机器人开发流程
6. 工作空间
6.1 工作空间是什么
在ROS 2中,开发者针对机器人的某些功能进行代码开发时,编写的代码、参数、 脚本等文件,需要放置在某个文件夹里进行管理,这个文件夹在ROS 2 系统中叫作工作空间 (Workspace)。
一个典型的 ROS 2 工作空间结构如下图所示
-
build: 编译空间,用于保存编译过程中产生的中间文件。
-
install: 安装空间,用于放置编译得到的可执行文件、脚本、配置等运行属性的文件。
-
log: 日志空间,用于保存编译和运行过程中产生的各种警告、错误、信息等日志。
-
src: 代码空间,用于放置编写的代码、脚本、配置等开发属性的文件。
ROS 2机器人开发的大部分操作都是在src 中进行的,编译成功后,执行install 中的可执行 文件,build 和 log 两个文件夹使用相对较少。
6.2 创建并初始化工作空间
1.创建工作空间 创建工作空间的方法有很多,本质就是创建一个文件夹。
mkdir -p learn_ws/src
上述命令是在当前目录下创建learn_ws工作空间并且在该工作空间根目录下创建src文件夹。 2.初始化工作空间
# 进入工作空间根目录
cd learn_ws
# 构建空工作空间(生成build/install/log目录)
colcon build
# 验证生成目录
ls -a
7.功能包
7.1 功能包是什么
在 ROS2 中,功能包是组织、构建和分发软件的最小基本单位。可以把它理解为一个包含特定功能(如机器人驱动、感知、路径规划等)的独立文件夹,其中包含了编译、运行和共享所需的所有文件。开发者可以将不同功能的代码划分到不同的功能包中,尽量减少它们之间的耦合关系。
7.2创建功能包
在src目录下创建一个python功能包
# 进入src目录
cd src
#创建python功能包
ros2 pkg create python_pkg --build-type ament_python --license Apache-2.0
#创建C++功能包
ros2 pkg create cpp_pkg --build-type ament_cmake --license Apache-2.0
build-type: 表示新创建的功能包是 C++还是 Python, 如果使用Python, 就是 “ament_python”;如果使用 C++或者 C, 就是 “ament_cmake”。 license:表示开源协议,这里选择Apache-2.0(没有license也可以创建成功,但是会有警告,提示你指定license,所以一般情况还是把这个参数加上)。
7.3功能包结构
1.C++功能包
功能包结构如下图所示
-
package.xml 文件涵盖了功能包的版权描述,详细阐述了版权所有者、版权年份及版权声明 等关键信息。此外,该文件还列出了功能包所依赖的各种库、工具或资源,包括它们的版本要 求和来源声明,为功能包的正确构建和运行提供了必要的依赖声明信息。
以cpp_pkg 的 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>cpp_pkg</name> <version>0.0.0</version> <description>TODO: Package description</description> <maintainer email="wanggy@todo.todo">wanggy</maintainer> <license>Apache-2.0</license> <buildtool_depend>ament_cmake</buildtool_depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> <export> <build_type>ament_cmake</build_type> </export> </package> -
CMakeLists.txt文件是定义编译规则的关键文件。由于C++ 代码需要先编译才能运行,因此 在这个文件中,必须详细设置编译的过程和规则,包括指定编译器、编译选项、链接库等,以 确保代码能够正确编译成可执行文件。
以cpp_pkg 的CMakeLists.txt 为例,其中的内容如下
cmake_minimum_required(VERSION 3.8) project(cpp_pkg) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() #查找ament_cmake包,这是ROS2构建系统的核心包 find_package(ament_cmake REQUIRED) #如果需要手动添加其他依赖项,则可以取消注释并填写 # find_package(<dependency> REQUIRED) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) # the following line skips the linter which checks for copyrights # comment the line when a copyright and license is added to all source files set(ament_cmake_copyright_FOUND TRUE) # the following line skips cpplint (only works in a git repo) # comment the line when this package is in a git repo and when # a copyright and license is added to all source files set(ament_cmake_cpplint_FOUND TRUE) ament_lint_auto_find_test_dependencies() endif() # 调用ament_package()宏,它设置了包安装的目标和ament相关的一些构建属性 ament_package()2.Python功能包
功能包结构如下图所示
- package.xml 文件在 Python 功能包中的作用与在C++功能包中相似,不在具体描述。
- setup.cfg 是 ROS2 构建系统为了兼容 Python 标准打包方式(setuptools)而做出的适配,主要用来解决开发环境与安装环境的路径映射问题。
- setup.py文件用于描述如何安装和分发该功能包。该文件包含 了功能包的元数据、依赖关系、安装脚本等信息,是构建和安装Python 功能包不可或缺的一部 分。以python_pkg 中的setup.py 为例:
#导入setuptools的find_packages和setup函数
from setuptools import find_packages, setup
#定义包名
package_name = 'python_pkg'
#使用setup函数定义包的安装信息
setup(
name=package_name,
version='0.0.0',
#使用find_packages自动发现包,排除'test'目录
packages=find_packages(exclude=['test']),
#定义需要安装的数据文件
data_files=[
#数据文件安装到的目录和文件列表
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='wanggy',
maintainer_email='wanggy@todo.todo',
description='TODO: Package description',
license='Apache-2.0',
extras_require={
'test': [
'pytest',
],
},
#定义命令行脚本的入口点
entry_points={
'console_scripts': [
],
},
)
7.4 构建功能包
虽然构建功能包的方法多种多样,但核心都是围绕colcon的使用展开。colcon 是一个专为ROS2设计的构建工具,它能够有效地处理功能包中的源代码,并将其构建成可执行文件或库文件,为后续的运行和测试提供必要的支持。
#在工作空间根目录下进行构建
#构建工作空间中的所有包
colcon build
#只构建特定包
colcon build --packages-select [my_package]
#只能构建python包,当你修改过源文件后,不需要colcon build,可直接运行。因为python本身可以直接运行源代码,不需要进行编译。
#有时会导致一些错误,如果经常遇到,请不要使用。
colcon build --packages-select [my_python_pkg] --symlink-install