Robotics-URDF 惯量矩阵是什么:惯性矩、惯性积,以及它跟质量和密度分布的关系
打开一份 URDF,<link> 里几乎总会出现 <inertial>:<mass>、质心相关的 <origin>,以及六个看起来像「魔法参数」的属性——ixx、iyy、izz、ixy、ixz、iyz。新人常把它们一律叫作「惯性矩」;做过刚体动力学的人又会说「这是惯量矩阵」。再往下问一句:这组数跟质量有关吗?跟密度分布有关吗?答案若含糊,填表时就容易「质量抄 CAD、惯量随手估」,仿真里机器人要么轻得乱飞,要么重得抬不动。
本文面向已经接触过 URDF 与刚体基本概念的读者,把三个容易搅在一起的词拆开:惯性矩、惯性积、完整的 惯量矩阵(惯性张量);说明 URDF 如何映射;并正面回答它依赖什么、不依赖什么。目标是概念清楚、能直接用于审阅自己的 <inertial>,而不是堆公式证明。
为什么 <inertial> 里最容易混:惯量矩阵 ≠ 三个惯性矩
混淆通常来自口语习惯。中文里「惯性矩」既可指对角分量 \(I_{xx},I_{yy},I_{zz}\),也被人拿来笼统称呼整张张量。URDF 却一次甩给你六个数:三个对角、三个非对角。若只记住「填三个惯量」,就会默默把 ixy/ixz/iyz 全写成 0——在坐标轴恰好是惯性主轴、且原点选在质心时这常常成立;一旦零件偏心、坐标系歪了,非对角项并不为零,硬写 0 等于改了质量分布。
另一层混淆是「矩阵」二字:有人以为惯量矩阵会随关节角、随机器人站姿变;于是想在控制循环里改 URDF。其实文件里写的是体坐标系下、对某个刚体 link 固定的固有参数;姿态变的是世界系表示,不是你该去改的那六个数。把「惯性矩 / 惯性积 / 惯量矩阵」和「相对谁、在哪个系」说清楚,后面的「跟质量/密度有关吗」才会有唯一答案。
三个层次:惯性矩、惯性积、惯量矩阵
刚体绕某轴转动时,抵抗角加速度的难易程度,用惯性矩(moments of inertia)描述。选定参考点 \(O\) 与正交轴 \(x,y,z\) 后,对角三项定义为质量元到对应轴距离平方的加权积分:
惯性积(products of inertia)是非对角项,刻画质量相对坐标平面的交叉分布:
把惯性矩与惯性积按约定排成 \(3\times 3\) 对称矩阵,就是惯性张量 / 惯量矩阵(inertia tensor)。许多教材写成:
要点有三:
- 惯性矩通常特指对角的 \(I_{xx},I_{yy},I_{zz}\)。
- 惯性积是 \(I_{xy},I_{xz},I_{yz}\);主轴对齐且原点合适时可为 0,否则不能想当然。
- 惯量矩阵才是完整对象:六个独立分量 + 明确的参考点与轴向。对角三项只是矩阵的一部分,不是全部。
教材在非对角位置常带负号,那是张量组装约定;URDF 属性名直接对应六个标量分量 \(I_{xx},\ldots,I_{yz}\),仿真器再按自身约定装进动力学方程。写 URDF 时你要保证的是:六个数与所选原点、轴一致,而不是纠结矩阵里该不该手写负号。
URDF 写法:六个属性如何对应矩阵
惯量写在 <link> 的 <inertial> 里,典型片段如下:
<inertial>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
<mass value="1.2"/>
<inertia ixx="0.01" ixy="0" ixz="0"
iyy="0.02" iyz="0" izz="0.015"/>
</inertial>
映射关系可以记成一张表:
| URDF 属性 | 物理分量 | 角色 |
|---|---|---|
ixx / iyy / izz |
\(I_{xx},I_{yy},I_{zz}\) | 惯性矩(对角) |
ixy / ixz / iyz |
\(I_{xy},I_{xz},I_{yz}\) | 惯性积(非对角) |
对称矩阵只需六个独立数,所以没有 iyx、izx 之类重复属性。<origin> 描述惯性参考系相对 link 坐标系 的位姿;工程惯例是:<inertia> 相对该惯性原点写出,而原点又常取在质心。<mass> 是标量质量,与张量分开存放,但二者必须来自同一次质量属性计算——不能质量用真实 CAD,惯量却用「差不多」的立方体公式凑一个数量级。
单位上,ROS / URDF 期望质量为 kg,惯量为 \(kg\cdot m^{2}\)。CAD 若输出 \(g\cdot mm^{2}\),换算会差约 \(10^{-9}\);这比「公式记错」更能毁掉仿真手感。
惯量矩阵跟什么有关?
跟质量有关:同形同分布时与质量成比例
积分里 \(\mathrm{d}m=\rho\mathrm{d}V\)。当几何形状不变、密度分布的相对比例也不变时,整体质量 \(m\) 放大,整张 \(\mathbf{I}\) 按同一比例放大。换句话说:不是「有个与质量无关的形状因子就够了」——质量本身就是惯量的尺度因子之一。因此「惯量矩阵跟质量有关吗」——有关。URDF 里改 <mass> 却不改 <inertia>,等于假装物体变重但转动惯性不变,动力学会不一致。
跟密度分布 / 几何有关:形状、尺寸、质量坐在哪
同样是 \(1\mathrm{kg}\),一根细长杆绕端部转,和一团挤在转轴附近的质量,对角惯量可以差一个数量级。外壳轻、嵌件重的多材料零件会把质心拉偏,也会改变相对质心(或相对 link 原点)的六个分量。尺寸放大时,惯量大致按「质量 × 长度平方」的量纲变粗——形状相似时尤其明显。因此「跟密度分布有关吗」——有关:惯量编码的是质量在空间里如何铺开,而不是一个与几何无关的常数标签。
跟参考点 / 坐标系有关:质心系、link 系与平行轴定理
同一刚体,相对质心 \(G\) 的 \(\mathbf{I}_{G}\) 与相对另一点 \(O\) 的 \(\mathbf{I}_{O}\) 不同。平行轴定理的标量提醒足够建立直觉:对互相平行的轴,
其中 \(d\) 是两轴间距。把参考点从质心挪到关节附近的 link 原点时,对角项往往会变大;张量形式还会出现与质心偏移相关的耦合项。URDF 实践里两条合法路径是:
- 在质心处给出
<inertia>,用<origin>标明质心相对 link 原点;或 - 把惯量变到 link 原点后再填六个分量。
危险的是第三条:数字来自质心系,却假装原点在 link 原点(或轴朝向不一致)。平行轴与坐标旋转没做,仿真器却按你声明的系去用——这是最常见的「CAD 抄过来却不对」的来源。
它不依赖什么?
对标准 URDF 刚体 link,体坐标系(或你选定的惯性系)下的惯量矩阵是固有参数:
- 不依赖速度:角速度、线速度再大,刚体假设下这份张量不变。
- 不依赖关节类型:revolute / prismatic / fixed 描述的是约束,不携带质量分布。
- 不依赖机器人瞬时位姿:站着、躺着、手臂抬起,都不该改写文件里那六个数。
需要对比的是世界坐标系表示:若 \(R\) 是体到世界的旋转,则
世界系分量随姿态变——变的是坐标表示,不是 link 的固有属性。仿真与控制内部会做这类变换;URDF 作者的职责是提供一份正确的体坐标(或约定惯性系)常量。形变、液体晃动会破坏「固定刚体惯量」假设,那是模型边界问题:标准做法仍是拆更多带 <inertial> 的 link,而不是让 <inertia> 跟着关节角表查。
三个轻量直觉例子
细长杆:同一质量,换参考点。 均匀细杆质量 \(m\)、长 \(L\),绕垂直于杆、过质心的轴,有 \(I_{G}\propto mL^{2}/12\);绕过端点的平行轴则 \(I_{O}=I_{G}+m(L/2)^{2}\)。质量没变,只是「相对谁转」变了,数字就变。对应 URDF:原点写错,等于用了另一根轴上的惯量。
薄平板:形状相对轴的朝向。 大平板对垂直板面的轴往往惯量大,对板面内某轴更小。若板的法向与你声明的 \(z\) 不一致,对角主值会对错轴,还可能逼出非零惯性积。这说明「密度分布」包含几何相对坐标轴怎么摆,而不只是「有多重」。
两个质点:同质量、不同铺开。 质量各 \(m/2\),沿 \(x\) 轴对称放在 \(\pm a\)。对过中点且沿 \(z\) 的轴,\(I_{zz}=ma^{2}\);若质量都挤在原点附近,\(I_{zz}\approx 0\)。这是「跟密度分布有关」的最小模型:质量相同,分布不同,惯量不同。
实践:CAD 质量属性如何落到 <inertial>
可靠流程可以记成三步,缺一不可:
- 在 CAD 中赋正确材料(密度),对装配好的刚体读取质量属性;
- 统一到 kg 与 \(kg\cdot m^{2}\),并确认输出坐标系与 URDF link 坐标系对齐(或明确是相对质心);
- 同时写入
<mass>、六个<inertia>分量,以及质心对应的<origin>。
仍反复踩坑的,几乎总是单位与坐标系,而不是「不会背积分定义」。导出插件(如部分 SolidWorks URDF 导出工具)能减少手工对齐;手写 xacro 时,把惯量提成参数便于核对数量级。粗仿真可用圆柱 / 长方体解析近似,但要对齐 Gazebo 与实物手感,应回到 CAD 质量属性,并检查:质量是否合理、对角惯量是否随尺寸平方量级变化、非对角是否在对称件上接近 0。
审阅时可问三个问题:这六个数相对哪个原点?轴是否与 link 一致?<mass> 是否与它们同一次计算?三个都答得上,<inertial> 才算闭环。
收束
惯性矩是对角分量,惯性积是非对角分量,惯量矩阵是二者组成的 \(3\times 3\) 张量;它由质量与密度分布(几何与参考点/轴)共同决定,与速度、关节类型、瞬时世界位姿无关——因此写在 <link> 的 <inertial> 里。一句话收束:惯量在 link 上,不在 joint 上;joint 只约束运动,不携带质量分布。

浙公网安备 33010602011771号