机器人运动学与 ROS2 基础教程
这套教程面向“想真正把机器人系统跑起来”的开发者:不只讲公式,也不只讲命令,而是围绕一个可运行的两连杆机械臂示例,串起运动学、ROS2 工程化与 MoveIt 2 规划闭环。

上图是教程最终效果:末端执行器按规划轨迹运动,系统运行在 ROS2 Jazzy + MoveIt 2。
1. 为什么学习这套教程
在机器人开发里,常见问题不是“不会写代码”,而是“知识点会一点,但连不起来”。这套教程重点解决三个断层:
- 数学与工程断层:把 FK/IK 从公式推导到可运行代码
- 单节点与系统断层:把 Topic/Service/Action、参数、Launch 串成可维护工程
- 模型与规划断层:把 tf2、URDF、MoveIt 2 接成一个完整规划系统
2. 本教程涵盖的内容
| 章节 | 核心主题 | 实践结果 |
|---|---|---|
| 1. 系统导览与机器人全景 | 机器人六层结构、ROS2 角色、学习路径 | 建立整体认知与工程地图 |
| 2. 运动学核心概念与坐标变换 | 坐标系、旋转/平移、齐次变换 | 理解 FK 推导的基础 |
| 3. 正运动学与逆运动学实现 | 两连杆 FK/IK 推导与代码化 | 得到可复用的运动学函数 |
| 4. ROS2 工程基础 | 工作空间、功能包、节点组织 | 从脚本过渡到 ROS2 工程 |
| 5. 话题通信 Topic | 发布/订阅与消息类型 | 让节点持续交换数据 |
| 6. 服务通信 Service 与动作 Action | 请求-响应与长任务反馈 | 实现 IK 服务与动作执行 |
| 7. 参数系统与 Launch 文件 | 参数管理与一键启动 | 多节点配置集中化 |
| 8. tf2 坐标变换管理 | 坐标树、广播与查询 | 统一系统空间表达 |
| 9. URDF 机器人建模与 robot_state_publisher | 机器人结构建模与状态发布 | 用模型驱动 TF 关系 |
| 10. MoveIt 2 基础与运动规划 | MoveIt 配置与首次规划 | 触发可视化路径规划 |
| 11. MoveIt 2 仿真项目实战 | 目标输入、IK、规划与执行闭环 | 完成完整仿真系统 |
| 12. 教程总结与进阶方向 | 知识复盘、迁移与扩展方向 | 构建后续学习路线 |
3. 章节目录
- 1. 系统导览与机器人全景
- 2. 运动学核心概念与坐标变换
- 3. 正运动学与逆运动学实现
- 4. ROS2 工程基础
- 5. 话题通信 Topic
- 6. 服务通信 Service 与动作 Action
- 7. 参数系统与 Launch 文件
- 8. tf2 坐标变换管理
- 9. URDF 机器人建模与 robot_state_publisher
- 10. MoveIt 2 基础与运动规划
- 11. MoveIt 2 仿真项目实战
- 12. 教程总结与进阶方向
4. 推荐学习路线
系统导览 → 运动学基础(2-3) → ROS2 工程化(4-7) → 建模与坐标系统(8-9) → MoveIt 2 规划(10-11) → 总结与进阶(12)
如果时间有限,建议优先走完:1 -> 3 -> 5 -> 8 -> 9 -> 10 -> 11。这条主线能最快形成“可运行闭环”。
环境准备
克隆项目后,设置工作空间路径变量,后续所有命令都依赖这个变量:
# 进入你 clone 的项目根目录
cd /你clone的路径/ros_learning
# 设置 ROS_WS 变量(永久生效)
echo "export ROS_WS=$(pwd)/ros_ws" >> ~/.bashrc
source ~/.bashrc
# 验证
echo $ROS_WS
输出应为你本地的 ros_ws 绝对路径,例如 /home/yourname/ros_learning/ros_ws。
配套代码
配套代码位于 $ROS_WS/src/,包含以下包:
| 包名 | 内容 |
|---|---|
my_robot_basics | 运动学函数、基础节点(3-8) |
my_robot_interfaces | 自定义 Service/Action 接口(6) |
my_robot_description | URDF 模型文件(9) |
my_robot_moveit_config | MoveIt 2 配置包(10) |
my_robot_planner | 规划客户端节点(10-11) |
my_robot_bringup | 一键启动 Launch 文件(11) |
使用说明
- 文档默认使用 ROS2 Jazzy(Ubuntu 24.04),涉及其他发行版时把
jazzy替换为对应名称即可,核心概念完全一致。 - MoveIt 2 章节中明确区分 C++ 的
MoveGroupInterface与 Python 侧的moveit_py,避免概念混淆。 - 所有 shell 命令示例统一使用
vim编辑文件。