Conveyor belt as part of a robot

Hi, I would like to use a conveyor belt as part of a robot / articulation. However, it seems like this will not work with the existing conveyor belt extension:

[Error] [omni.physx.plugin] Setting linear velocity of non-root articulation links is not supported.

Are there any known alternatives to the linear velocity setting approach? Perhaps somehow through the friction / contact models?
I am also considering to just have the conveyors as very long links that could be moved by a linear joint.

The end goal is to be able to train the manipulation using the conveyors in the robot to convey objects with RL. Ideally I want to use the Orbit extension, which however only supports control of proper joints. Maybe I could have dummy joints and bind them to the conveyor belts such that their speed is equal.

I also have a concern about the performance, as I need GPU-optimized training.
From https://docs.omniverse.nvidia.com/isaacsim/latest/features/physics/physX_limitations.html:

The conveyor belt feature will trigger a CPU code path, so it is best to avoid for maximum GPU pipeline performance.

Which part of the implementation triggers CPU code? Could it be avoided?

Anyone anything on this? I tried setting conveyor speeds through the RigidBody interfaces, however the speeds did not get applied, looks like it does not work with bodies that are also kinematic.

I have a solution now where I am setting the speed through USD APIs, however I suspect that this is slowing the simulation down substantially as I have to manually loop in Python over the scenes. Is there perhaps a way to do it through the fabric / flatcache extensions to bypass USD and set the velocity directly in PhysX? I could not find any documentation on flatcache. @AlesBorovicka perhaps knows?

Thanks!

Hi,
currently the body has to be kinematic and hence it cant be part of articulation.
For the upcoming release, there is a dedicated PhysxSurfaceVelocityAPI that can be applied to arbitrary rigid bodies (even those that are part of articulation).
For now you would have to indeed set the velocity manually.

Yes, if you enable omni.physx.fabric extension then you should be able to change the Fabric attributes using USDRT in python.
You could use a script like this:

from pxr import Usd, UsdGeom, UsdUtils
import omni.usd

from usdrt import Usd as UsdRtUsd
from usdrt import Sdf as RtSdf
from usdrt import Gf as RtGf

stage = omni.usd.get_context().get_stage()
stage_id = UsdUtils.StageCache.Get().GetId(stage).ToLongInt()

usdrt_stage = UsdRtUsd.Stage.Attach(stage_id)
prim = usdrt_stage.GetPrimAtPath("/World/boxActor")

vel_attr  = prim.GetAttribute("physics:velocity")
print(vel_attr.Get())
vel_attr.Set(RtGf.Vec3f(1,1,1))

Something like this should work and should be faster to process.
Regards,
Ales

Hi, thank you for the fast answer!

This indeed works and speeds up the computation on CPU by a factor of 2-3. However it seems to lead to issues on GPU, not sure why.

However in my case the GPU computation still runs slower than CPU, so it is not currently a pressing issue for me.

The upcoming release sounds promising, is there a timeline yet?

Thanks, have a nice day

The next release should be in about a month or so.