Glue multiple objects together to apply a single semantic class?

I want to generate people walking and people riding scooters (or pallet jacks). I need to have three classes: person, scooter, person_on_scooter. It’s easy to reference a person usd and a scooter usd to scatter them on the floor and have correct semantic classes.

How do I randomize people on scooters while maintaining separate classes for person and scooter, but also applying a single semantic annotation to the combo person+scooter so it comes as a single bounding box?

@pcallender @hclever @jiehanw

Plot twist: I have 20 different person usd files and 3 scooters that I also need to mix and match. So manual usd creation won’t cut it.

paging @pcallender

Hi @Turowicz , you can create a new xform prim and put both the people prim and scooter prim under that newly created prim. You can then assign a new semantic label person_on_scooter to that parent prim. Then you are good to go. The bounding box annotator will output any prim that has a semantic label.

To change the prim’s prim path, you can follow this:

person = rep.randomizer.instantiate(...)
person_prim = person.get_input_prims()
omni.usd.duplicate_prim(stage, person_prim, new_path)

We’ll add an api in replicator to make this workflow eaiser.

What I did is I have created a USD file with 2 xForms that I use to load variants as payload. It works but ideally I would like to do it in the YAML without the need to create custom USDs. Mark a group of objects and say that is a semantic class.

I tried manipulating the visibility instead of payload variants in the custom USD but there were too many variants of sub-objects and the generation was crashing OOM.