Closing Loops in Articulation Causing Non-physical Behavior

Hi everyone,

I want to use Isaac Sim to simulate robots with closed chain mechanisms. This means the articulation will not form a tree structure. As indicated in [Articulations — Omniverse Extensions documentation], closing loop is possible with one joint being excluded from articulation.

I modified the humanoid robot to test if it will work. I create a distance joint between right_hand and left_hand. Then I exclude the left_lower_arm joint from articulation. When I press the play button, the humanoid suddenly flew away.

The behavior of humanoid without closing loop:

After create closing loop:

Besides, I have created robots with closed chain mechanisms, but I cannot control the joint angles using set_joint_positions and set_joint_position_targets in ArticulationView class. And sometimes it just flew away like the humanoid. I cannot really find out the reasons, which is pretty confusing. I think it might be because the articulation can still not well support closing loops at the moment?

Really appreciate it if you can help me!

Anybody can help? Thanks

can you send us the usd that you are using so we can investigate? thanks.

Thanks qwan.

The problem of my closed-chain robot in Isaac Sim is that the behavior of the robot using ArticulationView.set_joint_positions and ArticulationView.set_joint_velocities is not as expected.

Currently I developed a simple testing task following the pipeline of OmniIsaacGymEnvs. (GitHub - NVIDIA-Omniverse/OmniIsaacGymEnvs: Reinforcement Learning Environments for Omniverse Isaac Gym)

The task does not include any reinforcement learning training and I use the script to check if my robot really works as expected. The process of the task is that, at the beginning of each episode, the robot will return back to its initial states as shown in the image below (using set_joint_positions and set_joint_velocities). And for the first 100 timesteps, the robot is expected to hold still as I set the initial joint velocities to zeros. From then on, the robot will randomly move its joints to random angles.

However, after resetting the robot to initial joint positions and velocities, the robot still moves in the first 100 timesteps as shown in the following video, which is pretty strange.

But if I disable the joint so that it no longer a closed-chain, the problem disappears as shown in the following video (I disabled the joint called a__closed_chain_revolute under /module/a__link3_intermediate).

The usd file that I used:
The codes to test the robot: GitHub - AlanSunHR/OmniIsaacGymEnvs: Reinforcement Learning Environments for Omniverse Isaac Gym
And the usd file is located in OmniIsaacGymEnvs/omniisaacgymenvs/usds/omni_closed_test/omni_closed_test.usd

Thanks a lot in advance!

By the way, the robot has three active driving DoFs. But it has 6 revolute joints (3 joints are passive, zero-friction hinge). I excluded the joint on the top from the articulations so that the articulation is not a close loop according to the documentation. Besides, I deleted the angular drives for passive joints. Is it the right way to make free joints (joints that are not drived and free to rotate)?


Have you solved the problem?
I am also suffering from a closed loop.
Just executing a USD with a closed loop with spherical joints causes uncountable problems in Isaac SIM, even though it claims support on closed loops.

Hello, does it work now? I especially wanted to work on this software because it claims that it supports closed loops

You do need to exclude one of the joints in the close loop to break the loop in order for the solver to work. Depending on which version of Isaac Sim you have, this may or may not happen automatically, so better if you choose which joint to exclude from articulation (there should be a checkbox for that in the property tab of the joint prim). If it doesn’t converge correctly, you can try play with the physics solver’s iteration counts, which sit under the property tab in the articulation root prim.


I have found the problem. When I use set_joint_positions, I only specify the active joints in the articulation. If I set all the joint positions including the passive ones, there’s no such problem.

I guess this is because the physics solver takes too make time to calculate the passive joint positions, so it may be unstable or not converging to the correct positions. When I set the passive joint positions as well, it took very few iterations to converge.

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