NO.15 · 机器人
ROS 2 Humble 学习记录:现代机器人开发工具链
ROS 2 Humble 学习笔记,覆盖节点与功能包、话题、服务、参数、Launch、TF、rqt/RViz2/ros2 bag 工具链,以及 URDF 建模与 Gazebo 仿真的入门路径。
ROS 2 是机器人开发的新一代基础设施,解决了 ROS 1 在实时性、安全性和多机通信上的诸多局限。这份 165 页的学习记录从节点与功能包讲起,覆盖完整通信机制与工具链,最后延伸到 URDF 建模与 Gazebo 仿真。
学习路线
1 | ROS 2 基础 |
核心概念
| 概念 | 作用 | 学习方向 |
|---|---|---|
| Node | 执行具体任务的运行单元 | Python/C++ 节点、日志、节点查询 |
| Topic | 面向持续数据流的异步通信 | 速度、位姿、系统状态、文本数据 |
| Service | 面向请求和响应的一次性通信 | 海龟生成、人脸检测、巡逻控制 |
| Action | 可反馈、可取消的长时间任务 | 通信体系的扩展方向 |
| Parameter | 节点运行时可配置的数据 | 声明、读取、更新和 YAML 加载 |
| Interface | 描述通信数据结构 | .msg、.srv 和接口生成 |
| Launch | 组织多个节点和运行参数 | *.launch.py 多节点启动 |
| TF | 管理机器人中的坐标系关系 | 静态 TF、动态 TF、TF 查询 |
内容概览
节点与功能包
- 分别用 Python(
rclpy)和 C++(rclcpp)编写最小节点,理解初始化与日志; - 用
ament_python和ament_cmake组织功能包,理解package.xml、setup.py与CMakeLists.txt的职责; - 使用
colcon build构建工作空间并加载install/setup.bash; - Python 和 C++ 中的多线程与回调函数实践。
话题与服务
- 用
geometry_msgs/msg/Twist控制 Turtlesim 前进、旋转、画圆,订阅位姿实现闭环控制; - 趣味实践:通过话题传输小说文本并用
espeak-ng转语音,用psutil获取系统状态共享数据,用 Qt 显示订阅到的数据; - 自定义消息与服务接口:Python 实现人脸检测服务、C++ 实现巡逻海龟服务;
- 参数声明、参数事件、YAML 配置加载,Launch 文件启动多节点并传递参数。
工具链
- TF 坐标树:Python 发布机械臂底座到相机的静态 TF,C++ 发布地图坐标系的静态与动态 TF 并查询关系;
rqt/rqt_tf_tree检查节点、话题和 TF 树,RViz2显示坐标变换与机器人状态;ros2 bag record记录话题数据并回放测试。
仿真入门
- 创建 ROS 2 描述功能包,使用 URDF 描述机器人连杆、关节与结构;
urdf_to_graphviz生成模型结构图,RViz2 加载显示机器人模型;- 使用 Xacro 简化和复用 URDF,建立 Gazebo 仿真基础。
常用命令速查
1 | # 环境加载 |
工程注意事项
- 修改
package.xml、setup.py或CMakeLists.txt后,应重新执行colcon build并重新source install/setup.bash; - Topic 的名称、消息类型、QoS 配置需要保持一致;
- 自定义
.msg、.srv接口变更后,应重新生成接口并检查所有依赖节点; - TF 查询依赖正确的父子坐标系、时间戳和 TF 发布器;
- 多线程回调需要明确共享数据、线程退出和资源同步策略。
推荐实践顺序
- 安装 ROS 2 后运行 Turtlesim、键盘控制和
rqt,确认基础环境可用; - 分别用 Python 和 C++ 编写最小节点,理解
rclpy与rclcpp; - 创建两类功能包,通过 Turtlesim 学习 Topic 的发布、订阅与闭环控制;
- 使用自定义消息和服务接口,理解接口生成与服务端/客户端;
- 学习参数、Launch、TF、RViz2 和
ros2 bag; - 最后用 URDF、Xacro 和 Gazebo 建立建模与仿真基础。