有多少人工,就有多少智能

AIGC标识 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\) 后,对角三项定义为质量元到对应轴距离平方的加权积分:

\[I_{xx}=\int(y^{2}+z^{2})\mathrm{d}m,\quad I_{yy}=\int(z^{2}+x^{2})\mathrm{d}m,\quad I_{zz}=\int(x^{2}+y^{2})\mathrm{d}m. \]

惯性积(products of inertia)是非对角项,刻画质量相对坐标平面的交叉分布:

\[I_{xy}=\int xy\mathrm{d}m,\quad I_{xz}=\int xz\mathrm{d}m,\quad I_{yz}=\int yz\mathrm{d}m. \]

把惯性矩与惯性积按约定排成 \(3\times 3\) 对称矩阵,就是惯性张量 / 惯量矩阵(inertia tensor)。许多教材写成:

\[\mathbf{I}_{O}= \begin{bmatrix} I_{xx} & -I_{xy} & -I_{xz}\\ -I_{xy} & I_{yy} & -I_{yz}\\ -I_{xz} & -I_{yz} & I_{zz} \end{bmatrix}. \]

要点有三:

  1. 惯性矩通常特指对角的 \(I_{xx},I_{yy},I_{zz}\)。
  2. 惯性积是 \(I_{xy},I_{xz},I_{yz}\);主轴对齐且原点合适时可为 0,否则不能想当然。
  3. 惯量矩阵才是完整对象:六个独立分量 + 明确的参考点与轴向。对角三项只是矩阵的一部分,不是全部。

教材在非对角位置常带负号,那是张量组装约定;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 原点)的六个分量。尺寸放大时,惯量大致按「质量 × 长度平方」的量纲变粗——形状相似时尤其明显。因此「跟密度分布有关吗」——有关:惯量编码的是质量在空间里如何铺开,而不是一个与几何无关的常数标签。

同一刚体,相对质心 \(G\) 的 \(\mathbf{I}_{G}\) 与相对另一点 \(O\) 的 \(\mathbf{I}_{O}\) 不同。平行轴定理的标量提醒足够建立直觉:对互相平行的轴,

\[I_{O}=I_{G}+m d^{2}, \]

其中 \(d\) 是两轴间距。把参考点从质心挪到关节附近的 link 原点时,对角项往往会变大;张量形式还会出现与质心偏移相关的耦合项。URDF 实践里两条合法路径是:

  • 在质心处给出 <inertia>,用 <origin> 标明质心相对 link 原点;或
  • 把惯量变到 link 原点后再填六个分量。

危险的是第三条:数字来自质心系,却假装原点在 link 原点(或轴朝向不一致)。平行轴与坐标旋转没做,仿真器却按你声明的系去用——这是最常见的「CAD 抄过来却不对」的来源。


它不依赖什么?

对标准 URDF 刚体 link,体坐标系(或你选定的惯性系)下的惯量矩阵是固有参数:

  • 不依赖速度:角速度、线速度再大,刚体假设下这份张量不变。
  • 不依赖关节类型:revolute / prismatic / fixed 描述的是约束,不携带质量分布。
  • 不依赖机器人瞬时位姿:站着、躺着、手臂抬起,都不该改写文件里那六个数。

需要对比的是世界坐标系表示:若 \(R\) 是体到世界的旋转,则

\[\mathbf{I}_{\mathrm{world}}=R\mathbf{I}_{\mathrm{body}}R^{T}. \]

世界系分量随姿态变——变的是坐标表示,不是 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>

可靠流程可以记成三步,缺一不可:

  1. 在 CAD 中赋正确材料(密度),对装配好的刚体读取质量属性;
  2. 统一到 kg 与 \(kg\cdot m^{2}\),并确认输出坐标系与 URDF link 坐标系对齐(或明确是相对质心);
  3. 同时写入 <mass>、六个 <inertia> 分量,以及质心对应的 <origin>。

仍反复踩坑的,几乎总是单位与坐标系,而不是「不会背积分定义」。导出插件(如部分 SolidWorks URDF 导出工具)能减少手工对齐;手写 xacro 时,把惯量提成参数便于核对数量级。粗仿真可用圆柱 / 长方体解析近似,但要对齐 Gazebo 与实物手感,应回到 CAD 质量属性,并检查:质量是否合理、对角惯量是否随尺寸平方量级变化、非对角是否在对称件上接近 0。

审阅时可问三个问题:这六个数相对哪个原点?轴是否与 link 一致?<mass> 是否与它们同一次计算?三个都答得上,<inertial> 才算闭环。


收束

惯性矩是对角分量,惯性积是非对角分量,惯量矩阵是二者组成的 \(3\times 3\) 张量;它由质量与密度分布(几何与参考点/轴)共同决定,与速度、关节类型、瞬时世界位姿无关——因此写在 <link> 的 <inertial> 里。一句话收束:惯量在 link 上,不在 joint 上;joint 只约束运动,不携带质量分布。

posted @ 2026-10-15 11:43  lvdongjie-avatarx  阅读(14)  评论(0)    收藏  举报