Skip to content

rb1 front_cover_link inertia violates the triangle inequality by 98%, so the description will not compile in MuJoCo #102

Description

@omnilink-tech

urdf/bodies/rb1/rb1_body.urdf.xacro:96-108 (branch jazzy-devel, same on
humble-devel):

<link name="${prefix}front_cover_link">
  <inertial>
    <mass value="0.25" />
    <inertia ixx="0.00007" ixy="0.0" ixz="0.0"
             iyy="0.00007" iyz="0.0" izz="0.0078" />

The tensor is diagonal, so the principal moments are the declared values:

a + b = 0.00007 + 0.00007 = 0.00014
c     = 0.0078
a + b < c   -> violated by 98.205%

A rigid body's principal moments must satisfy a + b >= c. No mass
distribution can produce this one.

Two independent sanity checks that it is the izz that is wrong, not the
diagonal being oddly shaped:

  • Radius of gyration. izz implies sqrt(0.0078/0.25) = 0.177 m; ixx implies
    sqrt(0.00007/0.25) = 0.0167 m. A 10.6x disagreement on a single cover panel.
  • Plate bound. For any flat plate, izz/ixx <= 2 (perpendicular-axis
    theorem, with equality for a symmetric plate). Here izz/ixx = 111.4. A thin
    disc carrying this izz would have ixx = iyy = 0.0039, not 7e-05.

So either izz is ~50x too large, or ixx/iyy are ~50x too small; the plate
bound says the consistent pair for this izz is ixx = iyy = 0.0039.

MuJoCo refuses the file outright:

Error: inertia must satisfy A + B >= C; use 'balanceinertia' to fix

so this is not an RViz nicety — the RB-1 description cannot be loaded by a
MuJoCo-family consumer at all.

It is a single occurrence, not copy-pasted: I parsed every <inertial> block in
the file and front_cover_link is the only one that violates (the base_link
tensor is fine). So one edit fixes it.

Honest scoping on impact: the joint above it is fixed, so in consumers that
merge fixed-joint children the wrong tensor lumps into base_link, whose own
izz is 0.981 — about a 0.8% perturbation, i.e. dynamically minor. The headline
is the load failure rather than the dynamics.

Happy to send a PR if you have a preferred value; I would only be guessing
between "izz is wrong" and "ixx/iyy are wrong" without the CAD, and the
plate bound narrows it but does not settle which side was mistyped.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions