Pinocchio 官方标识与高性能刚体动力学定位

Pinocchio

Stars

面向机器人系统的高性能刚体动力学库,提供运动学、动力学、解析导数、约束与碰撞等算法,并通过 C++、Python、ROS 和多种自动微分后端服务于控制、优化与仿真。

Rigid Body DynamicsC++ · Python · ROSEigen · Analytical Derivatives
C++ TEMPLATE DEDUCTION · EIGEN EXPRESSIONS

比较矩阵,不必绑定 Map 的继承细节

对齐方式属于存储映射实现;相等比较真正需要的契约只有矩阵尺寸与元素访问,应在无歧义的表达式基类上完成推导。

CONCRETE EIGEN TYPEMap<RowVector,
Aligned16>
dynamic row16-byte aligned

used by MatrixStackTpl::operator==

BEFORE · GCC 10MapBase<D, Level>
inheritance path Ainheritance path B
AMBIGUOUS BASEno matching function
AFTER · EXPRESSION CONTRACTMatrixBase<D>
rows()cols()coeff
ONE DEDUCTION PATHsize check · exact compare
编译失败

Aligned Map 存在歧义的 MapBase 路径

`compare_maps()` 以 `Eigen::MapBase<D, Level>` 接收操作数。对于 `Eigen::Map<RowVector, Eigen::Aligned16>` 这类对齐动态行向量,GCC 10 发现具体 Map 类型存在歧义的 `MapBase` 基类路径,无法完成模板实参推导,使 `MatrixStackTpl::operator==` 在编译阶段直接失败。

接口审计

函数体从未使用 Map 专属能力

这个 helper 实际只依赖矩阵表达式共有的 `rows()`、`cols()` 与逐元素比较,并不读取 Map 的对齐方式、访问级别或存储映射能力。函数签名绑定 `MapBase` 不仅暴露了不需要的继承细节,还额外引入两个 `Level` 模板参数;正确契约应是稳定且无歧义的 `MatrixBase` 表达式接口。

契约收敛

改由 MatrixBase 接收两侧表达式

将两个形参改为 `const Eigen::MatrixBase<D>&`,模板参数从 `D1, Level1, D2, Level2` 收敛为 `D1, D2`;函数体仍先比较行列数,再执行原有的精确元素比较。已有 `MatrixStackTpl::operator==` 测试继续覆盖该路径,无需添加只验证内部 helper 的重复用例。

兼容验证

GCC 10 与两代 Eigen 均通过测试

对齐 Map 在 GCC 10 下重新获得可推导的唯一参数转换路径,`MatrixStackTpl` 相等比较可以正常编译,同时未改变尺寸不匹配和精确比较语义。Eigen 3.4 与 5.0.1 两套构建分别完成 312/314 个步骤,并各自通过 136 项测试。

Pinocchio README 展示的多种机器人动力学计算性能对比
性能图展示 Pinocchio 在多种机器人模型上的平均动力学计算时间。项目通过统一的 Eigen 表达式和高度模板化的 C++ 算法兼顾不同模型与标量类型,因此编译器兼容性也是这套高性能抽象能够可靠落地的基础。