00_整体路线图与前言
本文档属于 Robotics Tutorial 项目,作者:Pengfei Guo,达妙科技。采用 CC BY 4.0 协议,转载请注明出处。
仅覆盖子课程一:机械臂基础(P01-P02 + M01-M15)¶
机械臂方向 C++ 进阶教学大纲(v0.1 · 增量式完整版)¶
定位:本大纲是《面向 SLAM 工程师的 C++ 中高级进阶完整教学大纲 v8》(46 章 48 周)的**增量扩展**,面向完成 v8 主线后希望切入**机械臂方向**(6/7-DOF 工业臂、协作臂、移动操作臂)的工程师。
章节编号:Part 0(P01, P02 共 2 章跨方向共享) + Part 1-6(M01-M15 机械臂专题,共 15 章)= 17 章,约 24 周。Part 0 可复用到后续腿足/无人机/RL 专题而不重写。
数据基础:基于 100+ 个机械臂相关开源项目的源码级分析——《机械臂规控 C++ 项目全景调研》、《manipulator_cpp_research》、《机器人规划与控制领域 C++ 库生态全景调研》、《规划与控制领域的 C++ 横向工程技术全景》、《轮足机器人与足式机械臂开源项目全景调研》、《Mastering URDF and Xacro for Robot Modeling in ROS 2》、《ROS2 Hardware Integration and Embedded Ecosystem》等。
前置假设:学员已完成 v8 的 46 章——掌握现代 C++17(含 CRTP、SFINAE、表达式模板)、Eigen 高级、并发(thread/mutex/atomic/TBB)、SLAM 优化(GTSAM/Ceres/g2o)、ROS2 基础、CMake/CUDA 基础、SLAM 项目精读(ORB-SLAM3/FAST-LIO2)。在此基础上切入机械臂**不需要重新学 C++**,只需补"机械臂领域特有的 C++ 技术 + 库生态"。
风格对齐:核心章节尽量采用
教学目标 / 前置依赖 / 核心知识点(多个子标题) / 项目精读清单 / 实战练习(A 型 + B 型 + 思考题) / 预计学习时间的六段式结构;少数后置综合章节后续统一补齐,导航不把该结构作为已完成承诺。预留接口:每章标注 ✅ 全方向共享 / ⚪ 部分共享 / ❌ 纯机械臂 以便后续复用到腿足/无人机/RL 专题。
整体路线图¶
主线 v8 完成(Ch1-46,第 1-48 周)
│
│ 学生此时具备:
│ - C++17 现代特性(含 CRTP、SFINAE、Concepts)
│ - Eigen 高级(Map/Block/表达式模板)
│ - 并发(thread/mutex/atomic/TBB)
│ - SLAM 图优化(GTSAM/Ceres/g2o)
│ - ROS2 基础/CMake/CUDA 基础
│ - SLAM 项目精读(ORB-SLAM3/FAST-LIO2)
▼
┌─────────────────────────────────────────────────────┐
│ Part 0:跨方向共享基础(第 49-51 周,2.5 周) │
│ P01 URDF / Xacro 机器人建模 │
│ P02 sim-to-real 资产管道与多目标部署 │
└─────────────────────────────────────────────────────┘
│ 【✅ 后续腿足/无人机/RL 专题直接复用】
▼
┌─────────────────────────────────────────────────────┐
│ Part 1:机械臂动力学与运动学(第 52-55 周,4 周) │
│ M01 Pinocchio 深度精读——CRTP + 模板标量类型 │
│ M02 动力学库对比——RBDL/DART/KDL/Drake │
│ M03 IK 求解器——KDL/TRAC-IK/IKFast/ik_geo/pick-ik │
└─────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────┐
│ Part 2:碰撞检测与数学优化(第 56-59 周,4 周) │
│ M04 碰撞检测——FCL / HPP-FCL(Coal) │
│ M05 QP / NLP 建模工程——OSQP/ProxQP/Ipopt/CasADi │
│ M06 自动微分与代码生成——CppAD/CppADCodeGen │
└─────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────┐
│ Part 3:机械臂运动规划(第 60-65 周,5.5 周) │
│ M07 OMPL 采样规划——StateSpace 继承体系 │
│ M08 轨迹优化规划器——TrajOpt/CHOMP/STOMP/KOMO │
│ M09 GPU / SIMD 加速规划——cuRobo + VAMP │
│ M10 时间参数化——Ruckig / TOPP-RA / TOTG │
└─────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────┐
│ Part 4:实时控制与硬件(第 66-68 周,3 周) │
│ M11 实时 C++ 工程——PREEMPT_RT + 无堆分配 │
│ M12 ros2_control + 硬件驱动 + RL 部署 │
└─────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────┐
│ Part 5:任务编排与系统集成(第 69-71 周,3 周) │
│ M13 BehaviorTree.CPP 深度 │
│ M14 MoveIt2 + MTC 工业集成 │
└─────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────┐
│ Part 6:综合实战(第 72-73 周,2 周) │
│ M15 Mini-Manip——Franka Panda pick-and-place │
└─────────────────────────────────────────────────────┘
全部投入:Part 0 + Part 1-6 共 24 周,全职等效约 6 个月;业余 15-20 小时/周约 12-15 个月。
前言:给 SLAM 背景学员的认知导引¶
0.1 SLAM 工程师进入机械臂的三大认知跨越¶
完成 v8 的 SLAM 主线后,进入机械臂方向会遇到三个核心的心智模型切换。先说清楚,避免在 M01 Pinocchio 时感到"思维方式对不上"。
跨越一:从"估计"到"生成"
SLAM 的工作方式是给定传感器数据估计机器人状态——观测 → 状态(被动的状态识别)。机械臂规控的工作方式是给定任务目标生成动作序列——目标 → 状态序列 → 动作(主动的状态合成)。优化问题的变量结构、约束类型、求解频率根本不同:SLAM 是批量或滑窗的,机械臂规控是滚动时域的。
跨越二:从"稀疏因子图"到"密集约束 QP"
Ceres/g2o 擅长的是**无约束或仅含边界约束的非线性最小二乘**——SLAM 的主要问题形式。规控的核心挑战是**带约束的优化**:关节限位、碰撞避免、力/力矩上限、动力学方程都是不等式或等式约束。Ceres 不支持通用不等式约束,这是 SLAM 工程师进入规控的第一道认知鸿沟。从 least-squares 到 constrained NLP 的迁移不是"加一个库",而是问题建模范式的根本改变——你需要学的是 OSQP/ProxQP(QP)、Ipopt(NLP)、HPIPM(结构化 MPC-QP)这批新求解器。
跨越三:从"10Hz 软实时"到"1kHz 硬实时"
你可能一直以为 FAST-LIO2 的"100Hz"是快的。但机械臂与真机通信的时间基准是 1 kHz(1 ms 周期),偶尔超时会导致机器人失控。这要求:无动态内存分配(任何 malloc 可能导致 100-500 µs 延迟尖峰)、无异常、无阻塞 mutex、PREEMPT_RT 内核、SCHED_FIFO 调度、mlockall 锁内存。习惯的 std::vector::push_back()、std::cout 调试、std::mutex 保护共享数据——都是 1 kHz 实时的禁忌。
0.2 机械臂 C++ 生态的三大学派对立¶
进入机械臂方向会发现,开源项目不是松散分布,而是**三大学派鼎立**:
| 学派 | 核心项目 | 许可证 | C++ 标准 | 架构哲学 |
|---|---|---|---|---|
| 法国 INRIA 学派 | Pinocchio + TSID + Crocoddyl + Coal + ProxQP + Aligator | BSD-2 | C++17/20/23 | 纯模板 + 模块化库,每库只做一事做到极致 |
| 美国 TRI 学派 | Drake(一个巨型库) | BSD-3 | C++20 + Bazel | 集成框架 + System<T> 标量参数化 |
| 美国 SwRI 工程派 | MoveIt2 + Tesseract + ros2_control | BSD-3/Apache-2.0 | C++17 | pluginlib 运行时多态 + ROS2 深度集成 |
三派**教学价值都是 5 星**,但路径完全不同: - INRIA 路线 = 学会用 5-7 个独立库拼装(本大纲主选) - Drake 路线 = 只学一个但代码库巨大(M02 选读) - SwRI 路线 = pluginlib/YAML 配置驱动(M14 精读)
对 RL + 具身方向的启示:Drake 路线因 AutoDiffXd 和 symbolic::Expression 对 RL+MPC 混合研究最友好(同一份代码同时做仿真/优化/符号推导);但工程落地最快的是 MoveIt2 + ros2_control 路线。本大纲以 INRIA 为主干,Drake 在 M02 精读,MoveIt2 在 M14 精读,三派都覆盖。
0.3 前置依赖一览¶
| 本大纲章节 | 依赖 v8 章节 | 依赖的具体知识点 |
|---|---|---|
| M01 Pinocchio | v8 Ch14(CRTP)、Ch11(Eigen) | Sophus CRTP 基础、模板元编程、Eigen Map/Block |
| M02 动力学库 | v8 Ch6(继承多态) | 虚函数表、override/final |
| M03 IK | v8 Ch19-20(并发) | std::thread/std::atomic 用于 TRAC-IK 并行 |
| M04 碰撞检测 | v8 Ch13(模板特化) | FCL BVH 模板设计 |
| M05 QP/NLP | v8 Ch17(Ceres) | 最小二乘基础、Jet AD,扩展到约束优化 |
| M06 AD + codegen | v8 Ch17(Ceres) | Ceres Jet 的 tape-based AD 心智模型 |
| M11 实时 C++ | v8 Ch19-20、Ch35(pmr) | STL 分配语义、atomic 内存序 |
| M12 ros2_control | v8 Ch31(ROS2 高级) | Lifecycle Node、Component、QoS |
| M13 BT.CPP | v8 Ch29(设计模式) | Composite Pattern、Strategy Pattern |
| M14 MoveIt2 | v8 Ch29、Ch31 | pluginlib(dlopen + 工厂 + 虚函数) |
v8 前置三层口径: - 最低可启动:Ch11、Ch14、Ch17、Ch19-20、Ch29、Ch31。可支撑 P01/M01/M03/M05/M11/M13/M14 的入门版和 Quick Start 演示,但不覆盖全部工程细节。 - 推荐补齐:Ch3、Ch6、Ch11、Ch14、Ch17、Ch19-20、Ch29、Ch31、Ch35。适合按 M01-M15 主线学习并进入 M11/M12 实时控制。 - 完整前置:完成 v8 Ch1-Ch46。若未完整完成,至少按附录 C 的章节索引补齐与机械臂直接相关的章节。
0.4 预留接口的明确标注(供后续腿足/无人机/RL 专题复用)¶
- ✅ 全方向共享(内容一字不改即可迁移):Part 0 完整、M01(Pinocchio)、M02(动力学库)、M05(QP/NLP)、M06(AD+codegen)、M11(实时 C++)、M13(BT.CPP)——共 8 章
- ⚪ 部分共享(核心知识共用,但应用场景/API 不同):M04(碰撞检测)、M09(GPU/SIMD)、M10(时间参数化)、M12(ros2_control)、M15(Mini-Manip 模板)
- ❌ 纯机械臂(不迁移):M03(IK)、M07(OMPL 采样)、M08(轨迹优化规划器)、M14(MoveIt2+MTC)
未来做**腿足专题**时,可直接复制 ✅ 的 8 章,仅在 M12 替换为腿足的 legged_control/OCS2 栈、在 M14 替换为腿足的 TSID/WBC 内容。