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.urdf — kinect2_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.
Both found running a URDF preflight over the assets in
master; both areprovable from the files and both are refused by MuJoCo.
1.
assets/robot/fetch/fetch.urdf— gripper fingers have a zero principal momentr_gripper_finger_linkandl_gripper_finger_link, mass 0.0798: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 shipixx="0.002" iyy="0" izz="0". So this file has already been partiallyrepaired here —
ixzandizzwere filled in andiyywas 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
iyyis exactly zero, the admissible band for the largest moment isdegenerate — there is no value of
izzalone that rescues it.iyyis the onethat has to be filled.
2.
assets/robot/movo/movo.urdf—kinect2_linkviolates by 73%Line ~273, mass 1.4 (also in
movo_free_base.urdfandunittest/assets/movo_simple.urdf):so
izzas declared is 3.73x the largest value that could be physicalalongside the other two.
Which entry is wrong is worth a moment. Two single-value repairs both
compile:
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
iyybeing thevalue that went missing rather than
izzbeing inflated, but it is thin enoughthat I would rather report the bound and let you pick than assert it.
Minor, same element: it also carries
iyx,izxandizyattributes. Thoseare not in the URDF spec and every parser silently drops them, so anyone editing
iyxto 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.