When the URDF exporter is used, it does not make use of the Local Position 0
, Local Rotation 0
, Local Position 1
and Local Rotation 1
fields of the joint. Instead, it just takes the relative transform between the Body 0 and Body 1 prims. This leads to discrepancies between the USD and URDF representations, which can also be seen if we re-import the URDF back to Isaac.
I’ve attached a simple repro example. Notice how origins of XForm and XForm_01 are in the same spot, though geometry and colliders are translated. The local positions of body 0/1 in the joint reflect that (to make the cylinder spin around the cube), but if you export this scene to URDF, you will find:
<joint name="RevoluteJoint" type="revolute">
<origin xyz="0. 0. 0." rpy="0. 0. 0."/>
This means that if the prim’s origin is not at its axis of rotation, it will not be exported correctly to URDF. Making sure that the origin is at the axis of rotation is not always practical, for example if the USD model itself is automatically generated (in our case exported from a CAD file).
Workaround:
For now, I think we can create “proxy” rigid bodies (with no geometry) at the desired locations, connect them with fixed joints to the actual robot links, and then connect the proxies with revolute/prismatic joints. But this leads to a proliferation of rigid bodies, which can be avoided by accounting for the joint position/rotation values when exporting to URDF.
repro.zip (4.9 KB)