What is the correct way to build a simulated rope?

Hi there. I am trying to build up a robot transportation task where we want to programmatically build ropes and attach a payload to my robot with them. However, so far I’ve come across these issues:

  1. What is the best way to create a rope? I tried connecting capsules with spherical joints. It seems fine when simulated alone but keeps causing non-physical behaviors and simulation errors when attached to a robot’s body. I wonder what’s the best way to do this.
  2. I want to keep the robots as articulations and create ArticulationViews. Currently this seems impossible because after assembling the requirement of a tree structure is violated and trying to initialize an ArticulationView reports error. Is there any solution to this?

Hi,
currently the only way to create the ropes is to use capsules and connect them with joints, see for example the physics ropes demo (Windows->Simulation->Demos->Rope).
One thing that you should make sure is that the joints are excluded from the articulation, there is a bool exclude from articulation on a joint:

Otherwise if you connect the rope to the articulation, the parsing will try to create a graph including those joints and the whole system would be solved as one articulation, which would not be desired.

Note that in next release we plan to release joint instancer, that would allow to create the ropes more easily.

In the long term, we are trying to add more tech to support better rope simulation, but currently using capsules and spherical joints is the best way to do, try the ropes demo to see what the sim can look like.

Regards,
Ales

2 Likes

Thanks! I managed to make a rope similar to that in the example. However, the simulation seems to become very unstable (objects blowing themselves away and Cuda errors) when I attached four ropes from four robots (simulated drones as Articulations) to a payload (objects.DynamicCube), with all collisions disabled.

It keeps giving error messages like:

2023-03-07 15:34:34 [24,902ms] [Error] [omni.physx.plugin] PhysX error: PxGeometryQuery::getWorldBounds(): pose is not valid., FILE /buildAgent/work/f25a4639a4b1bdc1/source/geomutils/src/GuGeometryQuery.cpp, LINE 319

I suspect it is related to the capacity of the GPU buffers, i.e.,
gpu_max_rigid_contact_count: 5242880
gpu_max_rigid_patch_count: 33554432
gpu_found_lost_pairs_capacity: 4194304
gpu_found_lost_aggregate_pairs_capacity: 335544320
gpu_total_aggregate_pairs_capacity: 41943040
gpu_max_soft_body_contacts: 1048576
gpu_max_particle_contacts: 1048576
gpu_heap_capacity: 134217728
gpu_temp_buffer_capacity: 33554432
gpu_max_num_partitions: 8
and the simulation parameters. But the Doc has no clear description of these parameters.

Is it currently a limitation of Isaac Sim or I have missed something? What do those gpu buffer parameters mean?

Yes, those are preallocated buffers for the GPU simulation, if you try to simulate really long rope you will have to increase those.
For a start you can try to simulate this on the CPU first:
a) select PhysicsScene (or create one if you dont have it) (here you actually have those buffers configurable in the GPU section at the bottom if you want to run on GPU)
b) set GPU dynamics to false, set broadphase to MBP

Thanks! I also found doing the simulation on CPU is more stable and with masses of near magnitudes things look fine.

I have ropes of 24 links (much shorter than the example) but a large number of them (>1000), created by a GridCloner. How can I decide what are the reasonable values for the GPU buffers?

You should see in the log what was the required size, the first error should tell you what the expected size is, then you get a lot of errors because something failed. But the first error should tell you want and how to increase the buffer.

I looked into the logs but the first error is not telling me what is wrong.

It looks like the following. This is even before the articulation creation messages.

2023-03-08 16:53:46 [20,049ms] [Info] [omni.kit.menu.utils.scripts.utils] omni.kit.menu.utils.refresh_menu_items Create

2023-03-08 16:53:52 [26,353ms] [Info] [omni.kit.manipulator.prim.model] Tf.Notice.Register in PrimTransformModel

2023-03-08 16:53:52 [26,353ms] [Info] [omni.kit.menu.utils.scripts.utils] omni.kit.menu.utils.refresh_menu_items Create

2023-03-08 16:53:52 [26,360ms] [Info] [omni.appwindow.plugin] Created window: width=210,height=114.

2023-03-08 16:53:52 [26,360ms] [Info] [omni.kit.renderer.plugin] Attaching default app window “omni.ui.scene.Widget capture”

2023-03-08 16:54:26 [60,766ms] [Error] [omni.physx.plugin] PhysX error: PxGeometryQuery::getWorldBounds(): pose is not valid., FILE /buildAgent/work/f25a4639a4b1bdc1/source/geomutils/src/GuGeometryQuery.cpp, LINE 319

2023-03-08 16:54:26 [60,766ms] [Error] [omni.physx.plugin] PhysX error: PxGeometryQuery::getWorldBounds(): pose is not valid., FILE /buildAgent/work/f25a4639a4b1bdc1/source/geomutils/src/GuGeometryQuery.cpp, LINE 319

2023-03-08 16:54:26 [60,766ms] [Error] [omni.physx.plugin] PhysX error: PxGeometryQuery::getWorldBounds(): pose is not valid., FILE /buildAgent/work/f25a4639a4b1bdc1/source/geomutils/src/GuGeometryQuery.cpp, LINE 319

2023-03-08 16:54:26 [60,766ms] [Error] [omni.physx.plugin] PhysX error: PxGeometryQuery::getWorldBounds(): pose is not valid., FILE /buildAgent/work/f25a4639a4b1bdc1/source/geomutils/src/GuGeometryQuery.cpp, LINE 319

2023-03-08 16:54:26 [60,766ms] [Error] [omni.physx.plugin] PhysX error: PxGeometryQuery::getWorldBounds(): pose is not valid., FILE /buildAgent/work/f25a4639a4b1bdc1/source/geomutils/src/GuGeometryQuery.cpp, LINE 319

2023-03-08 16:54:26 [60,767ms] [Error] [omni.physx.plugin] PhysX error: PxGeometryQuery::getWorldBounds(): pose is not valid., FILE /buildAgent/work/f25a4639a4b1bdc1/source/geomutils/src/GuGeometryQuery.cpp, LINE 319

2023-03-08 16:54:26 [60,767ms] [Error] [omni.physx.plugin] PhysX error: PxGeometryQuery::getWorldBounds(): pose is not valid., FILE /buildAgent/work/f25a4639a4b1bdc1/source/geomutils/src/GuGeometryQuery.cpp, LINE 319

2023-03-08 16:54:26 [60,767ms] [Error] [omni.physx.plugin] PhysX error: PxGeometryQuery::getWorldBounds(): pose is not valid., FILE /buildAgent/work/f25a4639a4b1bdc1/source/geomutils/src/GuGeometryQuery.cpp, LINE 319

2023-03-08 16:54:26 [60,767ms] [Error] [omni.physx.plugin] PhysX error: PxGeometryQuery::getWorldBounds(): pose is not valid., FILE /buildAgent/work/f25a4639a4b1bdc1/source/geomutils/src/GuGeometryQuery.cpp, LINE 319

I see, so there is something trying to add NaN into the system, please is there a way for me to check the assets?

Some asset is bringing NaN into physics, that will cause issues to the simulation, not sure if you can identify the asset, but there seems to be some mesh with an invalid transformation.