Skip to content

[Bug Report] jaco_three_finger_gripper.xml produces extreme force_ee / torque_ee readings in the default initial state #808

@mujoco-debugger

Description

@mujoco-debugger

jaco_three_finger_gripper.xml: force_ee / torque_ee sensors produce extreme readings (~1.9×10¹⁷) in the default initial state

Summary

In jaco_three_finger_gripper.xml both the force_ee and torque_ee sensors are attached to the ft_frame site. In the robot's default initial state (immediately after mj_resetData() + mj_forward(), with zero control input) these sensors report values on the order of 1.9×10¹⁷, which is far outside any physically meaningful range.

Other gripper assets in the same repository (robotiq_gripper_140.xml, robotiq_gripper_s.xml, wiping_gripper.xml, xarm7_gripper.xml) do not exhibit this problem.

Environment

Minimal Reproduction

import mujoco, numpy as np

# Clone the repository and point this path at the gripper XML:
model = mujoco.MjModel.from_xml_path("robosuite/models/assets/grippers/jaco_three_finger_gripper.xml")
data  = mujoco.MjData(model)

mujoco.mj_resetData(model, data)
mujoco.mj_forward(model, data)

# Locate the two sensors
for name in ("force_ee", "torque_ee"):
    sid  = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_SENSOR, name)
    adr  = model.sensor_adr[sid]
    dim  = model.sensor_dim[sid]
    vals = data.sensordata[adr : adr + dim]
    print(f"{name}: max_abs = {np.abs(vals).max():.3e}")

Expected output:

force_ee:  max_abs = O(1e0)   # physically reasonable
torque_ee: max_abs = O(1e0)

Actual output:

force_ee:  max_abs ≈ 1.9e+17  # physically absurd
torque_ee: max_abs ≈ 3.4e+15

Root Cause

The sensors reference the ft_frame site, which appears to be a force/torque sensor mounting frame located at the gripper base. The large offset from the gripper fingers, combined with internal contact/tendon forces that act at the fingertip, produces a huge moment arm and therefore an astronomically large torque reading. The intended site for end-effector force/torque is grip_site.

Suggested Fix

<!-- Before -->
<force  name="force_ee"  site="ft_frame"/>
<torque name="torque_ee" site="ft_frame"/>

<!-- After -->
<force  name="force_ee"  site="grip_site"/>
<torque name="torque_ee" site="grip_site"/>

After the fix, max_abs drops from ≈1.9×10¹⁷ to 0 in the default state.

Sensor Before site After site
force_ee ft_frame grip_site
torque_ee ft_frame grip_site

Impact

Any policy or algorithm that reads force_ee or torque_ee as part of its observation will receive astronomically large values from the very first step, potentially causing NaN propagation, unstable normalization, or silent training divergence.

How This Was Discovered

Found via automated MJCF asset validation: a consistency checker loaded each gripper model, ran mj_forward(), and compared sensor outputs across all grippers in the repository. The Jaco three-finger gripper was the only model with sensor readings more than 10 orders of magnitude above the others.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions