|
| 1 | +> 本文档属于 [Robotics Tutorial](https://github.com/Michael-Jetson/Robotics_Tutorial) 项目,作者:Pengfei Guo,达妙科技。采用 [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) 协议,转载请注明出处。 |
| 2 | +
|
| 3 | +## 仅覆盖子课程一:机械臂基础(P01-P02 + M01-M15) |
| 4 | + |
| 5 | +### 机械臂方向 C++ 进阶教学大纲(v0.1 · 增量式完整版) |
| 6 | + |
| 7 | +> **定位**:本大纲是《面向 SLAM 工程师的 C++ 中高级进阶完整教学大纲 v8》(46 章 48 周)的**增量扩展**,面向完成 v8 主线后希望切入**机械臂方向**(6/7-DOF 工业臂、协作臂、移动操作臂)的工程师。 |
| 8 | +> |
| 9 | +> **章节编号**:Part 0(P01, P02 共 2 章跨方向共享) + Part 1-6(M01-M15 机械臂专题,共 15 章)= **17 章,约 24 周**。Part 0 可复用到后续腿足/无人机/RL 专题而不重写。 |
| 10 | +> |
| 11 | +> **数据基础**:基于 100+ 个机械臂相关开源项目的源码级分析——《机械臂规控 C++ 项目全景调研》、《manipulator_cpp_research》、《机器人规划与控制领域 C++ 库生态全景调研》、《规划与控制领域的 C++ 横向工程技术全景》、《轮足机器人与足式机械臂开源项目全景调研》、《Mastering URDF and Xacro for Robot Modeling in ROS 2》、《ROS2 Hardware Integration and Embedded Ecosystem》等。 |
| 12 | +> |
| 13 | +> **前置假设**:学员已完成 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++ 技术 + 库生态"。 |
| 14 | +> |
| 15 | +> **风格对齐**:核心章节尽量采用 `教学目标 / 前置依赖 / 核心知识点(多个子标题) / 项目精读清单 / 实战练习(A 型 + B 型 + 思考题) / 预计学习时间` 的六段式结构;少数后置综合章节后续统一补齐,导航不把该结构作为已完成承诺。 |
| 16 | +> |
| 17 | +> **预留接口**:每章标注 **✅ 全方向共享 / ⚪ 部分共享 / ❌ 纯机械臂** 以便后续复用到腿足/无人机/RL 专题。 |
| 18 | +
|
| 19 | +--- |
| 20 | + |
| 21 | +## 整体路线图 |
| 22 | + |
| 23 | +``` |
| 24 | +主线 v8 完成(Ch1-46,第 1-48 周) |
| 25 | + │ |
| 26 | + │ 学生此时具备: |
| 27 | + │ - C++17 现代特性(含 CRTP、SFINAE、Concepts) |
| 28 | + │ - Eigen 高级(Map/Block/表达式模板) |
| 29 | + │ - 并发(thread/mutex/atomic/TBB) |
| 30 | + │ - SLAM 图优化(GTSAM/Ceres/g2o) |
| 31 | + │ - ROS2 基础/CMake/CUDA 基础 |
| 32 | + │ - SLAM 项目精读(ORB-SLAM3/FAST-LIO2) |
| 33 | + ▼ |
| 34 | +┌─────────────────────────────────────────────────────┐ |
| 35 | +│ Part 0:跨方向共享基础(第 49-51 周,2.5 周) │ |
| 36 | +│ P01 URDF / Xacro 机器人建模 │ |
| 37 | +│ P02 sim-to-real 资产管道与多目标部署 │ |
| 38 | +└─────────────────────────────────────────────────────┘ |
| 39 | + │ 【✅ 后续腿足/无人机/RL 专题直接复用】 |
| 40 | + ▼ |
| 41 | +┌─────────────────────────────────────────────────────┐ |
| 42 | +│ Part 1:机械臂动力学与运动学(第 52-55 周,4 周) │ |
| 43 | +│ M01 Pinocchio 深度精读——CRTP + 模板标量类型 │ |
| 44 | +│ M02 动力学库对比——RBDL/DART/KDL/Drake │ |
| 45 | +│ M03 IK 求解器——KDL/TRAC-IK/IKFast/ik_geo/pick-ik │ |
| 46 | +└─────────────────────────────────────────────────────┘ |
| 47 | + ▼ |
| 48 | +┌─────────────────────────────────────────────────────┐ |
| 49 | +│ Part 2:碰撞检测与数学优化(第 56-59 周,4 周) │ |
| 50 | +│ M04 碰撞检测——FCL / HPP-FCL(Coal) │ |
| 51 | +│ M05 QP / NLP 建模工程——OSQP/ProxQP/Ipopt/CasADi │ |
| 52 | +│ M06 自动微分与代码生成——CppAD/CppADCodeGen │ |
| 53 | +└─────────────────────────────────────────────────────┘ |
| 54 | + ▼ |
| 55 | +┌─────────────────────────────────────────────────────┐ |
| 56 | +│ Part 3:机械臂运动规划(第 60-65 周,5.5 周) │ |
| 57 | +│ M07 OMPL 采样规划——StateSpace 继承体系 │ |
| 58 | +│ M08 轨迹优化规划器——TrajOpt/CHOMP/STOMP/KOMO │ |
| 59 | +│ M09 GPU / SIMD 加速规划——cuRobo + VAMP │ |
| 60 | +│ M10 时间参数化——Ruckig / TOPP-RA / TOTG │ |
| 61 | +└─────────────────────────────────────────────────────┘ |
| 62 | + ▼ |
| 63 | +┌─────────────────────────────────────────────────────┐ |
| 64 | +│ Part 4:实时控制与硬件(第 66-68 周,3 周) │ |
| 65 | +│ M11 实时 C++ 工程——PREEMPT_RT + 无堆分配 │ |
| 66 | +│ M12 ros2_control + 硬件驱动 + RL 部署 │ |
| 67 | +└─────────────────────────────────────────────────────┘ |
| 68 | + ▼ |
| 69 | +┌─────────────────────────────────────────────────────┐ |
| 70 | +│ Part 5:任务编排与系统集成(第 69-71 周,3 周) │ |
| 71 | +│ M13 BehaviorTree.CPP 深度 │ |
| 72 | +│ M14 MoveIt2 + MTC 工业集成 │ |
| 73 | +└─────────────────────────────────────────────────────┘ |
| 74 | + ▼ |
| 75 | +┌─────────────────────────────────────────────────────┐ |
| 76 | +│ Part 6:综合实战(第 72-73 周,2 周) │ |
| 77 | +│ M15 Mini-Manip——Franka Panda pick-and-place │ |
| 78 | +└─────────────────────────────────────────────────────┘ |
| 79 | +``` |
| 80 | + |
| 81 | +**全部投入**:Part 0 + Part 1-6 共 24 周,全职等效约 6 个月;业余 15-20 小时/周约 12-15 个月。 |
| 82 | + |
| 83 | +--- |
| 84 | + |
| 85 | +## 前言:给 SLAM 背景学员的认知导引 |
| 86 | + |
| 87 | +### 0.1 SLAM 工程师进入机械臂的三大认知跨越 |
| 88 | + |
| 89 | +完成 v8 的 SLAM 主线后,进入机械臂方向会遇到三个核心的心智模型切换。先说清楚,避免在 M01 Pinocchio 时感到"思维方式对不上"。 |
| 90 | + |
| 91 | +**跨越一:从"估计"到"生成"** |
| 92 | + |
| 93 | +SLAM 的工作方式是给定传感器数据估计机器人状态——观测 → 状态(被动的状态识别)。机械臂规控的工作方式是给定任务目标生成动作序列——目标 → 状态序列 → 动作(主动的状态合成)。优化问题的变量结构、约束类型、求解频率根本不同:SLAM 是批量或滑窗的,机械臂规控是滚动时域的。 |
| 94 | + |
| 95 | +**跨越二:从"稀疏因子图"到"密集约束 QP"** |
| 96 | + |
| 97 | +Ceres/g2o 擅长的是**无约束或仅含边界约束的非线性最小二乘**——SLAM 的主要问题形式。规控的核心挑战是**带约束的优化**:关节限位、碰撞避免、力/力矩上限、动力学方程都是不等式或等式约束。**Ceres 不支持通用不等式约束**,这是 SLAM 工程师进入规控的第一道认知鸿沟。从 least-squares 到 constrained NLP 的迁移不是"加一个库",而是问题建模范式的根本改变——你需要学的是 OSQP/ProxQP(QP)、Ipopt(NLP)、HPIPM(结构化 MPC-QP)这批新求解器。 |
| 98 | + |
| 99 | +**跨越三:从"10Hz 软实时"到"1kHz 硬实时"** |
| 100 | + |
| 101 | +你可能一直以为 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 实时的禁忌**。 |
| 102 | + |
| 103 | +### 0.2 机械臂 C++ 生态的三大学派对立 |
| 104 | + |
| 105 | +进入机械臂方向会发现,开源项目不是松散分布,而是**三大学派鼎立**: |
| 106 | + |
| 107 | +| 学派 | 核心项目 | 许可证 | C++ 标准 | 架构哲学 | |
| 108 | +|------|----------|--------|---------|----------| |
| 109 | +| **法国 INRIA 学派** | Pinocchio + TSID + Crocoddyl + Coal + ProxQP + Aligator | BSD-2 | C++17/20/23 | 纯模板 + 模块化库,每库只做一事做到极致 | |
| 110 | +| **美国 TRI 学派** | Drake(一个巨型库) | BSD-3 | C++20 + Bazel | 集成框架 + `System<T>` 标量参数化 | |
| 111 | +| **美国 SwRI 工程派** | MoveIt2 + Tesseract + ros2_control | BSD-3/Apache-2.0 | C++17 | pluginlib 运行时多态 + ROS2 深度集成 | |
| 112 | + |
| 113 | +三派**教学价值都是 5 星**,但路径完全不同: |
| 114 | +- INRIA 路线 = 学会用 5-7 个独立库拼装(本大纲主选) |
| 115 | +- Drake 路线 = 只学一个但代码库巨大(M02 选读) |
| 116 | +- SwRI 路线 = pluginlib/YAML 配置驱动(M14 精读) |
| 117 | + |
| 118 | +**对 RL + 具身方向的启示**:Drake 路线因 `AutoDiffXd` 和 `symbolic::Expression` 对 RL+MPC 混合研究最友好(同一份代码同时做仿真/优化/符号推导);但工程落地最快的是 MoveIt2 + ros2_control 路线。本大纲以 INRIA 为主干,Drake 在 M02 精读,MoveIt2 在 M14 精读,三派都覆盖。 |
| 119 | + |
| 120 | +### 0.3 前置依赖一览 |
| 121 | + |
| 122 | +| 本大纲章节 | 依赖 v8 章节 | 依赖的具体知识点 | |
| 123 | +|-----------|------------|-----------------| |
| 124 | +| M01 Pinocchio | v8 Ch14(CRTP)、Ch11(Eigen) | Sophus CRTP 基础、模板元编程、Eigen Map/Block | |
| 125 | +| M02 动力学库 | v8 Ch6(继承多态) | 虚函数表、`override`/`final` | |
| 126 | +| M03 IK | v8 Ch19-20(并发) | `std::thread`/`std::atomic` 用于 TRAC-IK 并行 | |
| 127 | +| M04 碰撞检测 | v8 Ch13(模板特化) | FCL BVH 模板设计 | |
| 128 | +| M05 QP/NLP | v8 Ch17(Ceres) | 最小二乘基础、Jet AD,扩展到约束优化 | |
| 129 | +| M06 AD + codegen | v8 Ch17(Ceres) | Ceres Jet 的 tape-based AD 心智模型 | |
| 130 | +| M11 实时 C++ | v8 Ch19-20、Ch35(pmr) | STL 分配语义、atomic 内存序 | |
| 131 | +| M12 ros2_control | v8 Ch31(ROS2 高级) | Lifecycle Node、Component、QoS | |
| 132 | +| M13 BT.CPP | v8 Ch29(设计模式) | Composite Pattern、Strategy Pattern | |
| 133 | +| M14 MoveIt2 | v8 Ch29、Ch31 | pluginlib(dlopen + 工厂 + 虚函数) | |
| 134 | + |
| 135 | +**v8 前置三层口径**: |
| 136 | +- **最低可启动**:Ch11、Ch14、Ch17、Ch19-20、Ch29、Ch31。可支撑 P01/M01/M03/M05/M11/M13/M14 的入门版和 Quick Start 演示,但不覆盖全部工程细节。 |
| 137 | +- **推荐补齐**:Ch3、Ch6、Ch11、Ch14、Ch17、Ch19-20、Ch29、Ch31、Ch35。适合按 M01-M15 主线学习并进入 M11/M12 实时控制。 |
| 138 | +- **完整前置**:完成 v8 Ch1-Ch46。若未完整完成,至少按附录 C 的章节索引补齐与机械臂直接相关的章节。 |
| 139 | + |
| 140 | +### 0.4 预留接口的明确标注(供后续腿足/无人机/RL 专题复用) |
| 141 | + |
| 142 | +- **✅ 全方向共享**(内容一字不改即可迁移):**Part 0 完整**、M01(Pinocchio)、M02(动力学库)、M05(QP/NLP)、M06(AD+codegen)、M11(实时 C++)、M13(BT.CPP)——**共 8 章** |
| 143 | +- **⚪ 部分共享**(核心知识共用,但应用场景/API 不同):M04(碰撞检测)、M09(GPU/SIMD)、M10(时间参数化)、M12(ros2_control)、M15(Mini-Manip 模板) |
| 144 | +- **❌ 纯机械臂**(不迁移):M03(IK)、M07(OMPL 采样)、M08(轨迹优化规划器)、M14(MoveIt2+MTC) |
| 145 | + |
| 146 | +未来做**腿足专题**时,可直接复制 ✅ 的 8 章,仅在 M12 替换为腿足的 legged_control/OCS2 栈、在 M14 替换为腿足的 TSID/WBC 内容。 |
| 147 | + |
| 148 | +--- |
0 commit comments