关节开发指南
本指南面向 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) 是常数矩阵。 是常数向量。
这种结构意味着:
约束值: 简单的矩阵乘法
。 雅可比矩阵:
,是的线性函数。 海森矩阵: 常数
,无需每步重新计算。
joints.jl 代码解析
src/coordinates/natural_coordinates/joints.jl 文件包含了核心的数学实现。
build_joint_cache:接收两个物体的坐标系统和连接几何信息。
根据 Mask 类型,组装
halves(对应) 和 transformations(对应)。 对于
mask_3rd和mask_4th,使用 Kronecker 积 (kron) 来构建稀疏的二次型矩阵。
get_joint_violations!:计算
。利用预计算的 halves和transformations。mul!(joint_work, half, joint_q)然后dot积,避免了分配。
get_joint_jacobian!:计算
。 将常数
与当前状态 相乘,加上常数 。
扩展新关节
要添加一种新的关节类型,只需在 src/joint/joints.jl 的 get_joint_info 函数中定义其 Mask 组合。
例如,定义一个新的“垂直滑块”关节:
确定需要的自由度。
组合
mask_3rd(限制在平面) 和mask_4th(限制旋转) 来实现。不需要编写新的数学代码,只需配置 Mask 索引。