Wiki
Humble版本
本教程使用 Ubuntu 22.04 和 ROS 2 Humble,从环境准备开始,逐步学习 ros2_control 的配置、硬件接口、控制器、仿真与实物接入。
1.学习路线
运行官方 RRBot
→ 自己创建工作区与双关节工程
→ 模拟硬件 + RViz
→ 接口、生命周期、控制周期与轨迹
→ Fortress 机械臂与差速底盘物理仿真
→ 自定义控制器与框架源码
→ Asio 虚拟串口与模拟下位机
→ 根据实际设备完成实物适配
学习工作区从创建目录、功能包和文件开始,随着各章的实践逐步完善。
2.开始前需要什么
具备基本 C++ 类、继承、指针与 vector 知识;知道 ROS 2 包、Topic、参数与 launch 的基本用途。遇到 pluginlib、生命周期和 realtime buffer 时,教程会结合当前实例解释。
开始学习时不需要真实机器人。使用 Ubuntu 22.04、ROS 2 Humble、仿真和虚拟串口即可完成从环境准备到虚拟串口与模拟下位机的主要实践。软件安装与检查方法见环境准备和仿真章节。从单执行器实物接入开始,根据实际设备的型号与协议进行适配。
3.章节目录
- 环境准备与源码地图
- ros2_control整体工作过程
- 运行第一个RRBot实例
- 从零创建学习工作区
- URDF与控制接口
- YAML与launch启动过程
- 从零编写模拟硬件插件
- 状态接口与命令接口源码
- 硬件与控制器生命周期
- read-update-write控制周期
- 状态广播与机器人显示
- 命令转发与常用控制接口
- Joint-Trajectory-Controller
- 机械臂物理仿真
- DiffBot与差速底盘控制
- 差速底盘物理仿真
- 多接口与硬件类型
- 从零编写控制器
- 管理器与资源管理源码
- 实时循环与异步通信
- 虚拟串口与模拟下位机
- 单执行器实物接入
- 完整机器人与进阶实例
- 综合工程与系统排错
4.工作区与终端约定
| 路径 | 用途 | 由谁创建 |
|---|---|---|
| ~/ros2_control_demos_ws | 官方实例 | 你在环境准备与源码地图创建 |
| ~/ros2_control_humble_ws | 亲手编写的学习工程 | 你在从零创建学习工作区开始创建 |
| ~/ros2_control_humble_reference | 固定版本框架源码阅读 | 你按环境准备与源码地图下载 |
~ 指当前 Ubuntu 用户的主目录,例如 /home/你的用户名。所有命令默认在 Ubuntu 的 Bash 终端中执行。安装软件和修改系统配置时使用 sudo;创建工作区、编辑文件、构建和运行程序时使用普通用户。
每个新终端都要 source 系统 Humble 和当前使用的一个工作区。同一 ROS domain 中一次只运行本教程的一个机器人。Ubuntu 图形桌面可运行 RViz 和 Gazebo 窗口;无图形桌面时,可先按照各章的无界面方式运行并检查 Topic、接口和反馈。
5.教程统一写法
每个实践例子解释程序目标、文件位置、完整必要代码、编译运行、输出与执行顺序、函数参数与返回值、常见问题及源码入口。
自编 ROS 回调优先用 std::bind。官方源码保留原写法。代码以 C++17 为基础,使用 Ubuntu 22.04 的常规开发工具即可构建,不要求编译器具有某个特定补丁版本。示例输出、预期现象和教学伪代码会分别说明。
6.各类运动环境
| 环境 | 反馈来自哪里 | 能验证什么 |
|---|---|---|
| 模拟硬件 + RViz | C++ 内部教学模型 | 框架、接口、数据与显示链路 |
| Gazebo Fortress | 仿真关节与物理引擎 | 模型、仿真后端、控制与反馈 |
| 虚拟串口 | 模拟下位机 | 收发、协议解析、线程交接与超时 |
| 实物 | 编码器、驱动器和传感器 | 设备行为、单位、模式、故障与停止 |
RViz 显示运动不是物理仿真;轮子里程计不是世界位姿真值;虚拟串口成功不是实物已经验证。
7.源码参考版本
下面的标签和提交用于对应教程中的函数实现与配置,便于复现和阅读源码。
| 仓库 | 标签或分支 | 固定提交 |
|---|---|---|
| ros2_control | 2.54.3 | 65d389596953cb4656c4216a3f0bc08a73230739 |
| ros2_controllers | 2.54.1 | 65db73628ebac1948833f0fbdc60973c74d6cd0e |
| ros2_control_demos | humble | c273b1316cce043c252c593dc6a232ea57174690 |
| realtime_tools | 2.15.1 | 681623c9682f1336a2a1eaf473621093c4231147 |
| control_msgs | 4.9.0 | 0a1d341f0960defc40a4b146b671dad74a429f4d |
| gz_ros2_control | 0.7.21 | 3f341cd49ed579cfb17422582eb14920c203f269 |
这些是教程采用的源码参考版本,不要求 Ubuntu 用户的所有安装包都具有完全相同的补丁版本。遇到 API 或参数差异时,先检查已安装的 Humble 包版本,再对照匹配的源码。官方 Humble 文档也会更新,阅读时应区分发行版与源码提交。
8.各阶段学习验收
| 阶段 | 应观察和检查的结果 |
|---|---|
| 环境与源码 | ROS_DISTRO 为 humble,依赖能找到,官方实例能够构建 |
| GenericSystem 与生命周期 | 状态对应目标,控制器与硬件可分别停用和激活 |
| 官方 RRBot | 控制器 active,接口 claimed,反馈逐渐靠近位置目标 |
| 官方 DiffBot | 消息类型与时间戳正确,两轮反馈变化,理解命令积分里程计 |
| 自编 MiniSystem | 插件能够加载,状态接口有效,位置逐渐收敛到目标 |
| 轨迹控制器 | 合理的目标被接受,按配置满足容差后返回成功结果 |
| 自编 HoldController | 切换后能执行目标,非法输入被拒绝 |
| Fortress 双关节 | 模型生成、控制器激活、关节反馈随目标变化 |
| Fortress 差速底盘 | 轮子与车体运动,并能对照反馈里程计和世界位姿 |
| 虚拟串口 | 目标与反馈链路正常,停止下位机后能够识别反馈超时 |
| 实物接入 | 根据具体设备完成单位、方向、模式、故障与停机检查 |
| 进阶实例 | 按需选择实例,分别确认依赖、接口与运行结果 |
验收时使用关节名称匹配反馈,并检查状态、方向、误差与超时行为。示例输出用于帮助理解,实际数值会随执行时长、参数和调度情况变化。实物还需要依据实际协议和设备完成独立验证。