doc
doc
目录概述
doc
目录是 Pinocchio 库的官方文档中心,旨在为用户提供从入门到高级应用的全面指南和参考。它包含了对库特性、核心数学概念、API 使用示例、实践教程以及快速参考表(cheat sheet)的详细说明。这些文档对于理解 Pinocchio 的设计理念、掌握其功能以及有效地将其应用于机器人学研究和开发至关重要。
主要子目录和文件内容总结:
a-features
(特性)
- 核心定位:
强调 Pinocchio 是一个以性能、灵活性和数学严谨性为核心设计目标的刚体动力学库。
- 综合功能:
概述了其提供的从基础运动学/动力学计算到高级功能如解析导数和代码生成的能力。
- 设计范式:
突出其模型 (Model) 与数据 (Data) 分离的设计哲学,这有助于提高计算效率和代码复用。
- 数学基础:
强调对李群几何的深入应用,这使得 Pinocchio 能够精确处理旋转和刚体变换。
- 关键优势:
指出对解析导数的内置支持是其区别于许多其他库的显著特点,对于基于优化的控制和规划至关重要。
b-examples
(示例)- 内容覆盖:
提供了从最基础的模型加载、显示,到更高级的应用如碰撞检测和逆运动学 (Inverse Kinematics, IK) 的代码示例。
- 直观学习:
通过直接嵌入 Python 和 C++ 源代码片段,让用户可以方便地学习和复制代码。
- 逆运动学详解 (
d-inverse-kinematics.md
):这个文件特别值得注意,它不仅提供了实现闭环逆运动学 (CLIK) 的代码,还逐步解释了算法的思路、数学推导和关键实现步骤,对理解该算法和 Pinocchio 的相关 API非常有帮助。
- 多语言支持:
强调了 Pinocchio 在 Python 和 C++ 中的可用性。
- 可视化集成:
展示了 Pinocchio 如何与外部可视化工具(如 Gepetto-viewer, Meshcat)集成。
- 内容覆盖:
c-maths
(数学基础)- 核心概念:
详细介绍了 Pinocchio 库所依赖的核心数学概念和算法。
- 刚体运动表示:
从刚体运动的几何表示入手,解释了李群 (Lie Groups, SE(3), SO(3)) 和四元数 (Quaternions) 在描述姿态和变换中的应用。
- 关节模型:
阐述了不同类型关节(旋转、平移、球形、自由浮动等)的运动学和动力学特性。
- 核心算法 (RNEA):
深入剖析了核心的递归牛顿-欧拉算法 (Recursive Newton-Euler Algorithm, RNEA) 的推导步骤和计算流程,这是计算逆动力学的基础。
- SE(3) 运算速查表:
提供了一个非常详尽的 SE(3) 运算参考,列出了刚体变换、速度、力、惯性等物理量在不同参考坐标系(如世界坐标系、局部坐标系)下的变换公式,以及相关的叉积运算(如李括号)。
- 重要性:
这些内容是理解 Pinocchio 内部工作原理、进行高级机器人动力学编程以及正确使用其 API 的关键。
- 核心概念:
d-practical-exercises
(实践教程)- 学习路径:
包含一系列精心设计的教程,构成了一个从 Pinocchio 基础入门到机器人学高级应用的完整学习路径。
- 主题广泛:
教程涵盖了 Pinocchio 在运动学、动力学、运动规划、最优控制(Optimal Control)和强化学习 (Reinforcement Learning, RL) 等方面的应用。
- 逐步深入:
每个教程通常建立在前一个的基础上,逐步增加概念的复杂性和应用的深度。
- 动手实践:
强调通过实际编写和运行 Python 代码示例来掌握知识点,引导用户解决具体问题。
- 学习路径:
pinocchio_cheat_sheet
(Pinocchio 速查表)- 入门:
安装和导入。
- 空间代数:
SE3 (变换), Motion (速度), Force (力), Inertia (惯性) 对象的创建与操作,以及四元数、角轴表示和坐标转换。
- 核心对象:
pin.Data
(存储计算结果) 和pin.Model
(存储机器人静态描述) 的作用、关键成员和构建方法。 - 解析器:
从 URDF 和 SDF 文件加载模型。
- 参考坐标系:
Pinocchio 中常用的参考系类型 (WORLD, LOCAL, LOCAL_WORLD_ALIGNED)。
- 操作框架 (Operational Frames):
与末端执行器或任务点相关的位姿、速度、加速度、雅可比及其导数的计算。
- 机器人构型:
处理关节配置的函数(随机生成、归一化、差分、积分及其导数)。
- 碰撞检测:
更新几何体位姿、执行碰撞检测、计算距离。
- 质心 (Center of Mass, CoM):
计算总质量、子树质量、质心位置和质心雅可比。
- 能量:
计算动能、势能和机械能。
- 运动学:
正运动学及其导数。
- 雅可比矩阵:
计算关节雅可比及其时间导数。
- 动力学:
- 质心动力学:
计算质心动量及其时间导数。
- 通用计算:
computeAllTerms
函数。 - 回归量:
计算运动学/动力学回归量,用于参数辨识。
- 接触与约束:
处理带接触和约束的系统动力学(接触雅可比、接触动力学、约束动力学、冲击动力学)。
- Cholesky 分解:
用于高效求解线性系统和计算惯性矩阵的逆。
- 可视化:
使用 Pinocchio 的可视化接口(以 Meshcat 为例)创建查看器、加载模型、显示机器人和添加基本形状。
- 正动力学:
ABA (Articulated Body Algorithm), CRBA (Composite Rigid Body Algorithm), 计算 M(q) 和 M(q)⁻¹。
- 逆动力学:
RNEA (Recursive Newton-Euler Algorithm), 计算广义重力、RNEA 导数。
- 快速参考:
为 Pinocchio (主要是 Python API) 的常用功能和对象提供了一个简洁、易查的参考指南。
- 内容全面,覆盖了:
- 实用工具:
对于开发者来说,这是一个非常有价值的快速查找 API 和理解其用途的工具。
总结来说,
doc
目录是 Pinocchio 知识体系的核心:- 结构化和系统化:
从高级特性介绍,到具体示例,再到深层数学原理和实践应用,内容组织有序。
- 理论与实践并重:
不仅解释了“是什么”和“为什么”(特性、数学),还展示了“怎么做”(示例、教程、速查表)。
- 用户导向:
旨在帮助不同水平的用户快速上手并深入理解 Pinocchio。
- 关键资源:
特别是数学部分和速查表,对于希望充分利用 Pinocchio 功能的开发者来说是不可或缺的参考。
这个文档目录是 Pinocchio 能够被广泛采用和成功应用的重要支撑。
model
models
目录概述models
目录存放了各种机器人模型的描述文件,这些文件用于 Pinocchio 的示例程序、单元测试以及基准测试。这些模型文件采用了多种常见的机器人描述格式,如 URDF (Unified Robot Description Format)、SDF (Simulation Description Format)、MJCF (MuJoCo XML Format) 和 SRDF (Semantic Robot Description Format)。此外,还包含了一个以 Python 脚本形式定义的模型。这些模型的存在使得 Pinocchio 的用户和开发者可以:
- 快速测试和验证算法
:使用标准或特定的机器人模型来检验 Pinocchio 核心算法的正确性和性能。
- 学习模型格式
:通过查看这些文件,了解不同机器人描述格式的结构和特性。
- 作为模板或起点
:为自己的机器人项目创建模型文件提供参考。
- 演示 Pinocchio 功能
:在示例代码中加载这些模型来展示 Pinocchio 的各种能力。
具体文件内容总结:
baxter_simple.urdf
:一个非常详细和完整的 Rethink Robotics Baxter 双臂协作机器人的 URDF 文件。
由 xacro 工具生成,包含了机器人的所有连杆、关节、视觉模型、碰撞模型、惯性属性。
还包含 Gazebo 仿真相关的特定标签和传动装置定义。
是一个工业级复杂机器人模型的优秀示例,展示了 URDF 在描述这类系统时的能力。
humanoid.xml
:一个用于 MuJoCo 物理仿真的通用人形机器人的 MJCF 文件。
包含了运动学结构、动力学属性、简化的视觉和碰撞模型。
特点是定义了执行器 (actuators) 和肌腱 (tendons),增加了模型的生物力学真实感。
适用于研究人形机器人的动力学、控制和步态规划。
simple_humanoid_rel_mesh.urdf
:一个简化的人形机器人骨架模型的 URDF 文件。
主要关注运动学结构和惯性分布。
使用 Pinocchio 特定的标签(可能是注释或自定义属性)来优化基座连杆的碰撞表示(例如,使用简单的几何体如胶囊体)。
其关节通常被定义为锁定状态 (fixed),并且大部分连杆可能缺少详细的视觉和标准碰撞几何体。
更适合作为特定分析或算法开发的基础模型,而不是直接用于通用仿真。
"rel_mesh" 可能暗示其原始版本或预期用途与网格文件路径有关,或者这里的几何体是相对于某些基准定义的。
simple_humanoid.sdf
:一个与
simple_humanoid_rel_mesh.urdf
结构非常相似的简化人形机器人模型,但采用 SDF 格式。描述了运动学链和惯性属性。
与 URDF 版本在语法和特性上有所不同(如
<pose>
标签的使用,对关节动力学参数的直接支持)。核心的简化特性(如锁定的关节、缺失的视觉模型)与 URDF 版本保持一致。
simple_humanoid.srdf
:- 预定义的全身姿态 (Named Configurations)
:如 "half_sitting",方便在运动规划中作为目标或参考姿态。
- 关节组 (Joint Groups)
:定义机器人的特定部分,如手臂、腿。
- 末端执行器 (End Effectors)
。
- 禁用的碰撞对 (Disabled Collisions)
:指定哪些连杆对之间的碰撞检测可以被忽略。
- 电机转子动力学参数 (Rotor Parameters)
:如转子惯量、齿轮比,用于更精确的动力学仿真和控制。
一个 SRDF (Semantic Robot Description Format) 文件,通常与
simple_humanoid.urdf
或simple_humanoid.sdf
配合使用。为名为 "romeo" (或与之类似的 "simple_humanoid") 的机器人定义了语义信息,例如:
这些信息补充了 URDF/SDF 中的基本几何和运动学描述,使得模型在高级应用中更加完整和实用。
- 预定义的全身姿态 (Named Configurations)
simple_humanoid.urdf
:与
simple_humanoid_rel_mesh.urdf
几乎完全相同的 URDF 文件,唯一的区别可能在于根<robot>
标签中的name
属性。这表明它们描述的是同一个基本结构的机器人。
simple_humanoid.xml
:一个简化人形机器人模型的 MJCF (MuJoCo XML Format) 版本,其结构与 URDF 和 SDF 中的 "simple_humanoid" 相似。
保留了核心的运动学结构和惯性数据。
关节同样可能被锁定,并且大部分连杆可能缺少详细的几何定义。
meshdir
和对
box.stl
的引用表明它期望能找到相关的资源文件以完成几何表示(如果关节未锁定且需要可视化/碰撞)。在当前状态下,主要适用于运动学分析或作为进一步开发(如添加几何、执行器、传感器)的基础。
simple_model.py
:一个 Python 脚本,使用 Pinocchio 库以编程方式构建一个简单的机器人模型。
通常包含定义连杆、关节、惯性等步骤。
可能提供一个可选的通过 Gepetto Viewer (或其他可视化工具) 进行可视化的封装。
展示了 Pinocchio 的灵活性,允许用户不依赖外部文件格式,直接在代码中创建和定制机器人模型。
非常适用于快速原型设计、教学演示或测试特定模型配置。
总结来说,
models
目录:- 多样性
:提供了不同类型(人形、机械臂)、不同复杂度(简单骨架、完整工业模型)和不同格式(URDF, SDF, MJCF, SRDF, Python脚本)的机器人模型。
- 实用性
:这些模型直接服务于 Pinocchio 的测试、示例和基准测试,确保了库的健壮性和功能的展示。
- 教育性
:为用户提供了学习和理解各种机器人描述格式以及如何在 Pinocchio 中使用它们的实例。
- 基础性
:构成了许多 Pinocchio 应用场景的起点,用户可以基于这些模型进行修改或扩展。
这个目录是 Pinocchio 生态系统中不可或缺的一部分,为库的开发、测试和推广提供了重要的资源。
benchmark
benchmark
目录概述benchmark
目录是 Pinocchio 库的性能评测中心。它包含了一系列使用 Google Benchmark 框架编写的 C++ 基准测试套件。这些测试旨在系统性地、量化地评估 Pinocchio 中各种核心算法、数据结构和集成功能的计算效率和可扩展性。通过这些基准测试,开发者和用户可以:- 识别性能瓶颈
:了解在不同机器人模型和配置下,哪些计算步骤最为耗时。
- 比较算法实现
:评估不同算法(例如,解析导数 vs. 有限差分,Pinocchio 专用 Cholesky vs. Eigen 通用 Cholesky)的性能差异。
- 验证优化效果
:衡量代码生成(CodeGen)、即时编译(JIT)、并行计算等优化手段带来的性能提升。
- 指导应用开发
:为需要实时性能的机器人应用(如控制、规划、仿真)选择最高效的函数和配置。
核心组件:
CMakeLists.txt
: 负责管理和构建所有基准测试。它使用一个可配置的宏
ADD_PINOCCHIO_BENCH
来标准化测试的添加,并根据编译选项(如是否启用 HPP-FCL、CppAD、代码生成等)条件性地包含不同的测试文件。model-fixture.hpp
: 提供了一个可复用的基准测试框架
ModelFixture
。这个类封装了机器人模型的加载、随机状态(q, v, a, tau)的生成以及命令行参数的解析,极大地简化了编写新基准测试的流程。plot.py
: 一个 Python 脚本,用于解析 Google Benchmark 输出的 JSON 文件,并使用 Bokeh 库将其可视化为交互式图表,便于性能分析和比较。
README.md
: 提供了构建、运行和分析基准测试的完整指南,特别强调了并行测试的注意事项和结果的可视化方法。
基准测试套件 (
.cpp
文件) 摘要:timings.cpp
: (核心与综合) 全面评测 Pinocchio 库的核心计算功能,包括各种运动学、动力学(RNEA, ABA, CRBA, NLE)、雅可比、质心计算,以及内部关节遍历机制的开销。这是理解 Pinocchio 整体性能的基础。
timings-derivatives.cpp
: 专注于动力学算法及其解析导数的性能。它评估一阶和二阶导数的计算效率,并与有限差分(FD)方法进行对比,突出了 Pinocchio 在提供精确且高效导数方面的优势。
timings-cholesky.cpp
: 评测与机器人质量矩阵相关的 Cholesky 分解及其操作(求解线性系统、计算逆矩阵)的性能,并与 Eigen 的通用实现进行对比。
timings-geometry.cpp
: 评测几何更新、碰撞检测和距离计算的性能,依赖于 HPP-FCL 库。
timings-parallel.cpp
: 评估 Pinocchio 的并行计算能力,测试并行动力学(RNEA, ABA)和并行碰撞检测在多线程环境下的性能,并与单线程循环进行比较。
接触与冲量动力学:
timings-contact-dynamics.cpp
: 评测各种接触和约束动力学算法(如 ABA, PV, constrainedABA)在不同约束条件(无约束、单点/双点接触)下的执行效率。
timings-constrained-dynamics-derivatives.cpp
: 评测约束动力学导数计算的性能,特别关注其在不同接触数量下的扩展性。
timings-impulse-dynamics.cpp
: 评测冲量动力学算法(模拟瞬时碰撞)在不同接触数量下的计算效率。
timings-impulse-dynamics-derivatives.cpp
: 评测冲量动力学导数计算的性能,这对于优化涉及碰撞的机器人行为至关重要。
timings-delassus-operations.cpp
: 评测与达拉斯矩阵(接触动力学核心)相关的计算、分解、求逆和求解操作的性能。
自动微分与代码生成:
timings-cg.cpp
: (代码生成) 比较 Pinocchio 标准数值算法与通过 CppADCodeGen 生成的代码的执行效率,涵盖多种核心动力学算法及其导数。
timings-cppad-jit.cpp
: (自动微分与 JIT) 比较标准数值计算、CppAD 自动微分、CppAD JIT 编译以及 CppAD 代码生成在计算动力学及其导数时的性能。
其他:
timings-eigen.cpp
: 对 Eigen 库中的基本线性代数操作(如矩阵乘法、四元数操作)进行性能评测,作为 Pinocchio 依赖库的性能基线。
timings-jacobian.cpp
: 专门评测雅可比矩阵计算的性能,涵盖针对关节和帧的计算,以及在不同参考系下的效率。
总结来说,
benchmark
目录是 Pinocchio 项目对性能的郑重承诺。它提供了一个强大、全面的工具集,用于深入分析和量化库中几乎所有关键算法的计算效率。这不仅帮助开发者持续优化库的性能,也为用户在开发高性能机器人应用时提供了宝贵的决策依据。
README
Pinocchio README.md 总结
Pinocchio 的 README.md 文件是该项目的门户,为用户和开发者提供了关于这个高效且灵活的多体动力学库的全面介绍。它涵盖了从基本特性、安装指南到高级应用和社区生态的各个方面。
核心内容概览:
主要特性 (PINOCCHIO MAIN FEATURES):
强调 Pinocchio 是一个用于多体动力学计算的 C++ 库,具有 Python 绑定。
突出其核心优势:高效(基于 Featherstone 算法等)、灵活(支持多种关节类型、模型构建方式)、精确(解析导数)。
提及支持的功能:正向/逆向运动学、正向/逆向动力学、雅可比计算、质心计算、能量计算、碰撞检测、接触动力学、算法导数等。
- 入门:
文档 (DOCUMENTATION):
提供指向官方文档的链接,这是获取详细 API 参考、理论背景和使用指南的主要来源。
示例 (EXAMPLES):
介绍
examples
目录,其中包含了大量 C++ 和 Python 示例代码,展示了 Pinocchio 的各种功能和应用场景。鼓励用户通过运行这些示例来学习和理解库的使用。
教程 (TUTORIALS):
可能链接到更深入的教程材料,帮助用户逐步掌握 Pinocchio 的高级特性。
安装 (INSTALLATION):
提供详细的安装指南,包括依赖项(如 Eigen、Boost、可选的 URDFdom、FCL 等)。
支持多种安装方式(如从源码编译、包管理器)。
- 重要提示:
强调应始终将
pinocchio/fwd.hpp
作为第一个包含的 Pinocchio 头文件,以避免因 Boost.Variant 大小不一致可能导致的编译错误。
可视化 (VISUALIZATION):
- Gepetto Viewer:
基于 OpenSceneGraph 的 C++ 查看器,提供 Python 绑定和 Blender 导出。
- Meshcat:
基于 WebGL 的 Python 可视化工具,可嵌入浏览器。
- Panda3d:
Python 可视化工具,可嵌入浏览器。
- RViz:
ROS 可视化工具,支持 Python 接口并能与 ROS 生态系统集成。
列出 Pinocchio 支持的多种开源可视化工具,使用户能够直观地观察机器人模型和运动:
- Gepetto Viewer:
引用特定的算法贡献 (CITING SPECIFIC ALGORITHMIC CONTRIBUTIONS):
为希望在学术工作中引用 Pinocchio 中特定算法(如解析导数、接触模型等)的研究者提供相关的参考文献和引用指南。
核心开发团队 (CORE-DEV TEAM):
列出项目的核心维护者和开发者,感谢他们对项目的贡献。
致谢 (CREDITS):
感谢对 Pinocchio 开发做出贡献的个人和机构。
依赖 PINOCCHIO 的开源项目 (OPEN-SOURCE PROJECTS RELYING ON PINOCCHIO):
- Crocoddyl:
模型预测控制软件。
- TSID:
任务空间逆动力学求解器。
- HPP:
人形机器人运动规划 SDK。
- Jiminy:
基于 Pinocchio 的模拟器。
- ocs2:
切换系统最优控制工具箱。
以及其他用于仿真、强化学习、符号动力学生成、运动规划教学、非线性规划、轨迹优化等的项目。
展示 Pinocchio 在机器人学研究和应用领域的广泛影响力,列举了一系列依赖 Pinocchio 的知名开源项目,例如:
这部分内容体现了 Pinocchio 作为机器人学领域基础软件库的地位和价值。
- Crocoddyl:
鸣谢 (ACKNOWLEDGMENTS):
感谢为 Pinocchio 项目提供资金支持或基础设施支持的组织机构。
总结来说,Pinocchio 的 README.md:
- 清晰定位:
将 Pinocchio 定位为一个高效、灵活的多体动力学计算库。
- 功能全面:
简要介绍了其涵盖的广泛功能。
- 用户友好:
提供了清晰的文档、示例和安装指南,并特别指出了一个重要的编译注意事项。
- 生态丰富:
强调了对多种可视化工具的支持,并展示了其在众多知名开源机器人项目中的应用,证明了其在学术界和工业界的实用性和影响力。
- 社区导向:
感谢了核心团队和贡献者,并为学术引用提供了便利。
这份 README 是新用户了解 Pinocchio、开始使用并最终为其生态系统做出贡献的重要起点。
src
src
目录概述src
目录包含了 Pinocchio 库的核心源代码实现。这里的代码实现了库中定义的所有算法、数据结构和工具函数。与include
目录中的头文件(定义接口)不同,src
目录主要包含.cpp
文件,这些文件提供了这些接口的具体实现,并且通常包含了针对常用模板参数(如double
标量类型、默认关节集合)的显式模板实例化,以优化编译时间和库的链接。目录结构通常包含:
一个顶层的
CMakeLists.txt
文件,用于管理src
目录下所有源文件的编译。多个子目录,通常按功能模块组织,如:
algorithm
: 包含核心运动学和动力学算法的实现,如 RNEA, ABA, CRBA, 雅可比计算,以及它们的导数等。
collision
: 包含碰撞检测和距离查询相关算法的实现。
extra
: 包含一些扩展功能或不属于核心动力学模块的算法,如可达工作空间计算。
multibody
: 包含核心数据结构如
Model
和Data
的实现,以及构建和修改模型的函数。parsers
: 包含用于解析不同机器人描述文件格式(如 URDF, SDF, MJCF)的代码,以及与 Python 脚本交互加载模型的功能。
utils
: 包含一些通用工具函数,如文件路径探索。
visualizers
: 包含可视化器基类的实现。
以下是各文件和子目录的详细内容总结:
src
(根目录下的文件)CMakeLists.txt
: 顶层配置文件,负责定义如何编译
src
目录下的所有源文件,并将它们组织成 Pinocchio 库(通常是静态库或动态链接库)。
src/algorithm
子目录 (核心算法实现和显式模板实例化)aba-derivatives.cpp
: 为
computeABADerivatives
函数(计算 ABA 算法的导数,即 ddq 对 q, v, tau 的偏导数)提供显式模板实例化。aba.cpp
: 为
computeMinverse
(基于 ABA 计算质量矩阵的逆) 和其他 ABA 相关算法提供显式模板实例化。center-of-mass-derivatives.cpp
: 为计算质心速度和加速度导数的函数(如
getCenterOfMassVelocityDerivatives
,getCenterOfMassAccelerationDerivatives
)提供显式模板实例化。center-of-mass.cpp
: 为计算总质量、子树质量、质心位置和质心雅可比的函数(如
centerOfMass
,jacobianCenterOfMass
)提供显式模板实例化。centroidal-derivatives.cpp
: 为计算质心动力学导数的函数(如
computeCentroidalDynamicsDerivatives
,getCentroidalDynamicsDerivatives
,计算 Ag 和 h_g_dot 对 q, v 的偏导数)提供显式模板实例化。centroidal.cpp
: 为质心动力学核心算法(如
ccrba
,dccrba
,computeCentroidalMap
,computeCentroidalMomentum
及其时间导数)提供显式模板实例化。cholesky.cpp
: 为关节空间惯性矩阵 M 的 Cholesky 分解 (
solve
,inverse
,computeMinv
) 及其相关操作提供显式模板实例化。compute-all-terms.cpp
: 为
computeAllTerms
函数(一次性计算所有主要运动学和动力学量)提供显式模板实例化。constrained-dynamics-derivatives.cpp
: 为
computeConstraintDynamicsDerivatives
函数(计算受约束动力学的解 ddq 和约束力 lambda 对 q, v, tau 的偏导数)提供显式模板实例化。constrained-dynamics.cpp
: 为核心约束动力学算法函数(如
constraintDynamics
,contactABA
,用于确定受约束时的关节加速度)提供显式模板实例化。contact-cholesky.cpp
: 为
ContactCholeskyDecompositionTpl
类及其成员函数(用于高效处理带接触约束的 KKT 系统)和内部辅助函数提供显式模板实例化。contact-dynamics.cpp
: 为
impulseDynamics
和forwardDynamics
(旧版 API,处理接触)以及computeKKTContactDynamicMatrixInverse
(计算接触动力学 KKT 系统关键矩阵的逆) 提供显式模板实例化。contact-jacobian.cpp
: 为计算接触约束雅可比的函数 (
getConstraintJacobian
,getConstraintsJacobian
) 提供显式模板实例化。crba.cpp
: 为
crba
(Composite Rigid Body Algorithm,计算关节空间惯性矩阵 M(q)) 函数提供显式模板实例化。energy.cpp
: 为计算机器人动能、势能和总机械能的函数 (
computeKineticEnergy
,computePotentialEnergy
,computeMechanicalEnergy
) 提供显式模板实例化。frames-derivatives.cpp
: 为计算参考帧运动学导数的函数 (
getFrameVelocityDerivatives
,getFrameAccelerationDerivatives
) 提供显式模板实例化。frames.cpp
: 为计算参考帧运动学量(位姿、速度、加速度、雅可比及其导数)的函数 (
updateFramePlacements
,getFrameVelocity
,getFrameClassicalAcceleration
,getFrameJacobian
,getFrameJacobianTimeVariation
) 提供显式模板实例化。geometry.cpp
: 为
updateGeometryPlacements
函数(计算并更新几何对象在世界坐标系下的位姿)提供显式模板实例化。impulse-dynamics.cpp
: 为
impulseDynamics
函数(计算碰撞后的关节速度和接触冲量)提供显式模板实例化。(此文件可能与contact-dynamics.cpp
中的旧版impulseDynamics
有重叠或为新版实现)jacobian.cpp
: 为计算关节雅可比及其时间导数的函数 (
computeJointJacobians
,getJointJacobian
,computeJointJacobiansTimeVariation
,getJointJacobianTimeVariation
) 提供显式模板实例化。joint-configuration.cpp
: 为关节配置空间操作(如
integrate
,difference
,normalize
,randomConfiguration
,interpolate
, 及其导数dIntegrate_dq
,dDifference_dq0
等)提供显式模板实例化。kinematics-derivatives.cpp
: 为计算关节运动学一阶和二阶导数的函数(如
computeForwardKinematicsDerivatives
,getJointVelocityDerivatives
,computeJointKinematicHessians
)提供显式模板实例化。kinematics.cpp
: 为正向运动学计算函数(如
forwardKinematics
(不同重载版本计算位姿、速度、加速度),updateGlobalPlacements
,getRelativePlacement
,getVelocity
,getAcceleration
,getClassicalAcceleration
)提供显式模板实例化。model.cpp
: 为操作和修改机器人模型的算法函数(如
appendModel
,buildReducedModel
,transformJointIntoMimic
,buildMimicModel
,findCommonAncestor
)提供显式模板实例化。proximal.cpp
: 为
ProximalSettingsTpl
结构体(用于配置近端优化算法参数)提供显式模板实例化。regressor.cpp
: 为计算各种动力学回归矩阵的函数(如
bodyRegressor
,jointTorqueRegressor
,staticRegressor
,kineticEnergyRegressor
,potentialEnergyRegressor
)提供显式模板实例化。rnea-derivatives.cpp
: 为计算 RNEA 及其导数的函数(如
computeRNEADerivatives
,computeGeneralizedGravityDerivatives
,computeStaticTorqueDerivatives
)提供显式模板实例化。rnea.cpp
: 为 RNEA 算法及其变种(如
rnea
计算完整逆动力学,computeGeneralizedGravity
计算重力项,computeCoriolisMatrix
计算科里奥利矩阵,computeStaticTorque
计算静态力矩项)提供显式模板实例化。
src/collision
子目录 (碰撞检测和距离计算实现)collision.cpp
: 为
computeCollisions
(执行碰撞检测) 和computeBodyRadius
(计算几何体有效半径) 函数提供显式模板实例化。distance.cpp
: 为
computeDistances
(计算几何对象对之间的最小距离) 函数提供显式模板实例化。
src/extra
子目录 (扩展功能实现)reachable-workspace.cpp
: 提供
buildConvexHull
函数的实现(可能依赖 Qhull),用于计算可达工作空间的凸包表示。这是库内部函数,通常不直接由用户调用。
src/multibody
子目录 (核心数据结构和模型构建实现)data.cpp
: 为
DataTpl
(通常别名为Data
) 类的构造函数(默认构造和带Model
参数的构造)提供显式模板实例化。model.cpp
: 为
ModelTpl
(通常别名为Model
) 类的核心构造和模型构建成员函数(如默认构造,addJoint
,addJointFrame
,appendBodyToJoint
,addBodyFrame
,addFrame
)提供显式模板实例化。sample-models.cpp
: 为
pinocchio::buildModels
命名空间下的示例模型构建函数 (manipulator
,humanoid
,humanoidRandom
) 提供显式模板实例化。
src/parsers
子目录 (机器人描述文件解析器实现)mjcf
子目录:
mjcf-graph-geom.cpp
: MJCF 解析器后端,负责将从 MJCF 文件提取的几何、材质、纹理、位点等信息转换为 Pinocchio 的
GeometryModel
。处理默认值、类继承和几何类型转换。mjcf-graph.cpp
: MJCF 解析器核心逻辑,将 MJCF 的 XML 结构转换为内部中间表示
MjcfGraph
,并最终构建 Pinocchio 的Model
和GeometryModel
。
python
子目录:
model.cpp
: 提供从 Python 脚本加载或构建 Pinocchio
Model
对象的功能,允许 C++ 端执行 Python 脚本来定义模型。
sdf
子目录:
geometry.cpp
: SDF 解析器的一部分,处理 SDF 文件中的几何信息 (visual, collision),并填充到 Pinocchio 的
GeometryModel
。model.cpp
: SDF 解析器核心逻辑,从
SdfGraph
(SDF 结构中间表示)构建 Pinocchio 的Model
和处理接触/约束信息。
urdf
子目录:
geometry.cpp
: URDF 解析器核心,解析 URDF 中的几何信息 (visual, collision),并转换为 Pinocchio 的
GeometryModel
。model.cpp
: URDF 解析器核心逻辑,将 URDF 文件或 XML 字符串转换为 Pinocchio 的
Model
对象。utils.cpp
: 定义 URDF 解析器内部辅助函数,如
convertFromUrdf
,用于在urdfdom
和 Pinocchio 数据类型间转换。
src/utils
子目录 (通用工具函数实现)file-explorer.cpp
: 实现文件路径探索和管理功能,特别针对 ROS 环境,构建全面的文件搜索路径列表。
src/visualizers
子目录 (可视化器实现)base-visualizer.cpp
: 实现
BaseVisualizer
抽象基类,提供通用接口和核心逻辑,用于显示机器人模型及其运动,与具体可视化后端解耦。
这个总结反映了 Pinocchio 库的模块化设计,其中核心算法、数据结构、解析器和工具都有其专门的实现文件,并通过显式模板实例化来优化性能和可用性。
include\pinocchio
顶层核心文件 (include\pinocchio):
- context.hpp
: 配置库的默认计算上下文,主要是默认标量类型和 Eigen 选项,支持用户定制。
- deprecated-macros.hpp
: 兼容旧版宏定义,确保旧代码在特定模式下可编译。
- deprecated-namespaces.hpp
: 兼容旧版命名空间使用,提供向后兼容性。
- deprecation.hpp
: 聚合头文件,统一包含所有与弃用和向后兼容性相关的机制。
- eigen-macros.hpp
: 定义与 Eigen 库集成的辅助宏,简化类型推断、处理版本兼容性和调试内存分配。
- fwd.hpp
: 核心基础文件,提供前向声明和全局配置入口,几乎被所有其他 Pinocchio 头文件包含,用于初始化库环境。
- macros.hpp
: 定义大量预处理器宏,用于标准化、可移植性、代码清晰、调试、编译时检查和用户配置。
- unsupported.hpp
: 定义宏,标记库中未被官方支持的特性或代码部分。
子目录详述:
algorithm
: 包含核心机器人算法。
force.hpp
,
motion.hpp
: 在不同参考坐标系间转换力向量和运动向量。
aba.hpp
,
rnea.hpp
: ABA 和 RNEA 的并行版本 (使用OpenMP和模型池)。geometry.hpp
: (已弃用) 重定向到
pinocchio/collision/parallel/geometry.hpp
。omp.hpp
: 配置 OpenMP 运行时环境的辅助函数。
constraint-data-base.hpp
,
constraint-model-base.hpp
: 约束数据和模型的基类 (使用CRTP)。constraint-data-generic.hpp
,
constraint-model-generic.hpp
: 通用约束数据和模型容器 (基于boost::variant
)。constraints.hpp
,
fwd.hpp
: 约束模块的前向声明和聚合。coulomb-friction-cone.hpp
: 定义库仑摩擦锥及其对偶锥的数据结构和操作。
visitors/constraint-model-visitor.hpp
: 处理通用约束模型和数据的访问者模式。
aba*.hpp/.hxx/.txx
: 关节体算法 (ABA) 实现、其导数计算及模板实例化。ABA 用于高效正向动力学。
admm-solver.hpp/.hxx
: 基于 ADMM 的接触求解器,用于处理带摩擦的接触问题。
center-of-mass*.hpp/.hxx/.txx
: 计算质心位置、速度、加速度、雅可比及其相关导数。
centroidal*.hpp/.hxx/.txx
: 计算质心动量、动量矩阵及其时间导数,以及这些量的偏导数。
check*.hpp/.hxx
: (
check-base.hpp
,check-data.hpp
,check-model.hpp
,check.hpp
,default-check.hpp
) 算法检查器基类和具体实现,用于验证模型 (Model) 和数据 (Data) 结构的一致性和有效性。cholesky*.hpp/.hxx/.txx
: 关节空间惯性矩阵 M 的 Cholesky 分解 (UDU^T 或 LDL^T) 相关算法,用于高效求解线性系统。
compute-all-terms*.hpp/.hxx/.txx
: 便利函数,一次性高效计算机器人动力学中的大部分关键量。
constrained-dynamics*.hpp/.hxx/.txx
: 计算带接触约束的机器人系统正向动力学及其导数。
constrained-problem-data.hpp
: (空) 可能为未来约束问题数据结构预留。
contact-cholesky*.hpp/.hxx/.txx
: 处理带接触约束动力学问题中 KKT 矩阵的 Cholesky 分解。
contact-dynamics*.hpp/.hxx/.txx
: 已弃用的接触动力学和冲量动力学接口及实现。
contact-info.hpp
: 定义刚性接触约束的模型 (
RigidConstraintModelTpl
) 和数据 (RigidConstraintDataTpl
) 结构,及Baumgarte稳定化参数。contact-inverse-dynamics.hpp
: 计算接触冲量和接触相关的逆动力学 (标记为UNSUPPORTED)。
contact-jacobian*.hpp/.hxx/.txx
: 计算接触约束的运动学雅可比矩阵。
contact-solver-base.hpp
: 接触问题求解器的基类。
contact-solver-utils.hpp
: 接触求解器(特别是库仑摩擦)相关的内部辅助运算。
contact.hpp/.hxx
: 接触动力学相关算法的聚合头文件。
copy.hpp
: 根据运动学级别选择性复制 Data 对象中的部分数据。
crba*.hpp/.hxx/.txx
: 复合刚体算法 (CRBA) 实现,用于计算关节空间惯性矩阵 M(q)。
delassus*.hpp/.hxx
: (
delassus-operator-base.hpp
,delassus-operator-dense.hpp
,delassus-operator-sparse.hpp
,delassus.hpp/.hxx
) Delassus 算子及其逆的计算,用于接触动力学。提供基类、稠密和稀疏实现。(delassus-operartor-ref.hpp
,delassus-operator-rigid-body.hpp
为空或不完整)energy*.hpp/.hxx/.txx
: 计算机器人系统的动能、势能和总机械能。
frames*.hpp/.hxx/.txx
: 计算操作坐标系 (Frame) 的运动学量 (位姿、速度、加速度、雅可比) 及其导数。
fwd.hpp
:
algorithm
模块内部的前向声明和类型别名。geometry*.hpp/.hxx/.txx
: 更新几何对象 (碰撞体、可视化模型) 在世界坐标系下的位姿。
impulse-dynamics*.hpp/.hxx/.txx
: 计算冲击动力学(碰撞响应)及其导数。
jacobian*.hpp/.hxx/.txx
: 计算机器人雅可比矩阵及其时间导数。
joint-configuration*.hpp/.hxx/.txx
: 机器人关节构型相关的核心操作 (基于李群/李代数)。
kinematics*.hpp/.hxx/.txx
: 机器人运动学计算 (关节位姿、速度、加速度) 及其导数和海森矩阵。
model*.hpp/.hxx/.txx
: 操作和修改机器人模型结构的函数 (如组合模型、简化模型、处理模仿关节)。
pgs-solver.hpp/.hxx
: 基于投影高斯-赛德尔 (PGS) 的接触求解器。
proximal*.hpp/.txx
: 近端优化算法的配置和状态存储结构。
pv*.hpp/.hxx
: Popov-Vereshchagin (PV) 算法和约束关节体算法 (constrainedABA) 实现,用于计算带约束的正向动力学。
regressor*.hpp/.hxx/.txx
: 计算各种物理量 (力矩、能量、质心等) 关于标准惯性参数的回归矩阵/向量。
rnea*.hpp/.hxx/.txx
: 递归牛顿-欧拉算法 (RNEA) 实现,用于逆动力学,以及其一阶和二阶导数计算。
constraints
(子目录): 处理通用约束的框架。
parallel
(子目录): 并行算法实现。
utils
(子目录):
algorithm
模块的工具函数。
autodiff
: 支持自动微分。algorithm/aba.hpp
: CppAD 下 SE(3) 作用于空间惯性张量的实现。
math/eigen_plugin.hpp
,
math/quaternion.hpp
: CppAD 下的 Eigen 插件和四元数转换。spatial/log.hxx
,
spatial/se3-tpl.hpp
: CppAD 下空间代数对数映射、雅可比及 SE3 类型的特定行为。utils/static-if.hpp
: CppAD 符号类型下的条件分支。
math/matrix.hpp
,
math/quaternion.hpp
,math/triangular-matrix.hpp
: CasADi 符号类型下的矩阵求逆、四元数转换、三角矩阵乘法。spatial/se3-tpl.hpp
: CasADi 下 SE3 类型的特定行为 (如规范化)。
utils/static-if.hpp
: CasADi 符号类型下的条件分支和比较。
casadi-algo.hpp
: 将 Pinocchio 核心算法通过 CasADi 转换为符号表达式并生成 C 代码。
casadi.hpp
: Pinocchio 与 CasADi 自动微分库的集成核心,使 Pinocchio 算法能使用 CasADi 符号类型。
cppad.hpp
: Pinocchio 与 CppAD 自动微分库的集成核心。
casadi
(子目录): 针对 CasADi 的特定数学和空间运算特化。
cppad
(子目录): 针对 CppAD 的特定数学和空间运算特化。
bindings
: Python 绑定。context.hpp
: Python 绑定的计算上下文选择器 (决定使用哪种标量类型)。
fwd.hpp
: Python 绑定框架的前向声明和组织结构。
pch.hpp
: 预编译头文件,包含绑定所需的依赖项。
pybind11-all.hpp
,
pybind11.hpp
: 使用 pybind11 实现绑定的类型转换器和辅助工具。algorithm
(子目录): 绑定
pinocchio/algorithm
中的算法。collision
(子目录): 绑定
pinocchio/collision
中的碰撞检测功能。context
(子目录): Python 绑定的特定计算上下文实现。
extra
(子目录): 绑定
pinocchio/extra
中的附加功能。math
(子目录): 绑定
pinocchio/math
中的数学工具。multibody
(子目录): 绑定
pinocchio/multibody
中的核心多体结构。parsers
(子目录): 绑定
pinocchio/parsers
中的模型解析器。serialization
(子目录): 绑定
pinocchio/serialization
中的序列化功能。spatial
(子目录): 绑定
pinocchio/spatial
中的空间向量代数。utils
(子目录): 绑定 Python 层的各种辅助工具。
visualizers
(子目录): 绑定可视化器接口。
algorithms.hpp
: 声明各算法模块的 Python 暴露函数。
contact-cholesky.hpp
,
contact-info.hpp
,contact-solver-base.hpp
,delassus-operator.hpp
,proximal.hpp
: 绑定接触 Cholesky 分解、接触信息、求解器基类、Delassus 算子、近端算法设置。constraints/coulomb-friction-cone.hpp
: 绑定库仑摩擦锥。
broadphase-manager-base.hpp
,
broadphase-manager.hpp
,tree-broadphase-manager.hpp
: 绑定宽相碰撞检测管理器的基类、具体实现和树形结构管理器。collision.hpp
: 声明碰撞检测相关功能的 Python 暴露函数。
geometry-functors.hpp
: 绑定几何计算函子。
fcl/transform.hpp
: 定义 Pinocchio SE3 与 HPP-FCL Transform3f 间的类型转换。
pool/broadphase-manager.hpp
,
pool/geometry.hpp
: 绑定宽相管理器池和几何对象池。
casadi.hpp
,
cppad.hpp
,cppadcg.hpp
,default.hpp
,mpfr.hpp
: 分别为 CasADi、CppAD、CppADCodeGen、默认数值、MPFR高精度配置 Python 绑定上下文。generic.hpp
: 根据标量类型宏,为 Pinocchio 核心类创建类型别名,是多标量类型支持的关键。
extras.hpp
: 声明 "extra" 功能的 Python 暴露函数。
lanczos-decomposition.hpp
,
tridiagonal-matrix.hpp
: 绑定 Lanczos 分解和三对角矩阵。multiprecision/boost/number.hpp
: 绑定 Boost.Multiprecision (MPFR后端) 高精度数。
data.hpp
,
frame.hpp
,geometry-data.hpp
,geometry-model.hpp
,geometry-object.hpp
,model.hpp
: 绑定 Data, Frame, GeometryData, GeometryModel, GeometryObject, Model 等核心数据结构。liegroups.hpp
: 绑定李群操作。
joint
(子目录): 绑定各种关节类型 (
joint-data.hpp
,joint-derived.hpp
,joint-model.hpp
,joint.hpp
,joints-datas.hpp
,joints-models.hpp
,joints-variant.hpp
)。pool/model.hpp
: 绑定模型池 (
ModelPool
)。
mjcf.hpp
,
sdf.hpp
,srdf.hpp
,urdf.hpp
: 分别绑定 MJCF, SDF, SRDF, URDF 解析器。python.hpp
: (已弃用) 重定向。
serializable.hpp
,
serialization.hpp
: 绑定通用序列化接口和二进制序列化。
classic-acceleration.hpp
,
explog.hpp
,force.hpp
,inertia.hpp
,motion.hpp
,se3.hpp
,symmetric3.hpp
: 绑定经典加速度计算、李群指数/对数映射、力向量、惯性、运动向量、SE3变换、3x3对称矩阵。
address.hpp
,
cast.hpp
,comparable.hpp
,constant.hpp
,conversions.hpp
,copyable.hpp
,dependencies.hpp
,deprecation.hpp
,eigen.hpp
,list.hpp
,macros.hpp
,model-checker.hpp
,namespace.hpp
,path.hpp
,pickle-map.hpp
,pickle-vector.hpp
,pickle.hpp
,printable.hpp
,registration.hpp
,std-aligned-vector.hpp
,std-map.hpp
,std-vector.hpp
,version.hpp
: 提供地址查询、类型转换、比较、常量定义、复制、依赖/版本信息、弃用警告、Eigen辅助、列表转换、属性暴露宏、模型检查、命名空间管理、路径处理、pickle支持、打印、符号链接注册、对齐向量/map/vector绑定等。
visualizer-visitor.hpp
: 为可视化器基类提供通用 Python 绑定接口。
python
(子目录): 核心 Python 绑定逻辑。
codegen
: C 代码生成。code-generator-algo.hpp
: 为多种核心机器人算法自动生成 C 代码 (利用 CppAD)。
code-generator-base.hpp
: 通用代码生成框架基类 (利用 CppAD 和 CppADCodeGen)。
cppadcg.hpp
: Pinocchio 与 CppADCG 集成的核心适配文件,处理
CppAD::cg::CG<Scalar>
类型。
collision
: 碰撞检测。broadphase-manager.hpp
: 宽相碰撞管理器池基类。
fwd.hpp
: 碰撞检测资源池相关的前向声明和类型别名。
broadphase.hpp
: 并行执行宽相碰撞检测 (使用OpenMP和池)。
geometry.hpp
: 并行碰撞检测 (几何层面,也使用OpenMP)。
broadphase-callbacks.hpp/.hxx
: 处理宽相碰撞检测结果的回调函数接口和默认实现 (与 hpp-fcl 协同)。
broadphase-manager-base.hpp
: 宽相碰撞检测管理器基类。
broadphase-manager.hpp/.hxx
: 宽相碰撞检测管理器模板类 (封装 hpp-fcl)。
broadphase.hpp/.hxx
: 执行宽相碰撞检测的函数。
collision.hpp/.hxx/.txx
: 执行窄相碰撞检测的核心函数及相关辅助。
distance.hpp/.hxx/.txx
: 计算几何对象之间最小距离的核心函数。
fcl-pinocchio-conversions.hpp
: Pinocchio SE3 与 hpp-fcl Transform3f 之间的转换函数。
tree-broadphase-manager.hpp/.hxx
: 专门用于树状结构的宽相碰撞管理器。
parallel
(子目录): 并行碰撞检测。
pool
(子目录): 碰撞检测资源池。
container
: 自定义容器。aligned-vector.hpp
: 创建内存对齐的
std::vector
(用于Eigen固定大小类型)。boost-container-limits.hpp
: 配置 Boost.MPL 容器的最大尺寸限制。
context
(与顶层不同,这里指具体上下文实现)casadi.hpp
,cppad.hpp
,cppadcg.hpp
,default.hpp
: 分别配置 Pinocchio 使用 CasADi、CppAD、CppADCG 和默认数值 (通常是
double
) 作为标量类型的上下文。generic.hpp
: 通用上下文类型定义核心,根据宏
PINOCCHIO_SCALAR_TYPE
等为核心数据结构创建类型别名。
core
: 非常底层的核心操作 (此目录内容较少)。binary-op.hpp
: 二元乘法操作结果类型推断的模板元编程框架。
unary-op.hpp
: (空)
extra
: 附加或实验性功能。reachable-workspace.hpp/.hxx
: 计算机器人末端执行器可达工作空间。
math
: 数学工具。casadi.hpp
,cppad.hpp
,cppadcg.hpp
: (已弃用) 重定向到
autodiff
或codegen
目录下的对应文件。comparison-operators.hpp
: 封装标准比较操作符的结构体和编译时条件应用工具。
eigenvalues.hpp
: 通过幂迭代法计算矩阵特征值。
fwd.hpp
: 数学模块的前向声明和基础工具定义。
gram-schmidt-orthonormalisation.hpp
: 格拉姆-施密特正交化过程的一部分。
lanczos-decomposition.hpp
: Lanczos 分解 (三对角化) 算法。
matrix-block.hpp
: 统一接口调用 Eigen 的块或段操作。
matrix.hpp
: Eigen 矩阵和向量操作的辅助函数和TMP结构体 (支持多标量类型)。
multiprecision-mpfr.hpp
:
SINCOSAlgo
对 Boost.Multiprecision MPFR 的特化。multiprecision.hpp
: 为 Pinocchio 添加 Boost.Multiprecision 支持。
quaternion.hpp
: 四元数操作的核心函数和工具。
rotation.hpp
: 三维旋转矩阵相关的数学操作。
rpy.hpp/.hxx
: Roll-Pitch-Yaw (RPY) 欧拉角与旋转矩阵转换及相关雅可比。
sign.hpp
: 计算标量符号。
sincos.hpp
: 同时计算角度的正弦和余弦值。
taylor-expansion.hpp
: 估算泰勒级数展开的合适切换点。
tensor.hpp
: 张量数据结构 (可选 Eigen::Tensor 或自定义实现)。
triangular-matrix.hpp
: 计算三角矩阵与另一矩阵的乘积。
tridiagonal-matrix.hpp
: 自定义对称三对角矩阵类型及操作。
multibody
: 多体动力学核心数据结构。fusion.hpp
: 与 Boost.Fusion 相关的辅助功能,用于访问者模式。
joint-binary-visitor.hpp
: 对两个关节模型执行二元操作的访问者框架。
joint-unary-visitor.hpp
: 对单个关节模型/数据执行一元操作的访问者框架。
fwd.hpp
: 模型池和几何模型池的前向声明。
geometry.hpp
:
GeometryPoolTpl
,几何模型和数据对象池。model.hpp
:
ModelPoolTpl
,机器人模型和数据对象池。
cartesian-product-variant.hpp/.hxx
: 由多种不同李群笛卡尔积构成的复合李群 (动态)。
cartesian-product.hpp
: 两个特定李群笛卡尔积构成的复合李群 (静态)。
fwd.hpp
:
LieGroupGenericTpl
的前向声明。liegroup-algo.hpp/.hxx
: 基于访问者模式在关节模型上执行李群算法的框架和实现。
liegroup-base.hpp/.hxx
: 所有具体李群操作类的公共基类 (
LieGroupBase
, CRTP)。liegroup-collection.hpp
: 定义李群变体 (
LieGroupVariant
viaboost::variant
)。liegroup-generic.hpp
: 通用李群包装器 (
LieGroupGenericTpl
),结合 CRTP 和boost::variant
。liegroup-variant-visitors.hpp/.hxx
:
LieGroupGenericTpl
的自由函数接口及访问者实现。liegroup.hpp
: 关节模型与其对应李群操作类型的映射。
special-euclidean.hpp
: 特殊欧几里得群 SE(n) (SE(2), SE(3)) 的李群操作。
special-orthogonal.hpp
: 特殊正交群 SO(n) (SO(2), SO(3)) 的李群操作。
vector-space.hpp
: 向量空间 R^Dim 作为李群的操作。
fwd.hpp
: 所有关节类型的前向声明。
joint-base.hpp
: 聚合关节模型和数据基类。
joint-basic-visitors.hpp/.hxx
: 通过访问者模式对通用关节模型/数据执行常见操作。
joint-collection.hpp
: 定义包含所有标准关节类型的
boost::variant
(JointModelVariant
,JointDataVariant
)。joint-common-operations.hpp
: 关节操作的通用工具 (如仿射变换)。
joint-composite.hpp/.hxx
: 复合关节 (由多个子关节串联)。
joint-data-base.hpp
: 所有具体关节数据结构的基类 (
JointDataBase
, CRTP)。joint-free-flyer.hpp
: 自由漂浮关节 (6 DOF)。
joint-generic.hpp
: 通用关节模型 (
JointModelTpl
) 和数据 (JointDataTpl
),内部使用boost::variant
。joint-helical*.hpp
: 螺旋关节 (轴对齐
joint-helical.hpp
, 非对齐joint-helical-unaligned.hpp
)。joint-mimic.hpp
: 模仿关节。
joint-model-base.hpp
: 所有具体关节模型结构的基类 (
JointModelBase
, CRTP)。joint-planar.hpp
: 平面关节 (3 DOF)。
joint-prismatic*.hpp
: 平移关节 (轴对齐
joint-prismatic.hpp
, 非对齐joint-prismatic-unaligned.hpp
)。joint-revolute*.hpp
: 旋转关节 (轴对齐有界
joint-revolute.hpp
, 非对齐有界joint-revolute-unaligned.hpp
, 轴对齐无界joint-revolute-unbounded.hpp
, 非对齐无界joint-revolute-unbounded-unaligned.hpp
)。joint-spherical*.hpp
: 球面关节 (标准四元数
joint-spherical.hpp
, ZYX欧拉角joint-spherical-ZYX.hpp
)。joint-translation.hpp
: 三维平移关节 (3 DOF)。
joint-universal.hpp
: 万向节关节 (2 DOF)。
joints.hpp
: 聚合头文件,包含所有关节类型。
data.hpp/.hxx/.txx
:
DataTpl
结构体,存储机器人模型计算结果和临时变量。fcl.hpp
: Pinocchio 与 HPP-FCL 的接口层/适配层。
force-set.hpp
:
ForceSetTpl
类,高效存储和操作一组空间力。frame.hpp
:
FrameTpl
结构体,表示机器人模型中的坐标系。fwd.hpp
: 多体动力学模块的前向声明。
geometry-object-filter.hpp
:
GeometryObject
的预定义过滤器。geometry-object.hpp/.hxx
:
GeometryObject
结构体,表示单个几何单元 (视觉/碰撞)。geometry.hpp/.hxx
:
GeometryModel
和GeometryData
结构体,描述和处理机器人几何模型。instance-filter.hpp
:
InstanceFilterBase
,对象筛选的抽象基类。joint-motion-subspace*.hpp
: (
joint-motion-subspace-base.hpp
,joint-motion-subspace-generic.hpp
,joint-motion-subspace.hpp
) 关节运动子空间 S 矩阵的基类、通用实现和聚合。model-item.hpp
:
ModelItem
结构体,模型中具名元素的通用基类。model.hpp/.hxx/.txx
:
ModelTpl
结构体,核心,表示机器人模型的静态信息。sample-models.hpp/.hxx/.txx
: 构建示例机器人模型的函数。
visitor.hpp
: 聚合访问者设计模式相关的头文件 (用于关节)。
joint
(子目录): 核心,定义各种关节类型。
liegroup
(子目录): 李群操作。
pool
(子目录): 对象池,用于并行计算。
visitor
(子目录): 访问者模式相关。
parsers
: 模型文件解析器。geometry.hxx
,
model.hxx
: 构建GeometryModel
和Model
的实现,依赖UrdfVisitor
。types.hpp
: 处理
urdfdom
库智能指针类型的兼容性。utils.hpp
:
urdf::Pose
到pinocchio::SE3
的转换。
geometry.hxx
,
model.hxx
: 构建GeometryModel
和Model
的实现,依赖SdfGraph
和libsdformat
。
geometry.hxx
,
model.hxx
: 构建GeometryModel
和Model
的实现。mjcf-graph.hpp
: MJCF 解析器的核心,
MjcfGraph
类用于管理解析和转换。
meshloader-fwd.hpp
:
MeshLoader
类前向声明和智能指针,处理碰撞库兼容性。mjcf.hpp
: 解析 MJCF 文件的接口。
python.hpp
: 从 Python 脚本加载 Pinocchio 模型。
sample-models.hpp
: (已弃用) 重定向到
multibody/sample-models.hpp
。sdf.hpp
: 解析 SDF 文件的接口。
srdf.hpp/.hxx
: 解析 SRDF (语义信息) 文件的接口和实现。
urdf.hpp
: 解析 URDF 文件的接口。
utils.hpp
: 解析器模块的通用工具 (文件类型检查、资源路径检索)。
mjcf
(子目录): MJCF 解析器具体实现。
sdf
(子目录): SDF 解析器具体实现。
urdf
(子目录): URDF 解析器具体实现。
serialization
: 对象序列化和反序列化 (使用 Boost.Serialization)。aligned-vector.hpp
:
pinocchio::container::aligned_vector
的序列化。archive.hpp
: 辅助函数,用 Boost.Serialization 进行文本、XML、二进制归档。
csv.hpp
: 将 Eigen 矩阵/向量保存为 CSV 文件。
data.hpp
:
DataTpl
的序列化。eigen.hpp
: Eigen 核心数据结构和
pinocchio::Tensor
的序列化。fcl.hpp
:
FakeCollisionGeometry
的条件性空序列化。force.hpp
:
ForceTpl
的序列化。frame.hpp
:
FrameTpl
的序列化。fwd.hpp
: 序列化功能的前向声明和辅助工具。
geometry.hpp
: 几何模型相关核心数据结构 (
CollisionPair
,GeometryObject
,GeometryModel
,GeometryData
) 的序列化。inertia.hpp
:
InertiaTpl
的序列化。joints*.hpp
: (
joints-data.hpp
,joints-model.hpp
,joints-motion-subspace.hpp
,joints-motion.hpp
,joints-transform.hpp
,joints.hpp
) 各种关节数据、模型、运动子空间、运动、变换表示的序列化及聚合。model.hpp
:
ModelTpl
的序列化。motion.hpp
:
MotionTpl
和MotionZeroTpl
的序列化。se3.hpp
:
SE3Tpl
的序列化。serializable.hpp
:
Serializable
CRTP基类,提供统一序列化接口。spatial.hpp
: 聚合空间向量代数相关核心类型的序列化功能。
static-buffer.hpp
:
StaticBuffer
结构体,用于预分配内存的字符缓冲区。symmetric3.hpp
:
Symmetric3Tpl
的序列化。vector.hpp
:
std::vector
(包括std::vector<bool>
) 的 Boost.Serialization 支持和兼容性修复。
spatial
: 空间向量代数。act-on-set.hpp/.hxx
: 将单个空间变换/运动/惯性应用到一组空间力/运动向量。
cartesian-axis.hpp
:
CartesianAxis
类型安全高效地表示和操作笛卡尔坐标轴。classic-acceleration.hpp
: 将空间速度/加速度转换为经典三维点加速度。
explog-quaternion.hpp
: SO(3) (四元数表示) 与 so(3) 间的指数/对数映射及雅可比。
explog.hpp
: SO(3) 和 SE(3) 与其李代数间的指数/对数映射及雅可比/海森。
fcl-pinocchio-conversions.hpp
: (已弃用) 重定向到
collision/
目录下。force*.hpp
: (
force-base.hpp
,force-dense.hpp
,force-ref.hpp
,force-tpl.hpp
,force.hpp
) 空间力向量 (Force
) 的基类、稠密实现、引用实现、核心具体类及聚合。fwd.hpp
: 空间向量代数模块的前向声明和类型定义宏。
inertia.hpp
: 空间惯性 (
InertiaTpl
)、伪惯性 (PseudoInertiaTpl
)、Cholesky对数参数 (LogCholeskyParametersTpl
)。log.hpp/.hxx
: 对数映射及其雅可比的前向声明和具体实现 (SO(3), SE(3))。
motion*.hpp
: (
motion-base.hpp
,motion-dense.hpp
,motion-ref.hpp
,motion-tpl.hpp
,motion-zero.hpp
,motion.hpp
) 空间运动向量 (Motion
) 的基类、稠密实现、引用实现、核心具体类、零运动向量及聚合。se3*.hpp
: (
se3-base.hpp
,se3-tpl.hpp
,se3.hpp
) 三维刚体变换 (SE3
) 的基类、核心具体类及聚合。skew.hpp
: 三维向量的反对称矩阵 (叉积矩阵) 相关操作。
spatial-axis.hpp
:
SpatialAxis
表示六维空间坐标系的基础轴。symmetric3.hpp
:
Symmetric3Tpl
表示和操作 3x3 对称矩阵。
utils
: 通用工具函数。axis-label.hpp
: 根据索引返回笛卡尔坐标轴标签 (X, Y, Z)。
cast.hpp
: 统一接口进行标量类型转换 (兼容Eigen)。
check.hpp
: 条件性检查表达式布尔值 (仅当标量为浮点型)。
eigen-fix.hpp
: Eigen 版本兼容性工具和补丁。
file-explorer.hpp
: 文件和路径探索 (解析环境变量)。
file-io.hpp
:
CsvStream
类,简化向 CSV 文件写入数据。helpers.hpp
:
is_same_type
编译时类型判断。openmp.hpp
: 读取
OMP_NUM_THREADS
环境变量。shared-ptr.hpp
: 比较两个
std::shared_ptr
(考虑所指对象的值)。static-if.hpp
: 运行时条件选择工具 (
if_then_else
)。string-generator.hpp
: 生成随机字母数字字符串。
string.hpp
: 在
std::string
中查找并替换子字符串。timer.hpp
:
PinocchioTicToc
简单计时器 (仿 MATLAB tic/toc)。timer2.hpp
:
Timer
高精度计时器 (基于clock_gettime
)。version.hpp
: Pinocchio 库版本信息相关函数。
visualizers
: 可视化器接口。base-visualizer.hpp
:
BaseVisualizer
抽象基类,为可视化器提供统一接口。
这个总结应该能帮助你快速了解 Pinocchio 源码
include/pinocchio
目录下各个部分的功能。由于内容非常庞大,这个总结仍然比较长,但已经尽可能地提炼了核心信息。example
Gemini 2.5 Pro
examples
目录概述examples
目录提供了大量 C++ 和 Python 脚本,用于演示 Pinocchio 库的各种核心功能和高级应用。这些示例不仅是学习 Pinocchio 如何使用的宝贵资源,也常常作为测试用例,展示库的正确性和灵活性。示例覆盖了机器人建模、运动学、动力学、碰撞检测、可视化、自动微分集成、代码生成等多个方面。目录结构通常包含:
直接在
examples
下的 C++ (.cpp
) 和 Python (.py
) 示例文件。一个顶层的
CMakeLists.txt
文件,用于管理所有 C++ 和 Python 示例的构建和测试配置。多个子目录,通常按特定功能或依赖关系组织,如:
casadi
,
codegen
,cppad
: 演示与自动微分库 (CasADi, CppAD) 及其代码生成 (CppADCodeGen) 功能集成的示例。
以下是各文件和子目录的详细内容总结:
examples
(根目录下的文件)anymal-simulation.py
: 演示 Anymal 四足机器人如何通过迭代求解带接触约束的逆运动学问题,实现降低质心(下蹲)的动作,同时保持四足稳定。
append-urdf-model-with-another-model.py
: 演示加载现有 URDF 模型、程序化构建新模型、将两者合并,并使用 Meshcat 进行可视化。
build-reduced-model.cpp
: 演示如何通过锁定某些关节来构建自由度减少的机器人模型 (Reduced Model)。
build-reduced-model.py
: Python 版本,演示如何从完整模型创建简化模型,支持仅运动学模型、带单个或多个几何模型的情况,并展示了
RobotWrapper.buildReducedRobot
的高级接口。capsule-approximation.py
: 通过优化过程为 URDF 中的碰撞网格找到最小包覆胶囊体,并修改 URDF 文件以使用这些胶囊体,从而简化碰撞检测。
cassie-simulation.py
: 控制 Cassie 双足机器人在满足地面接触和内部闭环约束的同时,调整其质心位置(下蹲),使用基于 KKT 系统求解的迭代控制器。
CMakeLists.txt
: 顶层配置文件,负责管理和构建 Pinocchio 库的 C++ 和 Python 示例,并将它们配置为单元测试,根据配置选项条件性地包含示例和链接库。
collision-with-point-clouds.py
: 演示在机器人末端执行器与表示为高度场的点云之间进行碰撞检测。
collisions.cpp
: 演示标准的机器人碰撞检测流程:加载模型、配置碰撞对 (结合 SRDF)、更新几何体位姿、执行碰撞检测。
collisions.py
: Python 版本,演示类似的碰撞检测流程:加载模型、配置碰撞对、执行碰撞查询。
contact-cholesky.py
: 为 Anymal 机器人在特定配置和接触下,计算 Delassus 矩阵和操作空间惯性矩阵。
display-shapes-meshcat.py
: 使用 Pinocchio 和 HPP-FCL 创建基本 3D 几何形状,并在 Meshcat 可视化器中显示静态场景。
display-shapes.py
: 类似上一个,但使用 Gepetto-viewer 作为可视化后端。
floating-base-velocity-viewer.py
: 创建包含不同类型根关节(自由漂浮、ZYX欧拉角、四元数球形)的单体模型,并在 Meshcat 中观察施加单位速度时的运动,以理解关节参数化和
pin.integrate
。forward-dynamics-derivatives.cpp
: 演示计算机器人前向动力学(给定 q, v, tau,求 ddq)及其偏导数 (∂ddq/∂q, ∂ddq/∂v, ∂ddq/∂τ)。
forward-dynamics-derivatives.py
: Python 版本,演示计算前向动力学及其偏导数。
geometry-models.cpp
: 演示加载机器人模型、进行正向运动学计算,并获取和打印关节及几何体在世界坐标系中的位姿。
geometry-models.py
: Python 版本,演示类似的标准运动学和几何信息处理流程。
gepetto-viewer.py
: 演示加载 Talos 机器人模型,并使用 GepettoVisualizer 在 Gepetto-viewer 中显示,包括在同一查看器中显示同一模型的多个不同配置的实例。
interpolation-SE3.cpp
: 演示在 SE(3) 李群上进行位姿插值。
inverse-dynamics-derivatives.cpp
: 演示计算机器人逆动力学(RNEA:给定 q, v, a,求 tau)及其偏导数 (∂τ/∂q, ∂τ/∂v, ∂τ/∂a)。
inverse-dynamics-derivatives.py
: Python 版本,演示计算逆动力学及其偏导数。
inverse-dynamics.cpp
: 演示使用 RNEA 计算机器人逆动力学的基本流程。
inverse-dynamics.py
: Python 版本,演示使用 RNEA 计算逆动力学。
inverse-kinematics-3d.cpp
: 实现基于雅可比的阻尼最小二乘法,求解使机器人末端执行器达到期望位置的关节配置(迭代逆运动学)。
inverse-kinematics-3d.py
: Python 版本,实现迭代逆运动学,控制末端执行器到达目标位置。
inverse-kinematics.cpp
: 使用迭代优化方法(类似牛顿法/高斯-牛顿法,带阻尼)求解使末端执行器达到目标位姿的逆运动学问题。
inverse-kinematics.py
: Python 版本,实现基于阻尼最小二乘法的迭代逆运动学,使末端执行器达到期望空间姿态。
kinematics-derivatives.cpp
: 演示加载 UR5 模型,计算正运动学一阶和二阶导数(关节速度和加速度对 q, v, a 的偏导数)。
kinematics-derivatives.py
: Python 版本,为随机生成的人形机器人计算特定关节的运动学导数。
meshcat-viewer-dae.py
: 演示使用 MeshCat 加载和可视化机器人模型,展示加载模型、设置初始姿态及显示多实例。
meshcat-viewer-octree.py
: 演示使用 MeshcatVisualizer 显示由 hppfcl 创建的 Octree 障碍物。
meshcat-viewer-solo.py
: 演示在 Meshcat 中可视化 Solo-12 机器人在一个由数学函数定义的起伏地形(HeightField)上。
meshcat-viewer.py
: 演示 Pinocchio 与 Meshcat 结合的高级功能,包括模型加载、多实例显示、自定义几何体(凸包)添加、帧速度可视化和动力学模拟轨迹播放。
mimic_dynamics.py
: 深入探讨仿形关节 (mimic joints) 的处理,演示加载带仿形关节的模型、手动创建,以及 RNEA, CRBA, NLE 算法在这种模型下的工作和验证。
multiprecision.cpp
: 利用 Boost.Multiprecision 在 Pinocchio 中执行多精度浮点数计算(以 RNEA 为例,比较 double 与 cpp_dec_float<100>)。
overview-lie.cpp
: 演示 SE(2) 李群操作:定义元素、计算位姿差(李代数)、通过积分(李指数映射)得到新位姿。
overview-SE3.cpp
: 演示 SE(3) 李群基本操作:归一化、计算位姿差、通过积分得到新位姿。
overview-simple.cpp
: 使用 RNEA 计算简单机械臂的逆动力学(所需关节力矩)。
overview-simple.py
: Python 版本,演示 RNEA 计算简单机械臂的逆动力学。
overview-urdf.cpp
: 从 URDF 加载模型,执行正向运动学,打印随机配置下各关节的全局位置。
overview-urdf.py
: Python 版本,从 URDF 加载模型,执行正向运动学,打印随机配置下各关节的全局位置。
panda3d-viewer-play.py
: 使用 Panda3dVisualizer 加载机器人模型到 Panda3D,播放预定义关节轨迹,并支持录制视频。
panda3d-viewer.py
: 使用 Panda3dVisualizer 在同一个 Panda3D 环境中加载并显示多个不同类型的机器人模型。
parallel.sdf
: 定义一个含平行四边形的串联机械臂模型的 SDF 文件。
reachable-workspace-with-collisions.py
: 计算并可视化机器人在存在障碍物情况下的末端执行器可达工作空间(使用凸包或 Alpha Shape)。
reachable-workspace.py
: 类似上一个,但不考虑障碍物碰撞,在 Meshcat 中可视化工作空间边界。
README.md
: 提供 Pinocchio 示例的概览和运行指南,涵盖模型加载、模拟、解析导数、显示、碰撞检测、多精度算术等。
robot-wrapper-viewer.py
: 使用
RobotWrapper
加载模型,并根据命令行参数选择 GepettoVisualizer 或 MeshcatVisualizer 显示。run-algo-in-parallel.py
: 演示利用 Pinocchio 的并行计算能力进行批量的逆动力学 (RNEA) 和前向动力学 (ABA) 计算。
rviz-viewer.py
: 使用 RVizVisualizer 将机器人模型加载到 ROS RViz 中,并显示不同关节构型,包括多个机器人实例。
sample-model-viewer.py
: 将内置人形机器人模型加载到不同的 3D 可视化工具 (GepettoViewer, Meshcat, RViz) 中,并显示不同姿态。
simulation-closed-kinematic-chains.py
: 演示对具有闭环约束的机器人系统(如四杆机构)进行建模、求解初始构型、动态仿真和可视化。
simulation-contact-dynamics.py
: 模拟双足机器人 (Talos) 在刚性接触约束和姿态控制器下的受约束动力学,并在 Meshcat 中可视化。
simulation-inverted-pendulum.py
: 手动构建多节摆模型,使用 Pinocchio 进行前向动力学模拟,并通过 GepettoViewer 可视化。
simulation-pendulum.py
: 构建多节摆模型(可选带小车形成倒立摆),进行前向动力学模拟,并通过 Meshcat 可视化。
static-contact-dynamics.py
: 计算多足机器人 (Solo12) 在给定站立构型下维持静止所需的接触力和关节力矩,基于牛顿-欧拉方程分解。
talos-simulation.py
: 利用 Pinocchio 在刚性接触约束下,迭代求解质心跟踪和姿态问题,可视化 Talos 的“下蹲”运动。
update-model-after-urdf.py
: 演示加载模型后动态修改其运动学参数(如连杆长度),通过直接修改关节位姿实现。
examples/casadi
子目录CMakeLists.txt
: 根据编译选项条件性地将与 CasADi 相关的 C++ 和 Python 示例添加到构建系统。
cartpole.py
: 结合 Pinocchio 和 CasADi 构建符号化的倒立摆动力学模型,进行离散时间动力学仿真和可视化。
casadi-aba.cpp
: 演示将 Pinocchio 的前向动力学 (ABA) 转换为 CasADi 符号函数,用数值评估并与标准 Pinocchio 结果比较。
casadi-crba.cpp
: 演示将 Pinocchio 的复合刚体算法 (CRBA) 转换为 CasADi 符号函数,用数值评估并与标准 Pinocchio 结果比较。
casadi-rnea.cpp
: 演示将 Pinocchio 的逆动力学 (RNEA) 转换为 CasADi 符号函数,用数值评估并与标准 Pinocchio 结果比较。
quadrotor-ocp.py
: 使用 Pinocchio 和 CasADi 定义和解决四旋翼无人机的最优控制问题 (OCP),驱动无人机到目标状态,最小化控制输入和状态误差。
simulation-pendulum-variational.ipynb
: 深入探讨变分积分器,并使用 Pinocchio 和 CasADi 实现一个摆锤的变分积分器,与半隐式欧拉积分器比较能量守恒性。
examples/codegen
子目录CMakeLists.txt
: 配置和管理与 CppADCodeGen 代码生成相关的 C++ 和 Python 示例的构建与测试。
codegen-crba.cpp
: 演示使用 CppADCodeGen 为机器人模型的 CRBA 生成高效 C++ 代码,加载并执行生成的代码,与标准 Pinocchio CRBA 比较。
codegen-rnea.cpp
: 利用 CppAD 的自动微分和代码生成功能,为 Pinocchio 模型的 RNEA 生成 C++ 符号代码,并将其雅可比编译成独立的 C 代码。
codegen-rnea.py
: Python 版本,利用 pycppad 为 Pinocchio 模型的 RNEA 雅可比自动生成 C++ 源代码。
examples/cppad
子目录CMakeLists.txt
: 配置和管理与 CppAD 自动微分功能相关的 C++ 和 Python 示例的构建与测试。
autodiff-rnea.cpp
: 使用 CppAD 计算 Pinocchio 模型 RNEA 对关节速度的导数,并与 Pinocchio 解析导数比较。
autodiff-rnea.py
: Python 版本,使用 pycppad 计算 RNEA 关节力矩对关节速度的导数,并与 Pinocchio 解析导数比较。
这个总结应该能帮助你快速了解
examples
目录中各个脚本和代码片段的主要目的和演示内容。这些示例是学习和掌握 Pinocchio 强大功能的绝佳途径。deepseek
Pinocchio 源码
example
目录总结1. 基础运动学与动力学
inverse-dynamics.cpp/py
:使用递归牛顿-欧拉算法(RNEA)计算逆动力学(关节力矩)。
forward-dynamics-derivatives.cpp/py
:计算前向动力学(关节加速度)的偏导数(∂ddq/∂q, ∂ddq/∂v, ∂ddq/∂τ)。
inverse-dynamics-derivatives.cpp/py
:计算逆动力学(关节力矩)的偏导数(∂τ/∂q, ∂τ/∂v, ∂τ/∂a)。
kinematics-derivatives.cpp/py
:计算关节运动学(位置/速度/加速度)的导数。
overview-simple.cpp/py
:简单机械臂的逆动力学演示。
overview-urdf.cpp/py
:加载URDF模型并执行正向运动学计算。
2. 碰撞检测
collisions.cpp/py
:加载机器人模型,执行碰撞检测(支持SRDF排除碰撞对)。
collision-with-point-clouds.py
:将点云转换为高度场,检测机器人末端与环境的碰撞。
capsule-approximation.py
:将URDF中的网格碰撞体替换为优化的胶囊体近似,提升检测效率。
3. 模型构建与简化
build-reduced-model.cpp/py
:通过锁定关节自由度构建简化模型。
update-model-after-urdf.py
:动态修改URDF模型参数(如调整连杆长度)。
append-urdf-model-with-another-model.py
:合并URDF模型或程序化构建新模型。
4. 可视化
gepetto-viewer.py
:使用Gepetto-viewer显示机器人(支持多实例)。
meshcat-viewer.py
:使用MeshCat显示机器人、自定义几何体及运动轨迹。
rviz-viewer.py
:在RViz中可视化机器人模型。
display-shapes.py
:在Gepetto-viewer中显示基本几何体(球体/胶囊体等)。
display-shapes-meshcat.py
:在MeshCat中显示基本几何体。
5. 仿真与控制
anymal-simulation.py
:控制四足机器人(ANYmal)执行下蹲动作(满足接触约束)。
cassie-simulation.py
:控制双足机器人(Cassie)下蹲并保持脚部接触。
talos-simulation.py
:模拟双足机器人(Talos)在接触约束下的质心跟踪。
simulation-inverted-pendulum.py
:构建多节摆模型并仿真摆动。
simulation-contact-dynamics.py
:模拟双足机器人受约束动力学(结合PD控制)。
simulation-closed-kinematic-chains.py
:建模闭环机构(如四杆机构)并仿真。
6. 高级算法与应用
inverse-kinematics.cpp/py
:基于阻尼最小二乘法的迭代逆运动学(IK)求解。
contact-cholesky.py
:计算接触动力学关键矩阵(如Delassus矩阵)。
static-contact-dynamics.py
:计算机器人静态平衡所需的接触力与关节力矩。
reachable-workspace.py
:计算机器人末端可达工作空间(凸包或Alpha Shape)。
reachable-workspace-with-collisions.py
:在障碍物环境下计算机器人可达工作空间。
floating-base-velocity-viewer.py
:可视化不同类型根关节(自由漂浮/球关节)的速度运动。
7. 自动微分与代码生成
casadi
子目录:结合CasADi进行符号计算与优化。
cartpole.py
:符号化倒立摆模型并仿真。
quadrotor-ocp.py
:求解四旋翼无人机最优控制问题(OCP)。
casadi-aba/crba/rnea.cpp
:将ABA/CRBA/RNEA转换为CasADi符号函数。
codegen
子目录:利用CppADCodeGen生成高效代码。
codegen-rnea.cpp/py
:为RNEA的雅可比矩阵生成C++代码。
codegen-crba.cpp
:为CRBA生成优化代码。
cppad
子目录:使用CppAD实现自动微分。
autodiff-rnea.cpp/py
:验证RNEA对关节速度的导数。
8. 其他工具与示例
CMakeLists.txt
:管理C++/Python示例的构建与测试。
README.md
:提供示例概览和运行指南。
multiprecision.cpp
:使用Boost.Multiprecision进行高精度动力学计算。
overview-lie.cpp
:演示SE(2)李群操作(差值/积分)。
overview-SE3.cpp
:演示SE(3)李群操作(位姿差值/积分)。
robot-wrapper-viewer.py
:通过
RobotWrapper
加载模型并选择可视化后端。run-algo-in-parallel.py
:利用多线程批量计算逆/前向动力学。
关键特点
- 多语言支持
:C++与Python示例并存,覆盖相同功能。
- 可视化多样性
:支持Gepetto-viewer、MeshCat、RViz、Panda3D等多种后端。
- 高级应用
:涵盖接触动力学、工作空间分析、闭环机构仿真等复杂场景。
- 性能优化
:通过自动微分(CasADi/CppAD)和代码生成提升计算效率。
- 模块化设计
:示例按功能分类,便于快速定位所需算法或应用场景。
utils
copilot
下面是对 Pinocchio 源码中
utils
目录内容的详细总结:
1. CMakeLists.txt
主要作用
此文件定义了如何构建和安装 Pinocchio 项目中的辅助工具程序(utilities),包括管理工具构建和安装的一整套规则和宏。模块化和条件化构建实践
文件中展示了 CMake 在大型项目中如何实现模块化和条件化构建,这不仅提高了项目的灵活性,也便于后续维护和扩展。关键选项与宏
- BUILD_UTILS
:该选项允许用户自主决定是否编译这些辅助工具,提供了灵活性。
- ADD_UTIL 宏
:它简化了开发者为辅助工具程序添加构建目标的过程,使得添加新工具或管理现有工具时减少重复代码。
- BUILD_UTILS
外部依赖条件的处理
例如,通过添加pinocchio_read_model
工具,文件展示了如何根据外部依赖(如 URDF 解析相关依赖)的存在与否,智能地包含特定的构建目标。
2. pinocchio_read_model.cpp
核心功能
该程序主要用于解析机器人模型文件(目前主要支持 URDF 格式),将模型加载到 Pinocchio 的Model
对象中。通过这个工具,用户可以直观了解 Pinocchio 如何读取和解析机器人描述文件。示例与测试角色
作为一个基本示例或测试程序,它演示了如何利用 Pinocchio C++ 库从文件加载机器人模型,从而验证解析器功能的正确性与稳定性。编译条件依赖
程序结构简单、清晰,主要展示了加载模型的基本流程,同时也突出了对PINOCCHIO_WITH_URDFDOM
编译选项的依赖,强调了编译配置与实际功能实现之间的关联性。
总结
总体来看,
utils
目录展示了 Pinocchio 项目在辅助工具构建方面的优秀工程实践。- CMakeLists.txt
部分通过灵活的构建选项和自定义宏,简化了大型项目中辅助程序的构建与安装过程;
- pinocchio_read_model.cpp
则作为一个典型的命令行工具,不仅帮助开发者理解如何从 URDF 文件加载机器人模型,也为调试解析过程提供了有效的示例。
这一设计不仅方便用户验证和测试 Pinocchio 的核心功能,也为开发者展示了如何高效地管理和扩展辅助工具,是大型 C++ 项目中模块化构建的一个典范。
deepseek
Pinocchio 源码中
utils
目录总结1.
CMakeLists.txt
- 核心作用
:管理辅助工具程序的构建和安装流程。
- 关键特性
:
- 条件化构建
:通过
BUILD_UTILS
选项控制是否编译工具程序,提供用户灵活性。 - 模块化宏
:定义
ADD_UTIL
宏简化工具添加流程,自动处理编译、链接和安装规则。 - 依赖管理
:根据
PINOCCHIO_WITH_URDFDOM
条件决定是否构建pinocchio_read_model
工具。 - 安装配置
:自动将生成的可执行文件安装到
bin
目录。
- 条件化构建
- 工程实践
:
体现 CMake 在大型项目中的模块化设计,支持按需构建和跨平台兼容性。
2.
pinocchio_read_model.cpp
- 功能
:从 URDF 文件加载机器人模型到 Pinocchio 的
Model
对象。 - 工作流程
:
解析命令行输入的模型文件路径。
调用
pinocchio::urdf::buildModel()
加载模型。输出模型基本信息(名称、关节数、自由度等)。
- 依赖项
:
必须启用
PINOCCHIO_WITH_URDFDOM
编译选项(依赖 URDFDOM 库)。
- 定位
:
- 功能示例
:展示 Pinocchio 模型加载的最小化 C++ 实现。
- 调试工具
:验证模型文件解析正确性。
- 功能示例
- 代码特点
:
结构简洁(约 50 行),聚焦核心 API 使用,适合作为开发模板。
目录整体角色
- 工具集
:提供实用命令行工具(当前以模型解析为核心)。
- 开发示例
:演示 Pinocchio 关键功能(如模型加载)的规范用法。
- 工程化设计
:
通过 CMake 实现工具链的灵活管理。
强调编译时条件控制,适配不同用户环境。
- 扩展性
:
ADD_UTIL
宏支持快速集成新工具。
unittest
Gemini 2.5 Pro
unittest
目录概述unittest
目录是 Pinocchio 库的核心测试套件,包含了针对库中几乎所有功能模块的单元测试。这些测试旨在确保算法的正确性、数值稳定性、API 的一致性、以及与其他库(如 FCL、CasADi、CppAD)集成的可靠性。测试方法多样,包括与解析解比较、与有限差分法比较、与不同算法的等效结果比较、特性验证、以及代码生成验证等。目录结构通常包含:
直接在
unittest
下的 C++ 单元测试文件 (.cpp
)。一个顶层的
CMakeLists.txt
文件,用于管理所有 C++ 单元测试的构建。多个子目录,通常按功能或依赖关系组织,如:
algorithm
: 针对特定底层算法或工具函数的测试。
casadi
,
cppad
,cppadcg
: 针对与自动微分库 (CasADi, CppAD) 及其代码生成 (CppADCodeGen) 集成的测试。models
: 存放用于测试的机器人模型文件 (URDF, MJCF)。
packaging
: 演示和测试 Pinocchio 作为外部库被其他项目使用的示例。
python
: 针对 Pinocchio Python 绑定的测试。
utils
: 包含测试辅助宏和模型生成工具。
以下是各文件和子目录的详细内容总结:
unittest
(根目录下的文件)aba-derivatives.cpp
: 验证铰接体算法 (ABA) 导数的计算,通过与参考算法、有限差分法比较,确保 ∂(ddq)/∂q, ∂(ddq)/∂v, ∂(ddq)/∂tau 的准确性。
aba.cpp
: 测试 ABA 算法本身及质量矩阵逆
computeMinverse
的计算,覆盖不同关节模型和计算条件。algo-check.cpp
: 测试模型 (Model) 和数据 (Data) 对象的检查器 (Checker) 功能,确保模型和数据满足算法要求或物理一致性。
all-joints.cpp
: 通过元编程测试各种关节模型 (JointModel) 的基础属性、操作和元编程方面,如初始化、比较、数据显示。
broadphase.cpp
: 测试宽相碰撞检测管理器 (BroadPhaseManager) 的功能,验证其在减少精确碰撞检测计算量方面的正确性和效率。
cartesian-product-liegroups.cpp
: 测试基于
boost::variant
的李群笛卡尔积,确保其能正确组合不同类型的李群并保持行为一致性。center-of-mass-derivatives.cpp
: 测试机器人质心速度关于关节位置的偏导数 (∂v_com / ∂q) 的计算,通过与有限差分法对比验证。
centroidal-derivatives.cpp
: 测试质心动力学导数(质心动量 h 及其时间变化率 ḣ 对 q, v, a 的偏导数)的计算,通过直接计算、有限差分和与 RNEA/ABA 导数比较进行验证。
centroidal.cpp
: 测试质心动力学相关算法,如 ccrba, dccrba, computeCentroidalMap 等,通过与基础算法比较、内部一致性检查和有限差分验证。
cholesky.cpp
: 测试关节空间惯性矩阵 M 的 Cholesky 分解 (UDU^T) 及其相关操作的正确性和效率。
classic-acceleration.cpp
: 测试经典加速度 (位置的二阶时间导数) 的计算函数
pinocchio::classicAcceleration
,通过有限差分和不同坐标系下的等效计算验证。closed-loop-dynamics.cpp
: 测试基于接触动力学的算法处理闭环约束的情况,通过与 KKT 系统求解方法和有限差分验证约束误差。
CMakeLists.txt
: 顶层配置文件,负责定义如何构建和组织 Pinocchio 的所有 C++ 单元测试。
com.cpp
: 测试质心运动学、雅可比以及子树质量、质心和质心雅可比相关算法,通过与其他算法结果对比和有限差分法验证。
compute-all-terms.cpp
: 测试
computeAllTerms
函数,该函数一次性计算几乎所有主要的运动学和动力学量,通过与独立底层算法结果对比验证。constrained-dynamics-derivatives.cpp
: 测试带单个接触约束的正向动力学及其导数(旧版 API),通过有限差分法和解析导数比较。
constrained-dynamics.cpp
: 测试带接触/约束的动力学算法,重点是
constraintDynamics
(KKT) 和contactABA
,确保在各种条件下计算正确的 ddq 和接触力。constraint-variants.cpp
: 测试通用约束接口 (ConstraintModelVariant, ConstraintData) 和访问者模式,确保能统一处理不同类型的约束。
contact-cholesky.cpp
: 测试带接触约束的 Cholesky 分解 (ContactCholeskyDecomposition),用于高效分解 KKT 矩阵和相关运算。
contact-dynamics-derivatives.cpp
: 测试受约束动力学导数
computeConstraintDynamicsDerivatives
,计算 ddq 和 lambda_c 对 q, v, tau 的偏导数,通过与 ABA 导数、解析推导和有限差分验证。contact-dynamics.cpp
: 测试旧版接触动力学 API(
forwardDynamics
和impulseDynamics
)以及相关的 KKT 矩阵求逆工具。contact-inverse-dynamics.cpp
: 初步测试接触逆动力学
contactInverseDynamics
算法(计算满足约束和期望加速度的力矩和接触力)。contact-models.cpp
: 测试刚性约束模型 (RigidConstraintModel) 及其雅可比计算和稀疏性,关注不同变种、参考系和接触类型。
copy.cpp
: 测试
pinocchio::copy
函数,用于在两个 Data 对象之间有选择地复制不同阶次的运动学数据。coulomb-friction-cone.cpp
: 测试库仑摩擦锥及其对偶锥的投影操作,验证投影结果的内部性、幂等性等特性。
crba.cpp
: 测试复合刚体算法 (CRBA) 计算关节空间惯性矩阵 M(q),通过数值验证、特性一致性、物理效应和内存分配测试。
csv.cpp
: 基础测试 Eigen 矩阵序列化到 CSV 文件的功能。
data.cpp
: 测试
pinocchio::Data
结构内部成员变量和相关特性,如支持稀疏算法和模仿关节的辅助数据结构。delassus.cpp
: 测试 Delassus 算子及其带阻尼的逆矩阵 (G + μI)⁻¹ 的计算,通过与完整 KKT 矩阵逆的计算结果比较。
eigen-basic-op.cpp
: 测试矩阵乘法相关的类型特性 (type traits),确保能正确推断 Eigen 表达式模板的结果类型。
eigen-tensor.cpp
: 测试自定义 N 阶张量类
pinocchio::Tensor
的基本操作,作为 Eigen 的补充。eigenvalues.cpp
: 测试计算对称矩阵最大特征值及其对应特征向量的幂迭代法。
energy.cpp
: 测试机器人机械能(动能、势能、总机械能)计算算法,通过与经典公式或基础算法结果比较。
explog.cpp
: 测试李群和李代数之间的指数/对数映射 (exp/log) 及其雅可比 (Jexp, Jlog) 和二阶导数 (Hessian 作用),主要针对 SO(3) 和 SE(3)。
finite-differences.cpp
: 通过有限差分法测试关节运动子空间 S 和关节雅可比的解析计算。
frames-derivatives.cpp
: 测试操作坐标系运动学导数(速度和加速度对 q, v, a_joint 的偏导数),通过与雅可比理论关系和有限差分法验证。
frames.cpp
: 测试操作坐标系的运动学计算(位姿、速度、加速度、雅可比及其导数、支撑惯性、力等)。
fusion.cpp
: 实验性测试,探索 Boost.Fusion、CRTP 和 Boost.Variant 结合实现静态多态函数分发。
geometry-algorithms.cpp
: 测试几何模型/数据相关的碰撞和距离计算算法,包括从手动构建到从 URDF 加载。
geometry-model.cpp
: 测试几何模型中碰撞对的管理、几何数据中碰撞相关状态的设置以及 GeometryModel 的克隆。
geometry-object.cpp
: 测试
pinocchio::GeometryObject
类的clone()
方法,特别是深拷贝行为。gram-schmidt-orthonormalisation.cpp
: 测试
pinocchio::orthonormalisation
函数,将向量相对于一个子空间进行正交化。impulse-dynamics-derivatives.cpp
: 测试冲量动力学导数
computeImpulseDynamicsDerivatives
(碰撞后速度和冲量对碰撞前状态的导数),通过与理论关系和有限差分验证。impulse-dynamics.cpp
: 测试利用稀疏代数的冲量动力学算法
impulseDynamics
,通过与旧版 API 比较和物理方程验证。joint-composite.cpp
: 测试复合关节模型 (JointModelComposite) 的构造、计算、与等效基础关节的一致性、拷贝、递归组合等。
joint-configurations.cpp
: 测试关节配置空间上的李群操作 (integrate, difference, dIntegrate, dDifference, random, normalize) 及其导数。
joint-free-flyer.cpp
: 基础测试自由浮动关节 (FreeFlyer Joint) 的运动子空间。
joint-generic.cpp
: 测试通用关节接口 (JointModel, JointData) 对各种具体关节类型的封装和操作。
joint-helical.cpp
: 测试标准轴向和非对齐轴螺旋关节的运动学和动力学实现。
joint-jacobian.cpp
: 测试关节雅可比及其时间导数的计算,覆盖不同参考坐标系和模型类型。
joint-mimic.cpp
: 测试模仿关节 (JointModelMimic) 及其运动学行为(由主导关节决定)。
joint-motion-subspace.cpp
: 测试关节运动子空间 S 矩阵的各种代数运算。
joint-planar.cpp
: 测试平面关节 (JointModelPlanar) 的运动学和动力学,通过与受限的自由浮动关节比较。
joint-prismatic.cpp
: 测试标准轴向和非对齐轴移动关节的运动学和动力学实现。
joint-revolute.cpp
: 测试各种旋转关节类型(有界、无界、标准轴、非对齐轴)的运动学和动力学实现。
joint-spherical.cpp
: 测试球形关节 (JointModelSpherical - 四元数, JointModelSphericalZYX - ZYX欧拉角) 的运动学和部分动力学。
joint-translation.cpp
: 测试三维平移关节 (JointModelTranslation) 的运动学和动力学。
joint-universal.cpp
: 测试万向节 (JointModelUniversal) 的运动学和动力学,通过与等效复合关节比较。
kinematics-derivatives.cpp
: 测试关节本身运动学导数(速度和加速度对 q, v, a_joint 的偏导数)和二阶导数 (Hessian)。
kinematics.cpp
: 测试基础运动学计算、API 使用及特殊模型(如带模仿关节)的处理。
lanczos-decomposition.cpp
: 测试 Lanczos 分解算法
LanczosDecompositionTpl
将对称矩阵三对角化的功能。liegroups.cpp
: 广泛测试各种李群 (SO(2), SO(3), SE(2), SE(3), R^n, 笛卡尔积) 及其相关操作的正确性。
macros.cpp
: 测试
PINOCCHIO_CHECK_ARGUMENT_SIZE
宏,用于检查输入参数大小并抛出异常。mjcf.cpp
: 测试 MJCF (MuJoCo XML Format) 解析器功能,覆盖惯性、几何、姿态、默认类、路径、关节、关键帧等。
model.cpp
: 测试
pinocchio::Model
类及其相关算法(构建、修改、查询、拼接、降阶、处理模仿关节)。multiprecision-mpfr.cpp
: 验证核心算法在使用 MPFR 高精度浮点数时的正确性和一致性。
multiprecision.cpp
: 验证核心算法在使用 Boost.Multiprecision 的
cpp_dec_float_100
十进制高精度浮点数时的正确性和一致性。parallel-aba.cpp
: 验证并行版本的 ABA 算法 (
abaInParallel
) 的正确性。parallel-geometry.cpp
: 测试并行碰撞检测接口 (GeometryPool, BroadPhaseManagerPool) 的正确性、鲁棒性及与 HPP-FCL 的集成。
parallel-rnea.cpp
: 验证并行版本的 RNEA 算法 (
rneaInParallel
) 的正确性。pv-solver.cpp
: 测试约束动力学算法,比较
constraintDynamics
,pv
(Proximal Variables), 和constrainedABA
在不同接触场景下的结果。python_parser.cpp
: 测试通过 Python 解析器接口
pinocchio::python::buildModel
从 Python 脚本构建机器人模型的功能。quaternion.cpp
: 测试四元数相关操作:从旋转矩阵创建、生成随机单位四元数、判断是否规范化。
reachable-workspace.cpp
: 测试可达工作空间计算算法的内部函数、核心流程及在有无碰撞环境下的表现。
regressor.cpp
: 测试动力学回归量计算功能,用于将动力学方程表示为已知运动学量与未知惯性参数的线性乘积。
rnea-derivatives.cpp
: 测试 RNEA 及其导数功能,计算广义力矩(重力、静态、完整动力学)及其对 q, v, a 的偏导数。
rnea-second-order-derivatives.cpp
: 测试 RNEA 二阶导数
ComputeRNEASecondOrderDerivatives
,计算 τ 对 q, v, a 的所有二阶偏导数。rnea.cpp
: 测试 RNEA 及其相关动力学计算,包括有无外部力/armature,并与 CRBA、雅可比等比较,特别测试模仿关节。
rotation.cpp
: 测试旋转表示和操作:从轴角构造旋转矩阵、将矩阵正交投影到 SO(3)。
rpy.cpp
: 测试 RPY 角与旋转矩阵的转换,以及 RPY 角速度与角速度转换的雅可比及其逆和时间导数。
sample-models.cpp
: 测试示例模型构建函数 (
pinocchio::buildModels::...
),验证能否正确构建并检查基本属性。sdf.cpp
: 测试 SDF (Simulation Description Format) 解析器功能,从 SDF 构建 Model 和 GeometryModel 并验证属性。
serialization.cpp
: 全面测试核心数据结构 (Model, Data, Frame, SE3, Motion, Eigen 类型等) 到文本、XML、二进制格式的序列化和反序列化。
sincos.cpp
: 测试
pinocchio::SINCOS
函数,同时计算角度的正弦和余弦值。spatial.cpp
: 全面测试空间向量代数核心类型 (SE3, Motion, Force, Inertia) 及其操作和辅助类型。
srdf.cpp
: 测试 SRDF (Semantic Robot Description Format) 解析器,提取禁用碰撞对、参考姿态、电机参数等语义信息。
symmetric.cpp
: 测试和比较处理 3x3 对称矩阵的方法,特别是
pinocchio::Symmetric3
类。tree-broadphase.cpp
: 测试基于树的宽阶段碰撞检测管理器
TreeBroadPhaseManagerTpl
(使用 hpp::fcl::DynamicAABBTreeCollisionManager 后端)。tridiagonal-matrix.cpp
: 测试对称三对角矩阵模板类
TridiagonalSymmetricMatrixTpl
及其逆矩阵类的功能。urdf.cpp
: 测试 URDF 解析器,从 URDF 文件或 XML 字符串构建 Model 和 GeometryModel 的各种场景。
value.cpp
: 测试 RNEA 算法的正确性,将其计算的关节力矩与预定义的期望值比较。
vector.cpp
: 测试
isNormalized
函数,判断 Eigen 向量是否已归一化。version.cpp
: 测试版本信息相关的宏和函数 (
checkVersionAtLeast
)。visitor.cpp
: 测试基于 Boost.Fusion 和访问者模式实现的关节操作分发机制。
visualizer.cpp
: 测试可视化器基类
BaseVisualizer
在构造时处理 Data 和 GeometryData 对象所有权的问题。
unittest/algorithm
子目录CMakeLists.txt
: 包含
utils
子目录到构建项目。utils
子目录:
CMakeLists.txt
: 使用
add_pinocchio_unit_test
宏添加和管理force.cpp
和motion.cpp
的单元测试。force.cpp
: 测试力向量
pinocchio::Force
的参考系变换函数changeReferenceFrame
。motion.cpp
: 测试运动向量
pinocchio::Motion
的参考系变换函数changeReferenceFrame
。
unittest/casadi
子目录CMakeLists.txt
: 管理与 CasADi 自动微分库集成的单元测试,提供条件构建和简化的测试添加宏。
aba-derivatives.cpp
: 验证 Pinocchio ABA 导数与通过 CasADi 自动微分得到的结果的一致性。
aba.cpp
: 测试 Pinocchio ABA 及其导数计算与 CasADi 自动微分的集成。
algorithms.cpp
: 测试 Pinocchio 核心算法 (运动学, RNEA, ABA, CRBA 等) 与 CasADi 自动微分的集成,比较符号计算与数值计算结果。
basic.cpp
: 测试和演示 Pinocchio 与 CasADi 的数据传递、符号矩阵运算及自动微分。
casadi-utils.hpp
: 提供 Eigen 矩阵/Pinocchio SE3 与 CasADi DM 类型之间转换的工具函数。
constraint-dynamics-derivatives.cpp
: 验证约束动力学算法及其导数与 CasADi 自动微分结果的一致性。
constraint-dynamics.cpp
: 验证约束动力学算法及其导数与 CasADi 自动微分结果的一致性(与上一个类似,可能侧重点或测试模型不同)。
explog.cpp
: 测试在 CasADi 符号层面执行 Pinocchio 的关节空间操作和 SE(3) 空间操作 (exp/log) 及其导数。
integrate-derivatives.cpp
: 测试
pinocchio::integrate
函数在与 CasADi 集成时的行为和正确性。joints.cpp
: 全面测试各种关节模型的运动学计算在与 CasADi 集成时的正确性。
rnea-derivatives.cpp
: 验证 RNEA 及其导数计算与 CasADi 自动微分结果的一致性,测试直接求导和特化函数。
spatial.cpp
: 测试空间代数 (SE(3), Motion) 和李群/李代数操作 (四元数, SO(3) exp/log) 在与 CasADi 集成时的行为。
unittest/cppad
子目录CMakeLists.txt
: 管理与 CppAD 自动微分库集成的单元测试,结构类似 CasADi 的 CMake 文件。
algorithms.cpp
: 测试 Pinocchio 核心算法 (CRBA, RNEA, ABA, 雅可比) 与 CppAD 的集成,验证导数计算和 JIT 功能。
basic.cpp
: 测试 CppAD 基本功能、与 Eigen 的结合以及与 Pinocchio 数学函数的互操作性。
derivatives.cpp
: 测试 RNEA 和 ABA 算法的导数计算与通过 CppAD 自动微分得到的结果的一致性。
joint-configurations.cpp
: 测试关节配置空间操作 (integrate, difference, dDifference) 与 CppAD 集成的行为和正确性。
joints.cpp
: 验证各种关节模型运动学计算(位姿、速度、S矩阵)在使用 CppAD 进行自动微分时的正确性。
spatial.cpp
: 验证 SE(3) 的指数/对数映射及其雅可比在 CppAD 自动微分环境下的正确性。
unittest/cppadcg
子目录CMakeLists.txt
: 配置和添加基于 CppADCodeGen (从 CppAD tape 生成 C++ 代码) 的单元测试。
algorithms.cpp
: 验证通过 CppADCodeGen 将 RNEA 转换为可执行 C++ 代码,并验证生成代码(特别是雅可比/质量矩阵)的正确性。
basic.cpp
: 测试 CppADCodeGen 基本功能、与 Eigen 的兼容性、Pinocchio 对象在不同 CppAD 标量类型间转换,以及编译生成代码为动态库的流程。
contact-dynamics.cpp
: 验证
pinocchio::constraintDynamics
算法通过 CppADCodeGen 生成的 C++ 代码的正确性。joint-configurations.cpp
: 验证关节配置相关算法 (integrate, difference, dDifference) 通过 CppADCodeGen 生成的 C++ 代码的正确性。
unittest/models
子目录3DOF_planar.urdf
: 描述一个3自由度平面移动机器人模型。
closed_chain.xml
: Agility Robotics Cassie 双足机器人的 MJCF 模型,包含并联机构和闭环链。
link_and_joint_identical_name.urdf
: 一个连杆和关节同名的 URDF,用于测试解析器处理命名冲突。
test_composite.xml
: 简单的 MJCF 模型,演示复合关节或多关节连接。
test_mjcf.urdf
: 简单的两自由度串联机器人 (旋转+移动),连杆无质量,用于运动学测试。
test_mjcf.xml
: 展示 MuJoCo 默认类别系统和等式约束的 MJCF 模型,可能包含冗余或冲突定义用于测试编译器。
unittest/packaging
子目录load_urdf.cpp
: 简单 C++ 程序,演示如何用 Pinocchio 从 URDF 加载模型。
run_rnea.cpp
: 简单 C++ 程序,演示如何用 Pinocchio 执行 RNEA(逆动力学)计算。
cmake
子目录:
CMakeLists.txt
: 配置一个依赖 Pinocchio 的示例 C++ 项目 (ExtraLib),使用
find_package
查找 Pinocchio。
external
子目录:
CMakeLists.txt
: 配置一个依赖 Pinocchio 的示例 C++ 项目 (ExtraLib),使用 CMake
FetchContent
动态下载和构建 Pinocchio。
pinocchio_header
子目录:
CMakeLists.txt
: 配置一个依赖 Pinocchio 的示例 C++ 项目 (ExtraLib),构建
run_fk
。run_fk.cpp
: 演示如何用 Pinocchio 执行 ABA(正向动力学)计算。
pkgconfig
子目录:
CMakeLists.txt
: 配置一个依赖 Pinocchio 的示例 C++ 项目 (ExtraLib),使用
pkg-config
查找 Pinocchio。
unittest/python
子目录CMakeLists.txt
: Python 单元测试系统的核心配置文件,自动化测试发现、C++扩展构建、环境设置和条件包含。
bindings.py
: 测试 Pinocchio 核心数据结构 (SE3, Motion, Force, Inertia) 的 Python 绑定。
bindings_aba.py
: 测试关节体算法 (ABA) 相关功能的 Python 绑定。
bindings_build_geom_from_urdf_memorycheck.py
: 测试从 URDF 加载几何模型
pin.buildGeomFromUrdf
,可能辅助内存检查。bindings_build_geom_from_urdf_memorycheck.supp
: Valgrind Memcheck 抑制文件,用于忽略已知或无关的内存问题报告。
bindings_centroidal_dynamics_derivatives.py
: 测试质心动力学导数计算的 Python 绑定。
bindings_com.py
: 测试质心 (CoM) 相关计算(总质量、子树质量、位置、速度、加速度、雅可比)的 Python 绑定。
bindings_com_velocity_derivatives.py
: 验证质心速度关于关节配置的导数 (dVCoM/dq) 计算的 Python 绑定。
bindings_contact_inverse_dynamics.py
: 测试带接触约束的逆动力学
pin.contactInverseDynamics
的 Python 绑定,特别是对不同输入集合类型的处理。bindings_data.py
: 测试
pin.Data
对象在 Python 中的基本操作(复制、索引访问、序列化)。bindings_dynamics.py
: 测试正向动力学 (
pin.forwardDynamics
) 和冲击动力学 (pin.impulseDynamics
) 的 Python 绑定。bindings_fcl_transform.py
: 测试 Pinocchio SE3 与 HPP-FCL Transform3f 之间的变换转换功能。
bindings_force.py
: 全面测试
pin.Force
对象(空间力/力矩)的 Python 绑定。bindings_forward_dynamics_derivatives.py
: 测试 ABA 导数计算
pin.computeABADerivatives
的 Python 绑定。bindings_frame.py
: 全面测试 Frame(坐标系)对象相关的 Python 绑定和核心运动学/雅可比算法。
bindings_frame_derivatives.py
: 扩展
bindings_frame.py
,专注测试 Frame 运动学导数获取函数的 Python 绑定。bindings_geometry_model.py
: 测试
pin.CollisionPair
对象的相等性比较和复制操作的 Python 绑定。bindings_geometry_model_urdf.py
: 测试从 URDF 加载几何模型,特别是 mesh 路径解析和不同加载 API。
bindings_geometry_object.py
: 测试几何对象 (
pin.GeometryObject
) 及其容器 (pin.GeometryModel
,pin.GeometryData
) 的 Python 绑定。bindings_inertia.py
: 全面测试
pin.Inertia
(空间刚体惯性)对象及其参数化方法的 Python 绑定。bindings_inverse_dynamics_derivatives.py
: 测试 RNEA 及其导数、广义重力项导数、静态力矩项导数的 Python 绑定。
bindings_joints.py
: 测试关节配置空间操作(归一化, integrate, difference, interpolate, distance)及其导数的 Python 绑定。
bindings_joint_algorithms.py
: 与
bindings_joints.py
类似,扩展测试dIntegrateTransport
。bindings_joint_composite.py
: 测试复合关节模型
pin.JointModelComposite
的 Python 绑定。bindings_kinematics.py
: 测试获取特定关节速度和加速度(不同参考坐标系)的 Python 绑定。
bindings_kinematics_derivatives.py
: 测试获取关节级别运动学导数的 API 的 Python 绑定(命名可能与Frame混淆,但内容偏向Joint)。
bindings_kinematic_regressor.py
: 测试运动学回归量计算 (
computeJointKinematicRegressor
,computeFrameKinematicRegressor
) 的 Python 绑定。bindings_liegroups.py
: 全面测试独立于机器人模型的李群操作(创建, integrate, difference, interpolate, transport)及其导数的 Python 绑定。
bindings_model.py
: 全面测试
pin.Model
对象(创建、修改、查询、内置算法调用、序列化)的 Python 绑定。bindings_motion.py
: 全面测试
pin.Motion
对象(空间运动向量)的 Python 绑定。bindings_regressor.py
: 测试各种动力学回归量计算的 Python 绑定。
bindings_rnea.py
: 全面测试 RNEA 及其相关动力学计算函数的 Python 绑定。
bindings_sample_models.py
: 测试示例模型构建函数 (
buildSampleModelHumanoidRandom
,buildSampleModelHumanoid
等) 的 Python 绑定。bindings_SE3.py
: 全面测试
pin.SE3
(刚体变换)对象的 Python 绑定。bindings_spatial.py
: 测试空间向量代数和李群/李代数运算 (skew, log3, Jlog3, Jlog6) 的 Python 绑定,包括与 CasADi 的结合。
bindings_std_map.py
: 测试 C++
std::map<std::string, VectorXd>
(Pinocchio的StdMap_String_VectorXd
) 序列化/反序列化的 Python 绑定。bindings_std_vector.py
: 测试 C++
std::vector<Vector3d>
(Pinocchio的StdVec_Vector3
) 序列化/反序列化的 Python 绑定。bindings_Symmetric3.py
: 测试
pin.Symmetric3
(3x3对称矩阵) 对象的 Python 绑定。bindings_urdf.py
: 测试从 URDF 加载
pin.Model
及模型序列化功能的 Python 绑定。bindings_visualizer.cpp
: C++代码,使用 Boost.Python 将一个模拟的可视化器
DummyVisualizer
(继承自pin::visualizers::BaseVisualizer
) 暴露给 Python,用于测试。bindings_visualizer.py
: 测试与 Pinocchio 可视化器相关的 Python 绑定,使用
DummyVisualizer
进行基础属性访问测试。explog.py
: 全面测试李群指数/对数映射及其雅可比函数 (SO(3), SE(3)) 的 Python 绑定,包括通用接口。
robot_wrapper.py
: 测试
pin.RobotWrapper
类从不同格式文件 (MJCF, URDF, SDF) 加载模型的功能。rpy.py
: 全面测试 RPY 角相关函数(与旋转矩阵转换、角速度雅可比及其逆和导数)的 Python 绑定。
serialization.py
: 测试
pin.Model
对象到文本、XML、二进制格式的序列化和反序列化。test_case.py
: 定义自定义的
unittest.TestCase
子类PinocchioTestCase
(包含assertApprox
)和可选的执行跟踪函数。utils.py
: 测试
pinocchio.utils
模块中的工具函数 (SE3 与 XYZ-四元数转换,isapprox
)。version.py
: 检查 Pinocchio 库版本信息是否能通过 Python 绑定正确访问。
casadi
子目录:
CMakeLists.txt
: 配置与 CasADi 集成的 Python 单元测试的构建(如果涉及 C++ 扩展)和执行。
bindings_explog.py
: 测试李群指数/对数映射及其导数与 CasADi 符号计算库结合使用的正确性和数值稳定性。
bindings_main_algo.py
: 测试主要动力学算法 (CRBA, RNEA, ABA) 的
pinocchio.casadi
模块接口。
pybind11
子目录:
CMakeLists.txt
: 使用
FetchContent
获取 pybind11,构建 C++ Python 扩展模块cpp2pybind11
,并设置测试。cpp2pybind11.cpp
: 测试和演示 pybind11 与 Pinocchio 自定义类型 (Model, SE3) 的传递和返回。
test-cpp2pybind11.py
: 针对
cpp2pybind11
C++ 扩展模块功能的单元测试。
unittest/utils
子目录macros.hpp
: 定义与 Pinocchio 单元测试相关的预处理器宏,用于改善编译体验和管理特定编译器警告。
model-generator.hpp
: 定义辅助函数和类,用于在测试中构建包含各种关节类型(包括模仿关节)的机器人模型。
这个总结应该能让你对 Pinocchio 的
unittest
目录有一个全面的了解。deepseek
以下是对 Pinocchio 源码中
unittest
目录内容的系统总结,按功能模块分类整理:
核心动力学算法测试
正向动力学 (ABA)
aba-derivatives.cpp
:验证 ABA 导数(∂ddq/∂q, ∂ddq/∂v, ∂ddq/∂τ)的准确性,通过有限差分法/参考算法对比。
aba.cpp
:测试 ABA 算法本体、质量矩阵逆 (
computeMinverse
) 及关节级实现。parallel-aba.cpp
:验证并行 ABA 实现 (
abaInParallel
) 的正确性。
- 工具集
逆动力学 (RNEA)
rnea-derivatives.cpp
:测试 RNEA 的偏导数(∂τ/∂q, ∂τ/∂v, ∂τ/∂a)。
rnea-second-order-derivatives.cpp
:验证 RNEA 的二阶导数(如 ∂²τ/∂q∂q)。
rnea.cpp
:覆盖 RNEA 基础功能、外部力处理、模仿关节支持。
质量矩阵与 Cholesky 分解
crba.cpp
:测试复合刚体算法 (CRBA) 计算质量矩阵
M(q)
。cholesky.cpp
:验证质量矩阵的 Cholesky 分解 (
M=UDUᵀ
) 及线性求解性能。
质心动力学
centroidal-derivatives.cpp
:验证质心动量
h
和ḣ
对q, v, a
的偏导数。centroidal.cpp
:测试质心映射矩阵
Ag
、动量计算及其时间导数。com.cpp
:覆盖质心位置/速度/雅可比、子树质量属性计算。
运动学与几何
运动学计算
frames.cpp
:测试操作坐标系位姿、速度、加速度、雅可比及其时间导数。
kinematics-derivatives.cpp
:验证关节速度/加速度对
q, v, a
的偏导数。kinematics.cpp
:基础运动学 API 及模仿关节处理。
碰撞检测
broadphase.cpp
:宽相碰撞检测管理器 (
BroadPhaseManager
) 的功能测试。geometry-algorithms.cpp
:几何模型加载、碰撞/距离查询逻辑。
tree-broadphase.cpp
:基于树的宽相碰撞检测 (
TreeBroadPhaseManagerTpl
)。
几何模型处理
geometry-model.cpp
:碰撞对管理、几何数据状态同步。
geometry-object.cpp
:深拷贝验证 (
GeometryObject::clone()
)。
数学工具与空间代数
李群/李代数
explog.cpp
:测试 SO(3)/SE(3) 的指数/对数映射及其雅可比。
liegroups.cpp
:验证 SO(2), SE(3), Rⁿ 等李群操作的正确性。
cartesian-product-liegroups.cpp
:李群笛卡尔积的动态组合测试。
空间向量
spatial.cpp
:全面测试
SE3
,Motion
,Force
,Inertia
的代数运算与坐标变换。classic-acceleration.cpp
:验证经典加速度(d²p/dt²)的计算。
矩阵/张量运算
eigenvalues.cpp
:幂迭代法求最大特征值/向量。
gram-schmidt-orthonormalisation.cpp
:向量正交化算法测试。
eigen-tensor.cpp
:自定义张量类
pinocchio::Tensor
的基础功能。
约束与接触动力学
闭环约束
closed-loop-dynamics.cpp
:验证带闭环约束的正向动力学算法。
constraint-variants.cpp
:通用约束接口 (
ConstraintModelVariant
) 测试。
接触动力学
contact-dynamics-derivatives.cpp
:测试接触动力学导数(∂ddq/∂q, ∂λ_c/∂q 等)。
impulse-dynamics.cpp
:冲量动力学(碰撞响应)的稀疏实现验证。
delassus.cpp
:带阻尼的 Delassus 算子逆矩阵
(G + μI)⁻¹
计算。
模型与数据
模型构建
model.cpp
:测试模型拼接 (
appendModel
)、降阶 (buildReducedModel
) 及模仿关节处理。sample-models.cpp
:验证内置模型生成函数(如类人机器人模型)。
数据管理
data.cpp
:
pinocchio::Data
内部数据结构验证。copy.cpp
:测试
pinocchio::copy
在Data
对象间的选择性数据复制。
自动微分集成
CasADi
casadi/algorithms.cpp
:验证运动学/动力学算法在符号层面的正确性。
casadi/joints.cpp
:测试关节模型在 CasADi 环境中的运动学计算。
casadi/spatial.cpp
:SE(3)/Motion 与 CasADi 符号类型的兼容性。
CppAD
cppad/algorithms.cpp
:RNEA/ABA 的自动微分实现测试。
cppad/joint-configurations.cpp
:关节流形操作 (
integrate
,difference
) 的导数验证。
绑定与序列化
Python 绑定
python/bindings_*.py
:覆盖 SE3、Motion、Frame、RNEA、ABA 等核心类的 Python 接口测试。
python/robot_wrapper.py
:验证模型加载功能(URDF/MJCF/SDF)。
序列化
serialization.cpp
:测试 Model/Data/Frame 等对象的文本/XML/二进制序列化。
bindings_serialization.py
:Python 环境的序列化功能验证。
工具与辅助
- 多精度支持
multiprecision-mpfr.cpp
/
multiprecision.cpp
:验证 MPFR 和cpp_dec_float
高精度计算的正确性。 - 版本与配置
version.cpp
:版本宏检查;
macros.cpp
:参数校验宏测试。 - 模型解析器
urdf.cpp
/
mjcf.cpp
/sdf.cpp
:URDF/MJCF/SDF 解析器的兼容性与鲁棒性测试。
关键目录结构
unittest/ ├── algorithm/ # 算法工具测试 ├── casadi/ # CasADi 自动微分集成 ├── cppad/ # CppAD 自动微分集成 ├── cppadcg/ # CppADCodeGen 测试 ├── models/ # 测试用机器人模型(URDF/MJCF) ├── packaging/ # 示例项目构建配置 ├── python/ # Python 绑定测试 └── utils/ # 测试工具类
总结
Pinocchio 的单元测试体系具有以下特点:
- 全面性
:覆盖运动学、动力学、几何、约束处理等核心模块。
- 严谨性
:通过有限差分法、参考算法对比、多精度验证确保数值准确性。
- 扩展性
:深度集成 CasADi/CppAD 自动微分,支持符号计算与代码生成。
- 实用性
:提供模型解析、数据序列化、多线程并行等工业级特性测试。
- 跨语言支持
:严格验证 C++ 核心与 Python 绑定的行为一致性。
此测试套件是 Pinocchio 高可靠性的基石,尤其为基于模型的机器人控制、轨迹优化、状态估计等高级应用提供坚实的数值保证。