I encountered a phenomenon that violates the laws of physics while using Isaac Sim for simulation. A block initially positioned on the ground experiences an upward force equal to m*g applied to it. The block’s acceleration decreases from a positive value gradually to zero, eventually transitioning into uniform upward linear motion. However, in the real world, such a phenomenon wouldn’t occur, and the block wouldn’t move upward. How should I adjust to make the simulation adhere to the laws of physics?
I have attached the code and the usda file used to reproduce the issue. You can reproduce the problem by running python reproduce.py . (I have set breakpoints and printed acceleration and height. You can see that the acceleration starts at 18, then gradually decreases to 0, and the object keeps moving upwards.)
My Isaac Sim version is 2023.1.0-hotfix.1, operating system is Ubuntu 20.04, and Python version is 3.10.
if i > 0 and i % 1 == 0:
dc = _dynamic_control.acquire_dynamic_control_interface()
rigid_body = dc.get_rigid_body(str(prim.GetPath()))
dc.apply_body_force(rigid_body, [0, 0, 1*mass*GRAVITY_SCALE], [center_of_mass[0], center_of_mass[1], center_of_mass[2]], True)
in this part of the code you are applying a force equal to m*g upwards to it. I believe if you remove this dc.apply_body_force call the block should fall in place accordingly.
Yes. However, even if a force equal to mg is applied upwards, in the real world, the cube should not have an upward acceleration. Yet, in Isaac Sim, the cube has an upward acceleration, which I think is unreasonable.
Furthermore, if I apply an upward force of 2mg to the cube, according to the laws of physics, the cube’s acceleration should be equal to g, in the upward direction. However, in Isaac Sim, the cube’s acceleration is much greater than g.
You are correct - the dc apply force doesn’t override gravity - the issue in your code is that according to apply_body_force documentation the last boolean is whether the force is in global coordinates - so you need to add the global position of the body in the third argument where it’s only applying the center of mass.
z0 = transform_t0.ExtractTranslation()
if i > 0 and i % 1 == 0:
dc = _dynamic_control.acquire_dynamic_control_interface()
rigid_body = dc.get_rigid_body(str(prim.GetPath()))
dc.apply_body_force(rigid_body, [0, 0, mass*9.81], [z0[0] + center_of_mass[0], z0[1] + center_of_mass[1], z0[2] + center_of_mass[2]], True)