Skip to content

关节开发指南

本指南面向 Rible.jl 的开发者,深入解析关节模块的内部实现原理。系统基于自然绝对坐标公式 (Natural Absolute Coordinate Formulation, NACF),通过组合一组“基本约束”来构建各种复杂的运动副。

理论基础:基本约束 (Basic Constraints)

在 NACF 中,刚体的运动由参考点的位置和一组方向向量(方向余弦)描述。这种方法的优势在于质量矩阵是常数,且约束方程通常是线性的或二次的,这使得雅可比矩阵和海森矩阵的计算非常高效。

Rible.jl 参考了文献 A natural absolute coordinate formulation for the kinematic and dynamic analysis of rigid multibody systems 中的分类,将约束分为四种基本类型(Masks):

Mask 1st: 重合约束 (Type 1)

约束两个物体上的点 重合。   

  • 代码对应: mask_1st

  • 数学形式: 线性约束。

  • 实现: 在 build_joint_cache 中,这部分约束直接贡献到 transformations 矩阵。

Mask 2nd: 距离约束 (Type 4)

约束两个点之间的距离保持常数 。这常用于模拟无质量杆或轨道。    

  • 代码对应: mask_2nd

  • 数学形式: 二次约束。

  • 实现: 对应于代码中的 half_2nd 矩阵。

Mask 3rd: 正交约束 I (Type 3)

约束一个物体上的向量 与两个物体间的相对位置向量 正交。   

  • 代码对应: mask_3rd

  • 数学形式: 二次约束(涉及方向坐标和位置坐标的乘积)。

  • 用途: 用于平面关节(限制在平面内)或移动关节(限制沿轴移动)。

Mask 4th: 正交约束 II (Type 2)

约束两个物体上的两个向量 相互正交。  

  • 代码对应: mask_4th

  • 数学形式: 二次约束(仅涉及方向坐标)。

  • 用途: 用于转动关节(轴对齐)或万向节。

实现细节

缓存机制 (ApparatusCache)

为了极致的性能,Rible.jl 在初始化阶段通过 build_joint_cache 函数预计算所有与状态无关的量。

由于 NACF 的特性,约束方程 可以写成统一的二次形式:      其中:

  • (Hessian/Halves) 是常数矩阵。

  • (Transformation) 是常数矩阵。

  • 是常数向量。

这种结构意味着:

  1. 约束值: 简单的矩阵乘法

  2. 雅可比矩阵:    ,是 的线性函数。

  3. 海森矩阵: 常数 ,无需每步重新计算。

joints.jl 代码解析

src/coordinates/natural_coordinates/joints.jl 文件包含了核心的数学实现。

  • build_joint_cache:

    • 接收两个物体的坐标系统和连接几何信息。

    • 根据 Mask 类型,组装 halves (对应 ) 和 transformations (对应 )。

    • 对于 mask_3rdmask_4th,使用 Kronecker 积 (kron) 来构建稀疏的二次型矩阵。

  • get_joint_violations!:

    • 计算 。利用预计算的 halvestransformations

    • mul!(joint_work, half, joint_q) 然后 dot 积,避免了分配。

  • get_joint_jacobian!:

    • 计算

    • 将常数 与当前状态 相乘,加上常数

扩展新关节

要添加一种新的关节类型,只需在 src/joint/joints.jlget_joint_info 函数中定义其 Mask 组合。

例如,定义一个新的“垂直滑块”关节:

  1. 确定需要的自由度。

  2. 组合 mask_3rd (限制在平面) 和 mask_4th (限制旋转) 来实现。

  3. 不需要编写新的数学代码,只需配置 Mask 索引。