Adding closed links to robot USD produces strange outcome in spawning


I’m working on developing a robot controller and have encountered an issue. I utilized my URDF file to import the robot and incorporated joints that create closed links using Isaac SIM. However, when I attempt to spawn it using Articulation and ArticulationView, it appears in an abnormal orientation, as shown in the video below:

Interestingly, this strange outcome doesn’t occur when I disable the added joints, as demonstrated in the following video:

I’m seeking a solution or workaround to address this problem. If anyone has any suggestions, I would greatly appreciate it.

(FYI, it worked without problem in the USD scene from GUI.)

When you spawn the articulation view, and before you started the simulation, do you set the joint positions using set_joint_positions function?

I once encountered the problem of robot flying away after spawn, I solved the problem by set joint positions (including the passive joints excluded from articulation). Since the passive joints are constrained by external forces, it will take some time to calculate the actual joint positions. If the initial positions of the passive joints are far from the proper ones, it will take too much time to converge to a normal value, and there might be something weird happening.

1 Like

I’ve already set default joint positions, but it did not work for my case.

Hi @user15623 - The issue you’re encountering might be due to the initial pose of the robot not being set correctly when spawning it using Articulation and ArticulationView.

When you spawn the robot, you can specify its initial pose (position and orientation) in the world frame. If this is not done, the robot might spawn with a default pose, which could be causing the abnormal orientation you’re seeing.

Hello, @rthaker. As I’ve already mentioned, the same configuration doesn’t generate any problem without closed links. It only makes problem when I add closed chain joints.

Hi @user15623 - Adding closed links to a robot USD can indeed produce unexpected results. This is because the physics engine may interpret these closed links as a loop, which can lead to instability in the simulation.

In the context of robot kinematics, a closed link or a loop is a sequence of joints and links that starts and ends at the same point. This can create ambiguity in the physics simulation because there are multiple paths between any two points in the loop.

To avoid this issue, you should ensure that your robot’s kinematic structure is a tree, not a graph. This means that there should be a unique path between any two points in the structure. If your robot naturally has a closed-loop structure, you may need to introduce a “dummy” or “virtual” joint to break the loop for the purposes of the simulation.

Thanks for your feedback. However, I cannot find a way to make a unique path in a closed-loop system, e.g., four-bar linkage. Could you please introduce an example using a dummy to break the loop?
In addition, I found that the error occurs only when I try to use Articulation and use “world.reset()”. Would there be any clue from this behavior?

Please how did you define the closed links? The definition for the closed loop links should be to use a joint that is excluded from the articulation. (Bool in the joint properties).
Feel free to send me both of the USD files through PM I can take a look what the parsing produces and what the problem could be. Sorry for the trouble.