Skip to content

Two shipped robot assets carry physically impossible inertia tensors (fetch gripper fingers, movo kinect2_link) #301

Description

@omnilink-tech

Both found running a URDF preflight over the assets in master; both are
provable from the files and both are refused by MuJoCo.

1. assets/robot/fetch/fetch.urdf — gripper fingers have a zero principal moment

r_gripper_finger_link and l_gripper_finger_link, mass 0.0798:

<inertia ixx="0.002" ixy="0" ixz="0.0002" iyy="0" iyz="0" izz="0.0002"/>
principal moments = (0.000000, 0.000178, 0.002022)
positive definite : False        (one eigenvalue is exactly zero)
a + b = 1.7805e-04  <  c = 2.0220e-03      violated by 91.19%

MuJoCo: inertia must have positive eigenvalues.

A note on recoverability, because the obvious source is worse. I checked
upstream fetchrobotics/fetch_ros (and the ZebraDevs fork): they ship
ixx="0.002" iyy="0" izz="0". So this file has already been partially
repaired
here — ixz and izz were filled in and iyy was left at zero —
and pulling from upstream would undo that. The remaining value is not
recoverable from upstream; it would have to come from the finger's own collision
mesh, which the link already references.

Because iyy is exactly zero, the admissible band for the largest moment is
degenerate — there is no value of izz alone that rescues it. iyy is the one
that has to be filled.

2. assets/robot/movo/movo.urdfkinect2_link violates by 73%

Line ~273, mass 1.4 (also in movo_free_base.urdf and
unittest/assets/movo_simple.urdf):

ixx = 0.0006835   iyy = 0.001197   izz = 0.007020
principal moments = (0.000683, 0.001197, 0.007020)
a + b = 1.8805e-03  <  c = 7.0200e-03      violated by 73.21%
admissible largest moment, given the other two: [5.2034e-04, 1.8805e-03]

so izz as declared is 3.73x the largest value that could be physical
alongside the other two.

Which entry is wrong is worth a moment. Two single-value repairs both
compile:

izz / 10      -> (0.000683, 0.000702, 0.001197)   triangle OK
iyy = 0.00702 -> (0.000683, 0.007020, 0.007020)   triangle OK

A Kinect v2 is roughly 249 x 66 x 67 mm at 1.4 kg. As a solid box that gives
principal moments (0.00103, 0.00776, 0.00774)two large and one small.
The declared set has one large and two small, and its lone large value
(0.00702) is close to the box's two large ones. That points at iyy being the
value that went missing rather than izz being inflated, but it is thin enough
that I would rather report the bound and let you pick than assert it.

Minor, same element: it also carries iyx, izx and izy attributes. Those
are not in the URDF spec and every parser silently drops them, so anyone editing
iyx to change a product of inertia gets no feedback and no effect.


Happy to send a PR for the MOVO one once you say which entry is intended. For
the Fetch fingers I would want to derive the tensor from the referenced
collision mesh rather than guess, so that is a slower fix and I did not want to
put a plausible-looking number into a shipped asset.

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