跳转至

调研报告二_全景调研

本文档属于 Robotics Tutorial 项目,作者:Pengfei Guo,达妙科技。采用 CC BY 4.0 协议,转载请注明出处。

调研报告二:机械臂 C++ 项目全景调研(第一批)

38 项目 + 8 个 T0 深度剖析

机械臂规控 C++ 项目全景调研(第一批)

调研时间:2026 年 4 月 范围界定:本报告专注于**机械臂**(6/7-DOF 工业臂、协作臂、移动操作臂)的运动规划、轨迹生成、力控、运动学/动力学、抓取规划的 C++ 开源项目。四足/人形**的规控项目留给第二批调研。严格**排除**纯 Python 规控、纯 PyTorch/JAX 的 RL 训练仓库、以及核心逻辑在 Python 侧的项目。 **方法论:对标项目中已有的《无人机运动规划与控制开源C++项目全景调研.md》和《机器人规划与控制领域C++库生态全景调研.md》的深度和风格——每个项目必须有真实 Stars、C++ 标准、许可证、核心算法、具体文件路径、教学评分。 本批次:T0 深度剖析 8 个核心项目 + T1 中度覆盖 30 个分类项目,共 38 个项目


摘要与核心发现

本批次覆盖了机械臂规控生态中最具代表性的 38 个 C++ 项目。核心发现有三:

发现一:机械臂 C++ 生态已形成"三大学派"的鼎立格局。法国 INRIA/LAAS 学派以 Pinocchio 为核心(BSD-2,3k+ stars,C++17/20/23),通过 CRTP 模板元编程+解析导数+CppAD 代码生成实现极致性能,辐射出 TSID、Crocoddyl、Aligator、HPP-FCL/Coal 完整生态;美国 MIT/TRI 学派以 Drake 为核心(BSD-3,3.4k+ stars,C++20/Bazel),通过 System<T> 标量类型参数化实现"一份代码、三种用途"(double 仿真/AutoDiffXd 优化/symbolic 符号推导),配合 Diagram 组合模式构建工业级系统建模框架;美国 SwRI/PickNik 工程派以 MoveIt2 + Tesseract 为核心(BSD-3,Apache-2.0),通过 pluginlib 插件架构服务工业落地。这三大学派的 C++ 工程范式有本质差异,值得对照学习。

发现二:GPU/硬件加速正从"可选项"变为"新基准"。NVIDIA cuRobo(约 1,000+ stars,截至 2026-04;cuRoboV2 本体 Apache-2.0;示例资产、Isaac ROS cuMotion、Isaac Sim/CUDA 运行时需分别审查许可)用 CUDA 在 UR10 上把完整的运动生成(IK+轨迹优化+碰撞检测)压到 100ms 内,比传统 CPU 栈快一个数量级,并已进入 NVIDIA 的 ROS2/Isaac 生态。VAMP(SIMD 碰撞检测加速规划,约 300+ stars,C++20)则代表 CPU SIMD 加速经典规划的路线。这意味着未来 2-3 年机械臂规控工程师必须同时掌握传统 C++ 规控栈和硬件加速栈

发现三:现代机械臂规控项目普遍要求 C++17 及以上,Drake 和 Pinocchio 已迈向 C++20/23,Ruckig 和 BehaviorTree.CPP 要求 C++17,Tesseract 的生产级模块全面使用 std::optional/std::variant这与无人机侧仍大量存在 C++11/14 项目(Fast-Planner、EGO-Planner)形成鲜明对比——原因是机械臂规控更偏"工控级"部署,在云端/工控机上可以奢侈地用 C++20 模板和现代 STL;而无人机侧需要考虑嵌入式 ARM 平台的编译器支持。


第一部分:T0 核心项目深度剖析(8 个)

T0-1. MoveIt2(moveit/moveit2)——ROS2 机械臂规控的事实标准

元信息: - GitHub:https://github.com/moveit/moveit2(注意旧 URL ros-planning/moveit2 已迁移) - Stars:约 1,700(截至 2026 年 4 月) - License:BSD-3-Clause - C++ 标准:C++17(ROS2 Humble 以上要求) - 主要维护者:PickNik Inc(商业化版本为 MoveIt Pro),port to ROS2 由 ROSIN 欧盟项目资助 - 最新活跃度:2026 年 1 月仍在持续更新(当月 69 次 push),非常活跃

项目定位与核心算法

MoveIt2 是 ROS2 生态中**机械臂运动规划的完整解决方案**。它本身不是一个规划算法,而是一个**规划框架**——通过 pluginlib 插件架构把 OMPL、CHOMP、STOMP、Pilz Industrial Motion Planner、(可选)TrajOpt、(可选)cuMotion 等多种规划器统一在同一个 API 下。它处理的是工业落地中最繁琐的那部分问题:URDF/SRDF 解析、规划场景(PlanningScene)管理、碰撞检测对接(FCL/Bullet 可插拔)、运动学求解(KDL/TRAC-IK/IKFast/BioIK 可插拔)、轨迹时间参数化(IPTP/TOTG/Ruckig 可插拔)、控制器执行(ros2_control 对接)。

C++ 工程亮点

  1. pluginlib 运行时插件架构的教科书级应用。在 MoveIt2 里,规划器、运动学求解器、碰撞检测器全都是 pluginlib 插件——每种实现都导出 PLUGINLIB_EXPORT_CLASS(ClassName, BaseClassName) 宏,配置文件(.yaml)中用类名字符串动态加载。这种设计让用户能**不重新编译 MoveIt 核心**就替换任一组件(例如把 KDL IK 换成 TRAC-IK,只需改 kinematics.yaml)。核心加载逻辑在 moveit_ros/planning/planning_pipeline/src/planning_pipeline.cpp

  2. MoveGroupInterface 的 Facade 设计。MoveGroupInterface 类(moveit_ros/planning_interface/move_group_interface/include/moveit/move_group_interface/move_group_interface.h)对上层用户暴露极简 API——setPoseTarget() / plan() / execute(),把底层的服务调用、action client、PlanningScene 同步全部屏蔽。这是 Gamma 设计模式里 Facade 的经典实现。值得关注的是 MoveIt2 还新增了 MoveItCpp 类——一个更快的"进程内"接口,跳过 ROS action/service 开销,适合高频规划场景。

  3. PlanningScene 的 diff-based 同步机制。PlanningScene 对象(moveit_core/planning_scene/)代表了机器人当前感知到的所有物体,但在多节点系统里每个节点维护一份完整拷贝太浪费。MoveIt2 用 moveit_msgs::PlanningScene 的 diff 字段只传输变化部分,PlanningSceneMonitor 在订阅端应用 diff 重建完整场景。这是一种很聪明的状态同步策略,值得学习。

  4. Context-based 的规划请求模型。每个规划请求都是一个 planning_interface::MotionPlanRequest(一个 ROS 消息),内含 start state、goal constraints、path constraints、planner_id 等。Planner 返回 MotionPlanResponse。这种**数据驱动的请求/响应抽象**让整个规划 pipeline 成为可 debug、可序列化、可回放的。

关键文件路径: - moveit_core/planning_scene/include/moveit/planning_scene/planning_scene.h —— 核心 PlanningScene 类 - moveit_core/robot_model/ —— URDF/SRDF 加载成 RobotModel 的逻辑 - moveit_core/robot_state/ —— 机器人瞬时状态(joint positions + 附加碰撞对象) - moveit_ros/planning_interface/move_group_interface/ —— MoveGroupInterface 客户端 - moveit_core/planning_interface/ —— Planner 插件的基类定义

教学价值评分:★★★★★(5/5)

评分理由:(a) 代码规模大但组织非常清晰,模块边界明确——moveit_core / moveit_ros / moveit_planners 分层严格;(b) 是学习 pluginlib 插件架构、Facade 模式、Observer 模式(PlanningSceneMonitor)的最佳素材;(c) C++17 现代用法(std::optionalstd::shared_ptr 大量使用),代码风格统一(.clang-format 严格执行);(d) 生态地位不可替代——在 ROS2 机械臂社区中是事实标准。

与其他项目的对比位置: - vs Tesseract:MoveIt2 是社区驱动、开源为主、适合快速原型;Tesseract 是 SwRI 工业驱动、面向真实工业场景(喷涂/打磨/切割),对"路径约束"和"过程规划"支持更深 - vs cuRobo/CuMotion:MoveIt2 是 CPU 规划栈,cuRobo 是 GPU 加速栈;两者现已通过 Isaac ROS cuMotion 插件融合 - vs Drake:MoveIt2 专注"机械臂规划",Drake 是"机器人系统建模与验证"的更宽范围,两者交集在于 IK 和碰撞检测


T0-2. Pinocchio(stack-of-tasks/pinocchio)——机器人动力学的 CRTP 元编程工业标杆

元信息: - GitHub:https://github.com/stack-of-tasks/pinocchio - Stars:约 3,200+(截至 2026 年 4 月,与 SLAM 调研中的数据一致) - License:BSD-2-Clause - C++ 标准C++17/20/23 同时兼容(全模板设计) - 主要维护者:INRIA Willow team(法国巴黎),起源于 LAAS-CNRS - 活跃度:极其活跃,近期在积极往 C++23 迁移

项目定位与核心算法

Pinocchio 是**现代机器人规控的动力学计算内核**。它实现了 Roy Featherstone《Rigid Body Dynamics Algorithms》(2008)中的全部经典算法——RNEA(逆动力学,微秒级)、ABA(正动力学)、CRBA(广义惯量矩阵)、Cholesky 分解等。但它真正的突破在于**提供了这些算法的解析导数**(不是数值差分也不是自动微分,而是根据刚体动力学的数学结构推导出的**闭式梯度**),这使得基于梯度的优化(MPC、轨迹优化、逆运动学)可以享受解析导数的高精度和高速度。Pinocchio 是 Crocoddyl(DDP 求解器)、TSID(逆动力学控制)、OCS2(腿足 MPC)、Aligator(约束优化)、Stack-of-Tasks(分层控制)的共同动力学后端。

C++ 工程亮点

  1. CRTP(奇异递归模板模式)的大规模工业应用。官方文档明确说 "Pinocchio makes intensive use of the so called CRTP design pattern"。最典型的例子是 JointModelBase<Derived>——每种关节类型(JointModelRevoluteJointModelSphericalJointModelFreeFlyer 等十几种)都是 JointModelBase<JointModelRevolute> 的派生,通过 CRTP 实现**静态多态**,彻底消灭虚函数调用开销。在 7-DOF 机械臂的 RNEA 中,整个计算过程不会触发任何 vtable 查找——所有多态在编译期解决。代码路径:include/pinocchio/multibody/joint/joint-base.hpp

  2. CRTP + Variant 的组合(这是 Pinocchio 独特的设计)。纯 CRTP 的问题是不能把不同 Derived 类型的对象放进同一个容器(因为它们是不同的类型)。Pinocchio 用 boost::variant(或 std::variant)包装不同的 JointModelXxx,既保留了 CRTP 的性能,又允许在同一个 Model 里放不同类型的关节。论文 The Pinocchio C++ library 里有原话:「Thanks to the combination of CRTP and of the variant paradigm, the code flexibility is recovered, while for each algorithm the overall runtime overhead due to class redirection is reduced to the minimum」。

  3. Model-Data 分离模式——函数式编程在 C++ 中的优雅体现。pinocchio::Model 存放机器人的**常量信息**(关节链、惯性参数、URDF 解析后的拓扑),pinocchio::Data 存放**算法运行时的中间缓冲**(齐次变换、雅可比、广义惯量矩阵等)。所有算法都是 algo(const Model& model, Data& data, ...) 的形式——Model 不变,Data 可变。这个设计让多线程使用 Pinocchio 天然安全:每个线程持有自己的 Data,共用一个 const Model。

  4. 标量类型完全模板化。所有类型都带 Scalar 模板参数——SE3Tpl<Scalar, Options>MotionTpl<Scalar>ForceTpl<Scalar>Scalar 可以是 double(数值计算)、CppAD::AD<double>(自动微分)、CppAD::cg::CG<double>(代码生成)、boost::multiprecision(多精度)。这使得 Pinocchio 可以**用同一份代码做数值求值、自动微分求梯度、代码生成编译为优化 C**。OCS2 的"Pinocchio + CppADCodeGen → .so → 实时加载"高性能 MPC 范式就是基于这个能力。

关键文件路径: - include/pinocchio/multibody/joint/joint-base.hpp —— JointModelBase CRTP 基类 - include/pinocchio/multibody/joint/joint-revolute.hpp —— 旋转关节的 CRTP 派生实现 - include/pinocchio/algorithm/rnea.hpp —— 递归牛顿-欧拉逆动力学 - include/pinocchio/algorithm/aba.hpp —— Articulated-Body Algorithm 正动力学 - include/pinocchio/algorithm/kinematics-derivatives.hpp —— 解析运动学导数 - include/pinocchio/spatial/se3-tpl.hpp —— 模板化 SE(3) 群

教学价值评分:★★★★★(5/5)

评分理由:(a) CRTP 工业应用的全球最佳素材——比 Eigen 的 CRTP 更贴近机器人领域学员的直觉;(b) Model-Data 分离模式是"如何让 OOP 代码容易多线程化"的教科书;(c) 模板化标量类型设计是学习现代 C++ 泛型编程的高阶案例;(d) 性能数据亮眼——7-DOF 机械臂 RNEA 约 1 微秒,双足机器人约 3 微秒。

与其他项目的对比位置: - vs RBDL:RBDL 用经典 C++03 风格,代码简单但性能弱一倍以上;Pinocchio 是现代 C++ 模板范式,性能和功能都强 - vs Drake MultibodyPlant:Drake 的 MultibodyPlant 同样模板化标量类型,但 API 更"系统化"(集成到 Diagram 框架);Pinocchio 更像独立的"动力学算法库" - vs MuJoCo XML model:MuJoCo 是仿真器不是动力学库,且内部用 C 而非 C++ 模板,接近软件黑盒


T0-3. Drake(RobotLocomotion/drake)——标量参数化 System 的最高级范式

元信息: - GitHub:https://github.com/RobotLocomotion/drake - Stars:约 3,400+(截至 2026 年 4 月) - License:BSD-3-Clause - C++ 标准C++20(最新要求),构建系统是 Bazel(不是 CMake!) - 主要维护者:Toyota Research Institute(TRI)+ MIT RobotLocomotion 组(Russ Tedrake 创始) - 活跃度:极其活跃,周级别持续迭代

项目定位与核心算法

Drake 是一个**机器人系统建模、仿真、最优控制、验证**的全栈 C++ 框架。它的野心远超"规控库"——而是要做机器人领域的 Simulink 替代品,用纯 C++ 实现一切。核心组件:MultibodyPlant(刚体动力学,对标 Pinocchio 但集成度更高)、MathematicalProgram(统一的优化问题建模接口,支持 LP/QP/NLP/SDP/MIP)、Systems framework(类似 Simulink 的 block diagram)、HydroelasticContact(连续接触力模型,仿真精度远超 MuJoCo 默认的惩罚法)、MeshCat(web 可视化)。MIT 的 6.800 Underactuated Robotics 和 6.4210 Manipulation 课程全面基于 Drake 教学。

C++ 工程亮点

  1. System<T> 标量类型参数化范式——全球最高级的 C++ 模板设计之一。Drake 里几乎每个系统类都是 template <typename T>,T 可以是三种类型:
  2. T = double:用于数值仿真,快速
  3. T = AutoDiffXd:Eigen 的 AutoDiff 标量,用于优化求梯度(梯度自动传播)
  4. T = symbolic::Expression:符号表达式,用于系统分析和代码生成

这意味着**一个 MultibodyPlant 可以在运行时做仿真、在优化时做自动微分、在建模时做符号推导——三种用途共享同一份代码**。这在项目中随处可见的 @tparam_default_scalar Doxygen 标签里有明确标注,看 systems/primitives/linear_system.hclass LinearSystem : public AffineSystem<T> 就能感受这种设计。

  1. Diagram 组合模式 + Context 依赖追踪缓存系统。Drake 的 DiagramSystem 的容器——你可以把多个 System 用 DiagramBuilder 连接(输出端口到输入端口),组合成更大的 System。运行时,Context 对象持有整个 Diagram 的完整状态,每个计算结果都带**依赖指纹**,只要依赖没变就从缓存读取。这种设计让 Drake 的仿真既灵活(可以任意组合子系统)又高效(避免重复计算)。

  2. 严格的 No Copy / No Move / No Assign 政策。Drake 几乎所有 System 类都在类定义顶部写 DRAKE_NO_COPY_NO_MOVE_NO_ASSIGN(ClassName)——这是一个宏,删除拷贝构造、移动构造、赋值运算符。背后的哲学是:System 应该通过 unique_ptr 唯一拥有,避免生命周期混乱。对于学员这是学习现代 C++"值语义 vs 引用语义"设计决策的好例子。

  3. Bazel 构建系统(而非 CMake)。Drake 是罕见的大型开源 C++ 项目使用 Bazel 构建。Bazel 的优势:细粒度的编译目标(cc_librarycc_test)、跨项目分布式缓存、严格的 header-only vs 实现分离。缺点是学习曲线陡峭。对于学员这是一个"逃离 CMake"的参考实现。

关键文件路径: - systems/framework/system.h —— 核心 System 基类 - systems/framework/diagram.h —— Diagram 组合容器 - systems/framework/context.h —— 状态容器 - multibody/plant/multibody_plant.h —— 多体动力学(对应 Pinocchio 的 Model/Data) - common/autodiffxd.h —— AutoDiffXd 标量类型 - common/symbolic/expression.h —— 符号表达式标量 - solvers/mathematical_program.h —— 统一优化问题抽象

教学价值评分:★★★★★(5/5)

评分理由:(a) 标量类型参数化是整个 C++ 模板元编程的天花板级设计,值得精读;(b) Diagram + Context + 依赖缓存是"大型仿真框架怎么设计"的教科书;(c) MathematicalProgram 提供了"数学优化问题的 C++ 建模"的典范——是你做 MPC/轨迹优化时可以直接学的设计模式;(d) 缺点是 Bazel 构建增加了学习成本,代码库巨大(百万行级别),全盘精读不现实,适合"按需深入"。

与其他项目的对比位置: - vs Pinocchio:Pinocchio 专注"动力学算法",Drake 专注"系统建模+优化+仿真"全栈;两者实际上可以共用(Drake 的 MultibodyPlant 和 Pinocchio 的 Model 可互通) - vs MuJoCo:MuJoCo 是纯仿真器(C语言内核+Python绑定),Drake 是建模+优化+仿真三合一(C++20) - vs Simulink:Drake 的 Diagram 直接对标 Simulink 的 block diagram,但开源免费且纯 C++


T0-4. Ruckig(pantor/ruckig)——在线 Jerk-limited 轨迹生成的现代代表

元信息: - GitHub:https://github.com/pantor/ruckig - Stars:约 1,100+(截至 2026 年 4 月) - License:MIT(Community Version);有商用 Pro Version - C++ 标准C++17(最新 main 分支要求 C++20;另有 C++11/C++03 分支) - 主要维护者:Lars Berscheid(KIT 创始,现 Fuzzy Logic Robotics 赞助) - 活跃度:非常活跃

项目定位与核心算法

Ruckig 是**在线轨迹生成(Online Trajectory Generation, OTG)的现代开源标杆。它解决的问题很具体:给定机械臂当前位置、速度、加速度,给定目标位置、速度、加速度,以及速度/加速度/加加速度(jerk)限制,**在 1ms 内计算出一条平滑的轨迹。这是实时控制场景(visual servoing、人机协作碰撞避让、实时避障)不可或缺的底层能力。论文 "Jerk-limited Real-time Trajectory Generation with Arbitrary Target States"(RSS 2021)详述了算法。MoveIt2 已集成 Ruckig 作为时间参数化插件。

C++ 工程亮点

  1. 编译期/运行时 DOF 的双模态模板设计。Ruckig 的核心类是 Ruckig<DOFs>——如果 DOFs 是编译期常量(例如 Ruckig<7> 用于 Panda 7 轴),所有内部数组使用 std::array<double, 7>栈分配零堆分配,性能极致;如果用户需要运行时决定 DOF,就用 Ruckig<DynamicDOFs>(即 Ruckig<0>),内部改用 std::vector。这是 Eigen 固定大小 vs 动态大小 设计思想的机器人场景再应用。

  2. Header-only 友好 + 无外部依赖。核心库不依赖 Eigen、不依赖 Boost、不依赖 ROS。对于嵌入式场景(FPGA 硬核、PLC、RTOS)极其友好——struckig 项目把整个 Ruckig 移植到 IEC 61131-3 Structured Text(工业 PLC 语言)来运行在 TwinCAT 3 上,这种跨语言移植是 Ruckig 设计纯净性的直接证明。

  3. 极严苛的数值稳定性测试套件。Ruckig 的测试覆盖**50 亿**条随机轨迹——位置和速度精度 1e-8,加速度精度 1e-10,速度/加速度/jerk 上限违反精度 1e-12。这种工业级的数值质量保证在开源项目中非常罕见,值得学习"如何为数值算法库做回归测试"。

  4. Reflexxes Type IV 的开源替代 + 性能更好。商业上流行的 Reflexxes Type IV(已被 Kuka 收购闭源)使用决策树选择轨迹类型——超过 4760 个决策节点,代码极其复杂。Ruckig 反其道而行之:先计算所有可能的极值曲线(extremal profiles),然后根据时间约束选择匹配的。代码简洁,性能快一倍以上,控制周期可低至 250 微秒。这是一个"算法创新驱动软件简化"的绝佳案例。

关键文件路径: - include/ruckig/ruckig.hpp —— 主类 Ruckig<DOFs> 模板 - include/ruckig/input_parameter.hpp —— 输入状态(pos/vel/acc + 限制) - include/ruckig/output_parameter.hpp —— 输出轨迹 - src/ruckig.cpp —— 核心 update() 函数 - examples/10_eigen_library.cpp —— 与 Eigen 集成的示例

教学价值评分:★★★★★(5/5)

评分理由:(a) "编译期常量 DOF vs 运行时 DOF" 的模板设计是学习 Eigen 风格泛型的绝佳微型案例;(b) 无依赖的 header-only 设计哲学对学员的架构品味有养成作用;(c) 代码规模适中(核心算法约 2000 行),可以在一周内精读完;(d) 算法本身(Jerk-limited OTG)是每个机械臂工程师必备的基础能力。

与其他项目的对比位置: - vs Reflexxes Type IV:商业闭源 vs 开源 MIT;决策树算法 vs 极值曲线算法;后者代码量小一个数量级 - vs TOPP-RA:TOPP-RA 是"给定几何路径做时间最优参数化"(需要有完整路径),Ruckig 是"当前状态→目标状态的直接生成"(更通用) - vs MoveIt IPTP/TOTG:IPTP/TOTG 是离线时间参数化,Ruckig 是实时在线生成——MoveIt2 里两类算法都作为插件存在


T0-5. Tesseract + TrajOpt(tesseract-robotics/tesseract, /trajopt)—— 工业级轨迹优化生态

元信息(两个项目一起剖析): - tesseract:https://github.com/tesseract-robotics/tesseract - Stars:约 340+ - License:Apache-2.0 - trajopt:https://github.com/tesseract-robotics/trajopt - Stars:约 480+ - License:Apache-2.0 - tesseract_planning:约 70+ stars,包含 motion_planners 和 task_composer - C++ 标准:C++17 - 主要维护者:Southwest Research Institute(SwRI,ROS-Industrial 的发起方),核心开发者 Levi-Armstrong、Tyler Marr - 活跃度:非常活跃,2026 年 2 月仍在月级别更新

项目定位与核心算法

Tesseract 是 ROS-Industrial 发起的**工业场景机械臂规控平台**,面向喷涂、打磨、切割、焊接等真实工业流程——这些场景的共同特点是**"带路径约束的多段轨迹"**(例如沿汽车座椅表面走一条完整的打磨路径,中间可能有多个姿态约束点)。它刻意独立于 MoveIt,以 Apache-2.0 许可(比 MoveIt 的 BSD-3 更适合某些企业合规要求)。

TrajOpt 是 Tesseract 生态的核心规划器之一——Sequential Convex Optimization(SQP)+ 对连续碰撞检测(Continuous Collision Detection)的一阶处理,由 Berkeley 的 John Schulman 等人 2014 年提出(论文 "Motion planning with sequential convex optimization and convex collision checking"),Tesseract 团队将其重构为生产级代码。核心思想:把非凸规划问题(避碰 + 路径约束)在当前轨迹附近**线性化**为二次规划,迭代求解到收敛。底层可切换 OSQP / qpOASES / BPMPD / Gurobi / OSQP-Eigen 等 QP 求解器。

C++ 工程亮点

  1. Command Language 设计——机器人版的"中间表示 IR"。Tesseract 定义了 tesseract_command_language 包,用一套数据结构(MoveInstructionStateWaypointCartesianWaypointJointWaypointCompositeInstruction)描述"要机器人做什么"——本质上是工业机器人示教器程序的 C++ 对象化。这层抽象让**同一段任务描述可以被 TrajOpt/OMPL/Descartes 不同规划器处理**,也可以作为交换格式跨进程/跨平台传输。这是学习"如何为领域设计中间表示"的优秀案例。

  2. Task Composer——任务流水线的 DAG 描述tesseract_task_composer 模块构建在 Taskflow 库(Taskflow 是一个高性能 C++ 并行任务 DAG 库)之上,允许用户把"规划一段喷涂任务"分解为 "simplify → fix_state_bounds → time_parameterization_ompl → check_input → motion_planning → iterative_spline → check_output" 等阶段,这些阶段形成 DAG,自动并行执行可以并行的部分。YAML 配置驱动,运行时可重组。

  3. Plugin-based 的碰撞检测与运动学求解。每个机器人的 IK 求解器(OPW、UR、KDL、曲线加工专用)可以通过 pluginlib 替换;碰撞检测器(Bullet、FCL、Coal)同样可替换。专门成立了 tesseract_collision_coaltesseract_collision_benchmarks 子项目做基准测试。

  4. Serialization via Boost.Serialization + tesseract_common::Serialization friend trick。Tesseract 的核心数据结构都能序列化到 XML/binary。friend struct tesseract_common::Serialization 的写法把序列化接口从类的 public API 里隔离出去——这是学习"侵入式 vs 非侵入式序列化权衡"的好例子。

关键文件路径: - tesseract_common/ —— 通用数据结构、序列化、跨模块工具 - tesseract_command_language/include/ —— 命令语言 IR 定义 - tesseract_motion_planners/trajopt/ —— TrajOpt 规划器封装 - tesseract_motion_planners/ompl/ —— OMPL 规划器封装 - tesseract_motion_planners/descartes/ —— Descartes 笛卡尔规划器 - tesseract_task_composer/ —— Taskflow 任务流水线 - trajopt/trajopt/src/problem_description.cpp —— TrajOpt 问题构造核心,OptimizeProblem() 函数展示 SQP 主循环 - trajopt/trajopt_sqp/trajopt/trajopt_sco/ —— 自研 SQP 和 SCO(Sequential Convex Optimization)求解器

教学价值评分:★★★★★(5/5)

评分理由:(a) 工业应用级别最高的 C++ 机械臂规控项目,适合"看真实企业级代码长什么样";(b) Command Language 的 IR 设计是 domain modeling 的典范;(c) Task Composer 是学习 DAG 任务调度的好案例;(d) TrajOpt 本身是学习 SQP 求解器架构的核心素材——sco::BasicTrustRegionSQP 类的 trust-region 策略实现非常清晰。

与其他项目的对比位置: - vs MoveIt2:Tesseract 更工业化(Apache-2.0、独立于 ROS、强调过程规划);MoveIt2 更学术/通用(BSD、深度 ROS 集成、通用机械臂规划)。两者有重叠(都支持 OMPL、都有插件架构)也有差异(Tesseract 有 Task Composer、Command Language;MoveIt2 有 MoveIt Task Constructor) - vs Drake TrajectoryOptimization:Drake 的轨迹优化基于 MathematicalProgram,更学术;TrajOpt 更工程化,QP 求解器可插拔


T0-6. BehaviorTree.CPP(BehaviorTree/BehaviorTree.CPP)—— 任务级编排的主导框架

元信息: - GitHub:https://github.com/BehaviorTree/BehaviorTree.CPP - Stars:约 3,700+(截至 2026 年 4 月) - License:MIT - C++ 标准C++17(v4+) - 主要维护者:Davide Faconti(Auryn Robotics),起源于 Eurecat + IIT 合作的 MOOD2Be 项目 - 活跃度:非常活跃,最新版本 4.9

项目定位与核心算法

BehaviorTree.CPP 是**机器人任务级编排(task-level orchestration)**的事实标准 C++ 库。它解决的问题是:当机械臂要完成一个复杂任务("去抓取桌上的红色物体,放到蓝色盒子里"),如何把"感知 → 规划 → 移动 → 抓取 → 放置 → 错误处理"这些步骤以**可维护、可调试、可可视化**的方式组织起来?传统方案是有限状态机(FSM),问题是状态数指数爆炸且不易修改。Behavior Tree 用**树状结构 + 异步 tick 机制**提供了更模块化的替代。

Nav2 把 BT 作为整个导航系统的顶层编排(replanning、recovery behaviors);MoveIt2 Pro 同样把 BT 作为任务级 API。在 ROS2 社区 BT.CPP 已经达到 Nav2 级别的"事实标准"地位

C++ 工程亮点

  1. 异步 Action 作为一等公民的 tick 语义。传统 FSM 的问题:状态切换是同步的、不能自然处理"持续运行的动作"(例如机械臂移动中)。BT.CPP 的 TreeNode::tick() 返回三态:SUCCESS / FAILURE / RUNNING——RUNNING 意味着"本动作还在执行,下一帧再来问我"。在 BT.CPP v4 的公开 API 中,业务循环通常调用 Tree::tickOnce()Tree::tickWhileRunning(),以 10Hz / 50Hz 频率推进整棵树;每次 tick 中条件会被重新评估,这让"反应性"(reactivity,环境变化立即响应)成为自然结果。理解这一点是理解 BT 的核心。

  2. XML DSL + 插件加载的"行为与实现分离"。BT 的**拓扑结构**(哪个节点是 Sequence、哪个是 Fallback、children 顺序)在 XML 里描述,可以在运行时加载修改;节点实现(具体的 C++ 代码)编译为插件。这种设计让**行为设计师(Behavior Designer)和组件开发者(Component Developer)可以分离工作**——这是来自 MOOD2Be 项目的 Model-Driven Development 思想。编辑 XML 就是用 Groot2 GUI 工具拖拽节点。

  3. Blackboard + Port 的类型安全数据流。BT 节点之间不是通过"方法调用"传数据,而是通过 Blackboard(共享键值存储)的 Port 机制——节点声明 InputPort<Pose>("target_pose")OutputPort<Trajectory>("planned_traj"),BT.CPP 用 std::any + 类型萃取在运行时做类型检查。最新版本加入 Stamped API——每个 Blackboard entry 带时间戳和序列号,节点可以用 getInputStamped() 检查"数据比上次新吗"——直接支持**reactive programming** 模式。

  4. 内置 logging + replay 基础设施。BT.CPP 自带 FileLoggerSqliteLoggerMinitraceLoggerStdCoutLogger——每次 tick 的状态转换都被记录。Groot2 GUI 可以回放执行历史,调试 "为什么在第 37 秒那个节点失败了"。这种"从一开始就把可观测性内建到框架里"的思想值得学习。

关键文件路径: - include/behaviortree_cpp/tree_node.h —— TreeNode 基类及 tick() 语义 - include/behaviortree_cpp/bt_factory.h —— BehaviorTreeFactory 负责注册节点类型、加载 XML - include/behaviortree_cpp/blackboard.h —— Blackboard 数据存储 - include/behaviortree_cpp/basic_types.h —— Port 定义和类型转换 - include/behaviortree_cpp/controls/ —— Sequence、Fallback、Parallel 等控制节点 - examples/t17_blackboard_backup.cpp —— Blackboard 快照/恢复示例 - examples/t19_global_blackboard.cpp —— Global Blackboard 跨树共享

教学价值评分:★★★★★(5/5)

评分理由:(a) 代码规模适中(核心库约 1.5 万行),一周可精读主干;(b) 是学习"Ticking 异步执行模型"这种异于 FSM 的独特编程范式的最佳入口;(c) std::any + 类型萃取的运行时类型安全数据流设计非常有参考价值;(d) 应用极其广泛(Nav2、MoveIt Pro、众多商业机器人产品),学完就能立即用到。

与其他项目的对比位置: - vs ROS Action/Service:BT 是任务**编排**层,ROS Action 是通信层——两者是正交的(BT 节点内部可以调 ROS Action) - vs SMACH / FlexBE(Python 生态的状态机/BT):SMACH 是纯 Python、Python 2 时代遗留;BT.CPP 是现代 C++,性能和可维护性都更好 - vs 自行实现 FSM:BT 的可组合性、反应性、调试能力都远超手写 FSM——这是工业界大量转向 BT 的原因


T0-7. cuRobo(NVlabs/curobo)—— NVIDIA GPU 加速机械臂规划

元信息: - GitHub:https://github.com/NVlabs/curobo - Stars:约 1,000+(截至 2026 年 4 月,增长极快) - License:cuRoboV2 本体 Apache-2.0;仓库示例机器人资产、Isaac ROS cuMotion、Isaac Sim/CUDA 运行时和下游部署包需要分别审查许可 - C++ 标准:C++17 + CUDA C++(核心 kernels 用 CUDA 写) - 主要维护者:NVIDIA Seattle Robotics Lab(Balakumar Sundaralingam 主导) - 活跃度:极其活跃

项目定位与核心算法

cuRobo 是**首个把完整机械臂运动生成(full motion generation:IK + 几何规划 + 轨迹优化 + 碰撞检测 + 后处理)全部迁移到 GPU** 的开源项目。它挑战的是一个数十年的假设:"运动规划是串行问题,不适合 GPU"。cuRobo 的反驳思路是:同时启动几百个并行种子(parallel seeds)做优化,GPU 的并行能力刚好用来解"多起点优化"这种大规模并行搜索。结果是:在 UR10 上 30ms 完成完整运动生成,在 NVIDIA Jetson AGX Orin 上 100ms(中位数)——比 CPU 栈快一个数量级。

cuRobo 的算法栈:(1) GPU 正/逆运动学(CudaRobotModel);(2) GPU 碰撞检测(支持 Cuboids、Meshes、Depth images,与 nvblox 的体素化世界对接);(3) GPU 数值优化(L-BFGS、MPPI、梯度下降的并行实现);(4) 几何规划(GPU 加速的图搜索用于极端情况);(5) 轨迹优化(并行多种子 + jerk/acceleration penalty);(6) 运动生成(上述组件的组合调度)。

C++ 工程亮点

  1. CUDA C++ + PyTorch 混合架构。cuRobo 的底层是 CUDA C++ kernels(编译为 .so),上层通过 pybind11 暴露到 Python,Python 层用 PyTorch 张量做数据容器、CUDA Graph 做执行优化。核心性能代码在 C++/CUDA 侧,用户面对的 Python API 只是薄封装。这是学习"如何设计 C++/Python 混合库"的高级案例。

  2. Warp kernel 代码生成(基于机器人 DoF)。cuRobo 的一些 kernel 是"半编译期生成"——运行时根据机器人 DoF 数量决定 kernel 的具体形态,然后用 NVIDIA Warp 把 Python DSL 转为 CUDA 代码并即时编译。这是 CUROBO_USE_LRU_CACHE=1 环境变量存在的原因——缓存已编译的 kernel。这种 JIT 思想是 Pinocchio 的 CppADCodeGen 在 GPU 侧的对应物。

  3. CUDA Graph 优化以消除 kernel 启动开销。反复求同一类优化问题时,cuRobo 使用 CUDA Graph 把一系列 kernel 启动打包为一个"图",整体提交执行,节省 kernel launch 的几十微秒开销——这对实时 MPC 至关重要。use_cuda_graph=TrueMotionGenConfig 的默认设置。

  4. Self-collision kernel 的稀疏性优化。机器人自碰撞检测需要检查每一对 link 之间的距离,N 个 link 有 O(N²) 对,但很多对(相邻 link)不需要检查。cuRobo 的 self-collision kernel 针对"稀疏检查对 > 512×1024"的情况做了特殊处理。这类针对**稀疏性** + GPU 线程块 + **原子操作**的性能优化代码是学习 CUDA 优化的进阶素材。

关键文件路径(C++/CUDA 核心): - src/curobo/curobolib/cpp/ —— C++/CUDA 核心实现 - src/curobo/curobolib/cpp/kinematics_fused_kernel.cu —— 正运动学融合 kernel - src/curobo/curobolib/cpp/self_collision_kernel.cu —— 自碰撞 kernel - src/curobo/curobolib/cpp/sphere_obb_kernel.cu —— 球-长方体碰撞 kernel - src/curobo/curobolib/cpp/tensor_step_kernel.cu —— 轨迹数值积分 kernel - src/curobo/curobolib/cpp/pose_distance_kernel.cu —— 位姿距离 kernel(用于 IK cost)

教学价值评分:★★★★☆(4.5/5)——扣分点不再是 cuRobo 本体许可,而是 GPU/CUDA 绑定、示例资产和下游集成包的依赖链审查成本

评分理由:(a) 是 2024-2026 年机械臂规控领域最重要的技术突破之一,代表未来方向;(b) CUDA C++ + PyTorch 混合架构是学习 "C++ 侧性能 + Python 侧灵活" 混合库的绝佳案例;(c) Warp kernel 代码生成和 CUDA Graph 是 GPU 性能工程的高阶话题;(d) 工程落地时仍要做 SBOM:cuRobo 本体、示例资产、机器人模型、CUDA/Isaac 运行时和 ROS2 集成包不能混为一个许可证判断。

与其他项目的对比位置: - vs MoveIt2 CPU 栈:cuRobo 比 MoveIt 默认的 OMPL+CHOMP+KDL 栈快一个数量级,但牺牲了灵活性(cuRobo 锁定 NVIDIA GPU) - vs VAMP(SIMD 加速的 CPU 规划):VAMP 是 CPU 向量化路线,cuRobo 是 GPU 路线;两者本体均属于开源项目,但许可证、NVIDIA 运行时依赖、模型资产与商用部署条款需要按目标版本分别审查 - vs Isaac ROS cuMotion:cuRobo 是 Python 库,cuMotion 是其 MoveIt2 插件商业化形态


T0-8. libfranka(frankaemika/libfranka)—— 工业机械臂实时驱动的典范

元信息: - GitHub:https://github.com/frankaemika/libfranka(注意 2024+ 新仓库为 frankarobotics/libfranka) - Stars:约 250+(纯驱动库,用户群小但影响巨大) - License:Apache-2.0 - C++ 标准:C++17 - 主要维护者:Franka Robotics(前身 Franka Emika) - 活跃度:2026 年仍在持续更新,最新版 0.14.2+

项目定位与核心算法

libfranka 是 Franka Emika Panda / Franka Research 3(FR3)机器人的**底层 C++ 客户端库**。虽然它"只是一个驱动",但在教学上非常重要——它是**工业机械臂实时通信**的教科书级实现:1kHz 控制循环、UDP 网络通信、PREEMPT_RT 实时内核要求、严格的 packet-loss 监控、反射式急停(reflex)机制。Franka Panda 是全球学术和工业研究最常用的协作机械臂之一,几乎所有机械臂论文实验都用它——libfranka 是触达真实硬件的唯一通道。

C++ 工程亮点

  1. Callback-style 的实时控制循环接口。libfranka 的典型用法是:

    franka::Robot robot("192.168.1.100");
    robot.control([](const franka::RobotState& state, franka::Duration dt) -> franka::JointVelocities {
        // 用户 1kHz 实时回调:输入当前状态,返回下周期指令
        return franka::JointVelocities{...};
    });
    
    这种 Callback 设计强迫用户把控制律写成"纯函数风格"(state_t → command_t),天然适合实时性——回调内不能做动态分配、不能加锁。如果用户在回调内返回 NaN,libfranka 会抛 std::invalid_argument;如果回调超时,会抛 ControlException

  2. Motion Generator + Controller 的正交分解。libfranka 把"运动生成"("我要让关节到达这些位置")和"控制"("输出什么扭矩让关节到达位置")分成两个正交维度——用户可以只提供 Motion(用内部控制器)、只提供 Controller(用外部 Motion),或两者都提供。代码里有 MotionGeneratorJointPositionsJointVelocitiesCartesianPoseCartesianVelocitiesTorques 等类型分别表示不同的接口。这是**策略模式 + 类型系统**的优雅组合。

  3. Active Control 的现代 API(v0.10+)。新版本引入 ActiveTorqueControlActiveMotionGenerator<JointPositions> 等——这是 "read-write-interface" 风格,允许用户在自己的主循环里显式调用 readOnce() + writeOnce(),而不必把控制律写进 Callback。这种 "callback vs loop" 两套 API 的并存是学习"如何在保持向后兼容的前提下引入新的抽象"的案例。

  4. v0.14+ 开始集成 Pinocchio 计算动力学参数。最新版 libfranka 用 Pinocchio 作为后端计算 M/C/G(质量矩阵、科氏力、重力项)——这是学派融合的典型现象(Franka 起源德国,Pinocchio 起源法国)。

关键文件路径: - include/franka/robot.h —— Robot 类主接口 - include/franka/control_types.h —— JointPositions / CartesianPose / Torques 等控制类型 - include/franka/motion_generator_traits.h —— Motion Generator 类型萃取 - include/franka/model.h —— 动力学模型访问 - src/robot.cpp —— control() 主循环实现 - src/network.cpp —— UDP 实时通信层 - examples/ —— 10+ 个经典控制示例(笛卡尔阻抗、Joint 阻抗、力控等)

教学价值评分:★★★★☆(4/5)

评分理由:(a) 代码量适中(约 1 万行),可深入精读;(b) 是学习"工业机械臂 1kHz 实时通信怎么做"的标准素材,几乎没有替代品;(c) Motion + Controller 正交分解的 API 设计值得学习;(d) 扣分点:专用驱动(只能驱动 Franka 机器人),通用性不如 ros2_control。

与其他项目的对比位置: - vs ur_robot_driver:ur_robot_driver 是 UR 机器人的 ROS2 驱动,走 ros2_control 的标准接口;libfranka 是纯 C++ 库,可以独立于 ROS 使用 - vs ros2_control:ros2_control 是**抽象层**(标准化的 hardware interface),libfranka 是**具体驱动**——两者通过 franka_hardware 对接 - vs Franka Matlab/Simulink:Franka Matlab 是付费商业产品;libfranka 是免费开源的纯 C++ 版


第二部分:T1 分领域项目清单(30 个)

A. 机器人动力学库(4 个)

A-1. RBDL(rbdl/rbdl)

  • URL:https://github.com/rbdl/rbdl
  • Stars:约 770+;License:zlib;C++ 标准:C++11
  • 定位:经典 C++ 动力学库,直接实现 Featherstone 书中的 Spatial Vector Algebra
  • C++ 亮点Math::SpatialVectorMath::SpatialTransform 等 6D 空间向量的显式 C++ 类,没有 Pinocchio 那样的模板元编程,因此**代码可读性远高于 Pinocchio**——新手入门空间向量代数的首选
  • 教学评分:★★★★☆(4/5)
  • 典型使用:ICub 的 bipedal_locomotion_framework、一些早期腿足研究代码

A-2. DART(dartsim/dart)

  • URL:https://github.com/dartsim/dart
  • Stars:约 820+;License:BSD-2;C++ 标准:C++17
  • 定位:CMU + GT 维护的多体动力学+物理仿真库,被 Gazebo 作为默认物理引擎
  • C++ 亮点dart::dynamics::Skeleton 提供了与 URDF 完全对应的骨骼模型;提供 LCP 接触求解器(Lemke/Dantzig);支持通过 BodyNode::getWorldJacobian() 获取 6D 雅可比
  • 教学评分:★★★★☆(4/5)
  • 典型使用:Gazebo Sim 的默认物理后端、部分学术仿真项目

A-3. iDynTree(robotology/idyntree)

  • URL:https://github.com/robotology/idyntree
  • Stars:约 170+;License:BSD-3;C++ 标准:C++17
  • 定位:IIT(Istituto Italiano di Tecnologia)为 iCub 人形机器人开发的动力学库
  • C++ 亮点:提供 URDF 反向求解(从运动数据估计惯性参数);iDynTree::KinDynComputations 是类似 pinocchio::Model+Data 的合并对象;Python/Matlab 绑定做得很好
  • 教学评分:★★★☆☆(3/5)
  • 典型使用:iCub 相关论文代码、ICub 的 bipedal_locomotion_framework

A-4. KDL / orocos_kinematics_dynamics(orocos/orocos_kinematics_dynamics)

  • URL:https://github.com/orocos/orocos_kinematics_dynamics
  • Stars:约 700+;License:LGPL-2.1;C++ 标准:C++11
  • 定位:最古老、使用最广的 C++ 运动学/动力学库,KDL 即 Kinematics and Dynamics Library
  • C++ 亮点KDL::ChainKDL::ChainFkSolverPos_recursiveKDL::ChainIkSolverPos_NR 等经典 API;MoveIt2 默认 IK 后端;TRAC-IK 的底层依赖
  • 教学评分:★★★☆☆(3/5,代码风格老旧但应用极广)
  • 典型使用:MoveIt2 默认 IK、大量教学示例

B. 逆运动学求解器(5 个)

B-1. TRAC-IK(traclabs/trac_ik)

  • URL:https://bitbucket.org/traclabs/trac_ik(主仓库在 Bitbucket,GitHub mirror 多家);ROS2 版本 https://github.com/aprotyas/trac_ik
  • Stars:各 mirror 总计约 400+;License:BSD-3;C++ 标准:C++11/14
  • 定位:并行 SQP + KDL Newton-Raphson 双策略 IK 求解器
  • C++ 亮点TRAC_IK::TRAC_IK 在两个线程里同时跑 NR-IK(速度快)和 SQP-IK(鲁棒性好),谁先找到解谁赢——std::thread + std::atomic_bool + 原子 stop flag 的实时并行搜索经典案例
  • 教学评分:★★★★☆(4/5)
  • 典型使用:MoveIt2 默认 IK 的最佳替代品,7-DOF 机械臂首选

B-2. BioIK / bio_ik(PickNikRobotics/bio_ik)

  • URL:https://github.com/PickNikRobotics/bio_ik
  • Stars:约 150+;License:BSD-3;C++ 标准:C++14
  • 定位:基于记忆进化算法(memetic evolutionary algorithm)的 IK 求解器,支持多目标(避障、可达性、次优姿态)
  • C++ 亮点:MoveIt Kinematics Plugin 形式提供,支持 自定义 cost function——你可以定义"距离障碍越远越好"的目标项,IK 求解会同时满足末端位姿 + 这个目标
  • 教学评分:★★★★☆(4/5)
  • 典型使用:复杂约束 IK(例如 7-DOF 机械臂在狭窄空间操作)、人形上半身 IK

B-3. IKFast(rdiankov/openrave 中的组件)

  • URL:https://github.com/rdiankov/openrave
  • Stars:约 760+;License:LGPL-3;C++ 标准:C++11
  • 定位符号解析 IK 生成器——给定 URDF 运行一次 Python 脚本,生成一个针对特定机器人的 C++ IK 求解函数(通常是几百行的代数表达式)
  • C++ 亮点:生成的 IK 代码是**纯 C++、无依赖、亚毫秒级**;数学上求解封闭解(closed-form solution),不迭代;支持解的多分支枚举(例如 6-DOF 标准球腕机器人通常 8 组解)
  • 教学评分:★★★★★(5/5,理论价值极高)
  • 典型使用:UR、ABB、KUKA 等标准工业臂;生成的代码可嵌入任何项目

B-4. ik_geo(Verdant-Robotics/ik_geo)

  • URL:https://github.com/Verdant-Robotics/ik_geo
  • Stars:约 230+;License:Apache-2.0;C++ 标准:C++17
  • 定位:基于 Elias + Wen 2022 论文 "Canonical Subproblems for Robot Inverse Kinematics" 的**几何 IK** 库,比 IKFast 更通用
  • C++ 亮点:把任意 6-DOF 机器人 IK 分解为 6 种"规范子问题"(canonical subproblems)的组合,每种子问题有闭式解——比 IKFast 的代码量小一个数量级(~数百行 vs IKFast 生成的数千行)
  • 教学评分:★★★★☆(4/5)
  • 典型使用:现代工业机械臂 IK 的新选择

B-5. pick-ik(PickNikRobotics/pick_ik)

  • URL:https://github.com/PickNikRobotics/pick_ik
  • Stars:约 80+;License:BSD-3;C++ 标准:C++17
  • 定位:BioIK 的"现代 C++17 精炼版",专门为 MoveIt2 设计
  • C++ 亮点:彻底重写了 BioIK 的进化算法内核,使用 std::span / std::optional / std::variant 等 C++17 特性;代码比 BioIK 整洁 2-3 倍
  • 教学评分:★★★★☆(4/5)
  • 典型使用:MoveIt2 新项目的 IK 首选

C. 运动规划器(5 个)

C-1. OMPL(ompl/ompl)

  • URL:https://github.com/ompl/ompl
  • Stars:约 1,200+;License:BSD-3;C++ 标准:C++14
  • 定位:运动规划的事实标准库,RRT*/PRM*/BIT*/AIT*/KPIECE 等数十种算法的统一实现
  • C++ 亮点StateSpaceSpaceInformationPlanner 三大基类的**虚函数+纯虚接口**设计;Boost.Program_options 驱动的基准测试基础设施;整个库对新算法的**可扩展性**是 OO 设计的范例
  • 教学评分:★★★★★(5/5)
  • 典型使用:MoveIt2 / Tesseract / OpenRAVE 的规划器后端

C-2. STOMP(MoveIt stomp_moveit 插件)

  • URL:https://github.com/moveit/moveit2 中的 moveit_planners_stomp;独立研究版 https://github.com/ros-industrial/stomp
  • Stars:集成在 MoveIt2,无独立计数;License:BSD-3
  • 定位:Stochastic Trajectory Optimization for Motion Planning(PI² 路径积分强化学习变体)
  • C++ 亮点不需要梯度——适合任意 cost function(包括不可微的 ESDF 距离);Eigen::Matrix 批量扰动 + 加权平均 的向量化实现
  • 教学评分:★★★☆☆(3/5)
  • 典型使用:MoveIt2 内置插件、某些工业打磨场景

C-3. KOMO / RAI(MarcToussaint/rai)

  • URL:https://github.com/MarcToussaint/rai
  • Stars:约 230+;License:MIT;C++ 标准:C++17
  • 定位:Marc Toussaint(柏林工大)的机器人 AI 框架,KOMO 是其**基于 Augmented Lagrangian / SQP 的轨迹优化**规划器
  • C++ 亮点:提供了**配置图(configuration graph)**这种独特的数据结构——把机器人 + 环境表示为可微分的约束图;Eigen 深度集成
  • 教学评分:★★★☆☆(3/5,学术代码风格较重)
  • 典型使用:Toussaint 组的教学(TU Berlin 机器人 AI 课程)

C-4. VAMP(KavrakiLab/vamp)

  • URL:https://github.com/KavrakiLab/vamp
  • Stars:约 300+;License:BSD-3;C++ 标准:C++20
  • 定位SIMD 向量化碰撞检测 + 经典 RRT,用 AVX-512 把单次碰撞检测做到亚微秒级
  • C++ 亮点FloatVector<N> 模板化 SIMD 抽象(N=8/16 对应 AVX2/AVX-512);整个碰撞检测 pipeline 用 std::array 批量处理;Rice 大学 Kavraki 组 ICRA 2024 论文
  • 教学评分:★★★★☆(4/5)
  • 典型使用:GPU 不可用时的 cuRobo 替代方案(CPU 上最快的机械臂规划器之一)

C-5. MoveIt Task Constructor(moveit/moveit_task_constructor)

  • URL:https://github.com/moveit/moveit_task_constructor
  • Stars:约 260+;License:BSD-3;C++ 标准:C++17
  • 定位:MoveIt2 的多阶段 manipulation planner——把"pick-and-place"分解为 CurrentState → ApproachObject → Grasp → LiftObject → MoveTo → PlaceObject 等 Stage
  • C++ 亮点Stage 基类 + SerialContainer/ParallelContainer/Alternatives 组合模式——这是 Composite Pattern 在机械臂 manipulation 的应用InterfaceState 传递规划假设;pluginlib 插件注册 stages
  • 教学评分:★★★★☆(4/5)
  • 典型使用:复杂 manipulation 流程的 MoveIt2 标准方案

D. 碰撞检测库(3 个)

D-1. FCL(flexible-collision-library/fcl)

  • URL:https://github.com/flexible-collision-library/fcl
  • Stars:约 1,400+;License:BSD-3;C++ 标准:C++11
  • 定位:Flexible Collision Library,标准的 C++ 碰撞检测库,MoveIt2 默认碰撞后端
  • C++ 亮点:OBBRSS/AABB/OBB 多种边界体积模板化;fcl::BVHModel<BV> 是参数化的边界体积层次树;GJK + EPA 经典实现
  • 教学评分:★★★★☆(4/5)
  • 典型使用:MoveIt2、DART、OMPL 默认碰撞检测

D-2. HPP-FCL / Coal(coal-library/coal)

  • URL:https://github.com/coal-library/coal(曾用名 hpp-fcl)
  • Stars:约 290+;License:BSD-2;C++ 标准:C++17
  • 定位:INRIA/LAAS 维护的 FCL fork,为 Pinocchio 优化,提供距离梯度(可微碰撞检测
  • C++ 亮点:提供符号距离梯度 distance.hpp 用于基于梯度的优化(轨迹优化、MPC);新名字 "Coal" 凸显其法国学派独立身份
  • 教学评分:★★★★☆(4/5)
  • 典型使用:Pinocchio 生态默认碰撞检测、Crocoddyl 轨迹优化的碰撞约束

D-3. libccd(danfis/libccd)

  • URL:https://github.com/danfis/libccd
  • Stars:约 280+;License:BSD;C++ 标准:C99/C++(主要 C)
  • 定位:**C 语言**的 GJK + MPR 算法实现,轻量、无依赖
  • C++ 亮点:FCL 的底层依赖之一;算法纯粹,是学习 GJK 算法数学的最佳代码
  • 教学评分:★★★☆☆(3/5,纯 C 非 C++)
  • 典型使用:FCL 底层、一些轻量级项目

E. 轨迹时间参数化(3 个)

E-1. TOPP-RA(hungpham2511/toppra)

  • URL:https://github.com/hungpham2511/toppra
  • Stars:约 700+;License:MIT;C++ 标准:C++17(有 C++ 版和 Python 版,后者更完整)
  • 定位:Time-Optimal Path Parameterization based on Reachability Analysis——给定几何路径,在速度/加速度/力矩约束下求**时间最优速度曲线**
  • C++ 亮点:反向传播可达集(LP 小规模求解)+ 正向提取时间最优速度;在离散路径、约束建模和数值条件满足时,成功/失败判定比启发式 retiming 更可解释
  • 教学评分:★★★★☆(4/5)
  • 典型使用:MoveIt2 时间参数化适配器、工业机械臂后处理

E-2. Reflexxes Type IV(已被 Kuka 收购闭源;原始版:social dev 维护的 ReflexxesTypeII)

  • URL:https://github.com/pantor/reflexxes-type-ii(开源 Type II 版本)
  • Stars:约 200+;License:GPL-3.0;C++ 标准:C++11
  • 定位:在线轨迹生成的老牌方案,Kuka LBR iiwa 内部控制器使用
  • C++ 亮点:决策树方法,约 4760 节点——反面教材,说明 Ruckig 为什么值得出现
  • 教学评分:★★☆☆☆(2/5,新项目不推荐)
  • 典型使用:旧项目、KUKA Sunrise 环境

E-3. time_optimal_trajectory_generation(MoveIt TOTG)

  • URL:集成在 moveit2 的 moveit_core/trajectory_processing/time_optimal_trajectory_generation.*
  • License:BSD-3;C++ 标准:C++17
  • 定位:Kunz & Stilman 2012 论文的实现,MoveIt2 默认时间参数化
  • C++ 亮点:极简实现(约 1000 行),基于 iterative spline,数值稳定
  • 教学评分:★★★☆☆(3/5)
  • 典型使用:MoveIt2 大部分路径的默认时间参数化

F. 优化求解器(4 个)

F-1. OSQP(osqp/osqp)+ osqp-eigen(robotology/osqp-eigen)

  • URL:https://github.com/osqp/osqp、https://github.com/robotology/osqp-eigen
  • Stars:OSQP 约 1,800+,OSQP-Eigen 约 430+
  • License:Apache-2.0
  • C++ 标准:OSQP 是 C99(有 C++ 封装),osqp-eigen 是 C++14
  • 定位:Operator Splitting 的 QP 求解器,2020 年后的机器人 QP 事实标准(取代了老旧的 qpOASES)
  • C++ 亮点:稀疏矩阵原生支持(用 Compressed Sparse Column 格式);osqp-eigen 提供符合 Eigen 习惯的 C++ 接口;ADMM 算法无需矩阵分解
  • 教学评分:★★★★★(5/5)
  • 典型使用:MPC / 力控 / 逆动力学 QP(TSID、OCS2、Crocoddyl 内部)

F-2. ProxQP(Simple-Robotics/proxsuite)

  • URL:https://github.com/Simple-Robotics/proxsuite
  • Stars:约 500+;License:BSD-2;C++ 标准:C++17
  • 定位:INRIA 团队 2022 年新推出的 QP 求解器,在大量机器人 QP 基准上**比 OSQP 更快**
  • C++ 亮点:header-only 友好;Eigen 深度集成;带热启动(warm start)支持,适合 MPC 连续求解
  • 教学评分:★★★★★(5/5)
  • 典型使用:Pinocchio 生态新项目、Crocoddyl 求解器后端选项

F-3. qpOASES(coin-or/qpOASES)

  • URL:https://github.com/coin-or/qpOASES
  • Stars:约 440+;License:LGPL-2.1;C++ 标准:C++11
  • 定位:老牌的 Active-Set QP 求解器,嵌入式 C++ 友好
  • C++ 亮点:无动态内存分配(嵌入式实时安全);Primal/Dual 两种策略可切换;代码生成支持
  • 教学评分:★★★★☆(4/5)
  • 典型使用:ACADO 的默认 QP 后端、acados 选项之一、rpg_mpc(无人机 MPC)

F-4. Casadi(casadi/casadi)

  • URL:https://github.com/casadi/casadi
  • Stars:约 1,900+;License:LGPL-3.0;C++ 标准:C++11
  • 定位:符号框架 + 自动微分 + 代码生成工具,非线性规划(NLP)的核心引擎
  • C++ 亮点SX/MX 符号类型的算子重载实现 AD;CodeGenerator 可把符号模型导出为 C 代码;Ipopt/KNITRO/WORHP 后端适配
  • 教学评分:★★★★★(5/5)
  • 典型使用:MPC 代码生成工作流(Pinocchio + CppAD + Casadi 三者组合是高性能 MPC 的标配)

G. 抓取规划与操作(3 个)

G-1. moveit_grasps(moveit/moveit_grasps)

  • URL:https://github.com/moveit/moveit_grasps(ROS1)、其 ROS2 迁移在 moveit2 生态
  • Stars:约 180+;License:BSD-3;C++ 标准:C++17
  • 定位:基于物体几何的**生成式抓取规划**——给定物体,基于启发式(两指夹爪围绕主轴、吸盘附着在平面)生成抓取候选
  • C++ 亮点SuctionGraspFilterTwoFingerGraspFilter 基类设计;与 MoveIt GraspData YAML 配置联动
  • 教学评分:★★★☆☆(3/5,纯几何启发式,不涉及感知)
  • 典型使用:MoveIt2 生态的抓取规划

G-2. GPD(atenpas/gpd)

  • URL:https://github.com/atenpas/gpd
  • Stars:约 660+;License:BSD;C++ 标准:C++14
  • 定位:Grasp Pose Detection——**基于点云**的抓取检测,用 Caffe/OpenCV CNN 做抓取分类
  • C++ 亮点:C++ 推理封装(而非 Python),适合机器人实时场景;PCL 深度集成
  • 教学评分:★★★☆☆(3/5,Caffe 后端略显陈旧)
  • 典型使用:开源点云抓取检测标杆(但 2024 后 AnyGrasp 等更先进)

G-3. GraspIt!(graspit-simulator/graspit)

  • URL:https://github.com/graspit-simulator/graspit
  • Stars:约 220+;License:LGPL-2.1;C++ 标准:C++11
  • 定位:十余年前的经典抓取仿真器,多指手抓取质量分析(force-closure、epsilon-quality)
  • C++ 亮点:Coin3D/SoQt 可视化(老旧但稳定);多指抓取几何推导的参考实现
  • 教学评分:★★★☆☆(3/5)
  • 典型使用:多指手抓取研究的历史参考

H. 硬件驱动与实时控制(3 个)

H-1. ros2_control(ros-controls/ros2_control)

  • URL:https://github.com/ros-controls/ros2_control
  • Stars:约 930+;License:Apache-2.0;C++ 标准:C++17
  • 定位:ROS2 的**控制器框架和硬件抽象层**标准,对标 ROS1 ros_control 的完全重写
  • C++ 亮点ControllerInterface / HardwareInterface 基类 + pluginlib;controller_manager 以 1kHz 实时线程 调度控制器;lifecycle node 管理状态机
  • 教学评分:★★★★★(5/5)
  • 典型使用:ROS2 机械臂所有硬件抽象(franka_hardware、ur_robot_driver 都是 ros2_control 插件)

H-2. ur_robot_driver(UniversalRobots/Universal_Robots_ROS2_Driver)

  • URL:https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver
  • Stars:约 370+;License:Apache-2.0;C++ 标准:C++17
  • 定位:UR 机械臂(UR3/UR5/UR10/UR16)的 ROS2 驱动
  • C++ 亮点:TCP socket + URScript 远程注入的双通道通信;基于 ros2_control 的标准 HardwareInterface 实现
  • 教学评分:★★★★☆(4/5)
  • 典型使用:UR 机械臂开发的标准入口

H-3. franka_ros2(frankaemika/franka_ros2)

  • URL:https://github.com/frankaemika/franka_ros2
  • Stars:约 170+;License:Apache-2.0;C++ 标准:C++17
  • 定位:Franka 机器人的 ROS2 集成,基于 libfranka 构建
  • C++ 亮点franka_hardware 是 ros2_control SystemInterface 实现;franka_example_controllers 提供典型控制器示例(笛卡尔阻抗、关节阻抗、力控)
  • 教学评分:★★★★☆(4/5)
  • 典型使用:Franka Panda/FR3 的 ROS2 项目

第三部分:机械臂侧横向分析

3.1 机械臂 C++ 生态的三大关键发现

发现一:法国 INRIA 学派 vs 美国 TRI 学派的架构哲学对立。INRIA 的 Pinocchio 生态(TSID、Crocoddyl、ProxQP、Coal、Aligator)推崇**纯 C++ 模板 + 模块化库**的路线——每个库做一件事做到极致,用户自行组合。Drake 生态(TRI + MIT)推崇 集成框架 + System 标量参数化——所有组件都在 Diagram 里无缝协作,用户面对的是统一框架。两种哲学都对,但对学员的学习路径影响不同:INRIA 路线需要你自行拼装整套栈(5-7 个库),Drake 路线只需学一个但规模巨大。

发现二:机械臂规控的 GPU 加速正在重塑性能基线。2023 年前的机械臂规控性能基准是"OMPL+FCL+KDL 几百毫秒规划 + Ruckig 几毫秒实时"。2024 起 cuRobo/VAMP 把完整规划压到 30-100ms,这意味着**以前需要预规划的场景现在可以做实时重规划**,从而允许更反应性的机械臂行为(follow dynamic target、避让移动人员)。未来 2-3 年,GPU 加速规控很可能从"差异化能力"变成"标配"。

发现三:BT.CPP 已在 ROS2 生态占据 FSM 的生态位。MoveIt Pro(PickNik 商业版)、Nav2、众多工业 stack 都以 BT.CPP 为顶层编排——传统 FSM 在 ROS2 里正在被淘汰。这改变了机械臂工程师需要掌握的工具链:从"写 ROS Action Client 写状态机"升级为"写 BT.CPP 节点 + 用 Groot2 可视化"。

3.2 机械臂 vs 无人机规控的 C++ 生态对比

维度 机械臂 无人机 分析
数学基础 Eigen、Pinocchio Eigen、Sophus Pinocchio 是机械臂独有——无人机 6-DOF 刚体不需要复杂动力学
主流 C++ 标准 C++17/20 为主 C++11/14 为主 机械臂工控级部署环境宽松,无人机嵌入式 ARM 受限
架构范式 pluginlib 运行时多态(MoveIt/Tesseract) Header-only 编译期优化(GCOPTER/LBFGS-Lite) 工控机资源充裕 vs 嵌入式资源紧张
规划算法 采样(OMPL)+ 优化(TrajOpt/CHOMP)+ GPU(cuRobo) 前端搜索(Kinodynamic A*)+ 后端优化(B-spline/MINCO) 机械臂 6-7 DOF 配置空间高维采样,无人机 4-DOF 低维轨迹优化
时间参数化 Ruckig、TOPP-RA、TOTG 通常内嵌在轨迹优化中 机械臂关节空间限制严格,需独立时间参数化模块
碰撞检测 FCL、HPP-FCL、Bullet ESDF + 球碰撞近似 机械臂 mesh 精度要求高,无人机 ESDF 梯度更方便做优化
实时驱动 libfranka、ur_robot_driver(1kHz) PX4 autopilot(400Hz) 机械臂要求更高(接触控制),无人机主要是姿态稳定
抓取规划 moveit_grasps、GPD、AnyGrasp、GraspNet 等生态 (不适用) 机械臂独有
任务编排 BehaviorTree.CPP(通用) PX4 commander 状态机(专用) 通用 vs 专用

共享的库:Eigen(100%)、OSQP、Ceres(少量)、ros2_control 部分概念

关键结论:机械臂工程师和无人机工程师的 C++ 技能有约 40% 重叠(数学基础、ROS2、现代 C++),但各自有独特的深度知识——学过无人机栈的你,学机械臂侧时,**动力学库、插件架构、抓取规划、GPU 加速规控**是四个全新领域。

3.3 机械臂规控的四大 C++ 技术范式

范式一:Pinocchio 模板化动力学 + CppAD 自动微分。代表项目:Pinocchio、OCS2、Crocoddyl。核心是"用同一份 C++ 代码做数值计算、自动微分、代码生成"——通过 Scalar 模板参数在编译期选择不同的数值类型。适用场景:高性能 MPC、轨迹优化、梯度优化。学习路径:Pinocchio 基础 → Pinocchio with CppAD → CppADCodeGen 代码生成 → OCS2 整合范式。

范式二:MoveIt2 pluginlib 插件架构。代表项目:MoveIt2、Tesseract、Nav2、ros2_control。核心是"用 pluginlib 字符串 + YAML 配置运行时加载算法实现"——组件边界清晰,运行时可切换。适用场景:工业集成、多算法对比。学习路径:pluginlib 机制 → MoveIt2 IK 插件扩展 → 写一个自己的 Planning Plugin。

范式三:Drake System 标量参数化 + Diagram 组合。代表项目:Drake(唯一)。核心是"一个系统,多种用途(仿真/优化/符号)"——AutoDiffXd、double、symbolic::Expression 三种标量类型在同一份代码上切换。适用场景:学术研究、需要系统化建模的控制算法。学习路径:System 基础 → MultibodyPlant → MathematicalProgram → Diagram 组合。

范式四:Header-only + 代码生成。代表项目:Ruckig、LBFGS-Lite、ACADO。核心是"零外部依赖 + 编译期优化"——对于嵌入式场景极其友好。适用场景:实时控制回路、FPGA / PLC 部署。学习路径:Ruckig 架构精读 → 学会写 header-only 库 → 理解 ACADO 的代码生成模式。


【全景调研】附录:机械臂项目优先级总表(按教学价值排序)

优先级 项目 Stars 核心学习价值 建议投入
★★★★★ Pinocchio 3,200+ CRTP + 模板标量类型 + Model-Data 分离 2 周
★★★★★ Drake 3,400+ System 标量参数化 + Diagram 3 周
★★★★★ MoveIt2 1,700+ pluginlib 插件架构 + PlanningScene 同步 2 周
★★★★★ Tesseract+TrajOpt 340+/480+ 工业级过程规划 + Command Language IR 1.5 周
★★★★★ BehaviorTree.CPP 3,700+ 异步 ticking + pluginlib + Blackboard 1 周
★★★★★ Ruckig 1,100+ 编译期 DOF 模板 + Jerk-limited OTG 3-5 天
★★★★★ OMPL 1,200+ StateSpace/Planner 虚接口设计 1 周
★★★★★ OSQP / ProxQP 1,800+ / 500+ 机器人 QP 求解器的现代范式 3-5 天
★★★★★ Casadi 1,900+ 符号 AD + 代码生成 1 周
★★★★★ IKFast 760+(OpenRAVE) 符号 IK 生成,封闭解数学 1 周
★★★★★ ros2_control 930+ 控制器框架 + 实时线程 1 周
★★★★☆ cuRobo 1,000+ GPU 加速规控的前沿范式 1 周
★★★★☆ libfranka 250+ 工业机械臂 1kHz 实时通信 3-5 天
★★★★☆ FCL / HPP-FCL 1,400+ / 290+ 碰撞检测的 BVH + GJK 实现 3-5 天
★★★★☆ TRAC-IK 400+ 并行双策略 IK 的 std::thread 应用 2 天
★★★★☆ VAMP 300+ SIMD 向量化碰撞加速规划 3-5 天
★★★★☆ MoveIt Task Constructor 260+ Composite Pattern 在 manipulation 中的应用 2-3 天
★★★★☆ TOPP-RA 700+ 时间最优路径参数化算法 3 天
★★★★☆ BioIK / pick-ik 150+/80+ 进化算法 IK 2 天
★★★★☆ ik_geo 230+ 几何 IK 规范子问题 2 天
★★★★☆ RBDL 770+ 空间向量代数的直白 C++ 实现(Pinocchio 入门前站) 3-5 天
★★★★☆ DART 820+ 物理仿真 + 动力学组合 3 天
★★★★☆ qpOASES 440+ Active-Set QP + 嵌入式友好 2 天
★★★★☆ ur_robot_driver 370+ UR 机器人驱动 + ros2_control 应用 2 天
★★★★☆ franka_ros2 170+ Franka 的 ros2_control 集成 2 天
★★★☆☆ iDynTree 170+ 惯性参数估计 2 天
★★★☆☆ KDL 700+ 经典 C++ 运动学(历史参考) 2 天
★★★☆☆ moveit_grasps 180+ 几何启发式抓取 1-2 天
★★★☆☆ GPD 660+ 点云抓取检测 C++ 推理 1-2 天
★★★☆☆ STOMP 集成 无梯度轨迹优化 1-2 天
★★★☆☆ KOMO/RAI 230+ 配置图优化框架 2-3 天
★★★☆☆ GraspIt! 220+ 经典多指抓取仿真(历史参考) 1 天
★★★☆☆ TOTG MoveIt 内 MoveIt 默认时间参数化 1 天
★★☆☆☆ Reflexxes Type II 200+ 在线轨迹生成的老范式(反面教材) 1 天
★★★☆☆ libccd 280+ GJK 算法纯 C 实现 1 天

本批次完。共 38 个机械臂项目,其中 T0 深度剖析 8 个、T1 中度覆盖 30 个。

下一批(Round 2)**将覆盖: - 四足/人形规控 T0 深度:OCS2、Crocoddyl、TSID、MIT Cheetah-Software、legged_control、Aligator、IHMC/humanoid 前沿项目(共约 8 个) - 四足/人形 T1 中度覆盖:OpenLoong、Champ、quad-SDK、bipedal_locomotion_framework、humanoid_mpc 等(约 15 个) - **与主线 v8 对齐的增量式教学大纲(针对机械臂+腿足方向在 v8 之上需要补什么) - 横向分析:机械臂 vs 腿足 的 C++ 生态差异 + 与 SLAM 的技能迁移路径