Differences between Isaac Sim and MuJoCo Jacobians

Hi everyone,

as part of a domain randomization effort, I am currently trying to port a custom gravity compensation function that relies on Jacobian and CoM information from MuJoCo to Issac Sim.

Comparing the Jacobian and CoM values in Isaac Sim and MuJoCo on the same model, I realized that the Jacobian entries relating to position (i.e. the first three) radically differ between MuJoCo and IsaacSim, which should not be the case regardless of whether using analytical or geometrical Jacobians.

Given that the gravity compensation works fine in MuJoCo, I am assuming that I am either misinterpreting the entries in the IsaacSim Jacobian or the computation is wrong (probably because I am misusing the interface).

The following snippet illustrates how I currently query for the Jacobian in my code:

task = MyTask(...)
world.add_task(task)
world.reset()

# Set the Joint Position and Velocities
task.articulation_view.set_joint_positions(torch.tensor([[0., 0., 0., 0., 0., 0.]], device="cuda:0"))
task.articulation_view.set_joint_velocities(torch.zeros((1, 6), device="cuda:0"))

world.step()

jac = task.articulation_view.get_jacobians()

If I compare the Jacobian entries for a given body to the ones obtained in the MuJoCo simulation, I get significant differences of up to 1 for some of the entries, although I generated the Isaac Sim model with the importer from the MuJoCo XML.

Does anyone have an experiment with the get_jacobians() function of the articulation_view and can help me with its semantics? Does the function return analytic or geometric Jacobians? And how do I need to call the function to ensure correct results?

Or does there even exist some API that allows me to compute Kinematics and Jacobians without relying on the world.step() function? (I know that Lula exists, but this seems like a lot of overhead for the relatively simple task of kinematics computation).

Short Update: Checking the code of the Orbit framework, I found out that the Jacobian does not contain the base body, and hence I need to adjust the body indices by a value of -1. Interestingly, this results in the correct rotational entries of the Jacobian. However, the positional entries remain subject to significant differences from the MuJoCo simulation.

Is there a specific reference frame (except for the world frame) in which the positional entries of the Jacobian are expressed?

Hi @pascal.klink,

IsaacSim uses the PhysX Jacobian computation. Its documentation is here: Articulations — physx 5.1.3 documentation

The documentation here also confirms your observation that for fixed-base robots, you will not get the jacobian for the base. For floating-base, we do report the identity matrix for the base link - which makes the Jacobian dimensions depend on this robot property.

PhysX is reporting the geometric Jacobian, so the mapping from joint velocities to the spatial link velocities for a given state.

PhysX reports the velocities w.r.t the center of gravity, so if Mujoco and PhysX do not use the same link reference origin to report the linear component, you will get differences. I don’t know about the Mujoco Jacobians, but this could explain what you are seeing.

1 Like

Hello Philipp,

thank you very much for this information! That tremendously helped my understanding of what’s going on.

In general, I guess it will for the future be a good idea to take a look at the PhysX documentations when debugging simulation issues.

Best
Pascal

2 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.