Prerequisites
- Python 3.12
- FastSim
0.1.0a6 - UniRoboSim Core
0.10.0 - UniRoboSim Isaac Lab adapter
0.10.1 - Isaac Lab 3.0 / Isaac Sim 6.0 and a working display
Configuration
The Scenario contains two independent controllable entities:
robots.armexposes resource grouparmwith two joints;articulations.doorexposes resource groupdoorwith one hinge.
The door is not treated as a robot. Both are articulations, and both advertise their portable control contracts through the same public descriptor API.
Key code, line by line
descriptors = await simulation.control.targets()
This returns immutable ControlTargetDescriptor values for this compiled Run. It
does not expose a PhysX articulation view or a native joint index.
space = next(
item for item in descriptor.command_spaces
if item.command_space_id == "joint.position@1"
)
axes = tuple(axis.name for axis in space.axes)
units = tuple(axis.units[0] for axis in space.axes)
The program obtains axis order and units from the chosen command-space descriptor. It never assumes that a backend uses the same private joint indices.
track = ControlTrack(
track_id=f"tutorial-{descriptor.resource_group}",
resource=ActuatorResource(descriptor.entity_id, descriptor.resource_group),
controller=space.controller_ids[0],
command_space=space.command_space_id,
frames=(ControlFrame(...), ControlFrame(...)),
interpolation=interpolation,
semantics=semantics,
)
The entity ID, group, compatible controller, command space, axes, units, supported
interpolation, and required semantics all come from public descriptors. Only the
tutorial target values (0.7/-0.45 rad for the arm and 0.65 rad for the door) are
application intent.
operation = await simulation.control.submit_tracks(tracks, timeout=10.0)
The tuple contains exactly two non-overlapping tracks. FastSim creates one chunk and one terminal result, rather than submitting unrelated arm and door operations.
Run it
From this case directory:
cd demo/fundamentals/15_multi_resource_tracks
fastsim config validate run.yaml --json
python main.py
Expected output includes two discovered resources, one
succeeded operation, and 2/2 frames for each track.
Verification level
REAL VISIBLE ISAAC PASS. The case passed with FastSim 0.1.0a3, Core 0.10.0,
Isaac adapter 0.10.1, Isaac Lab 3.0, and Isaac Sim 6.0. The native run discovered:
articulations.door:door
robots.arm:arm
Both tracks completed 2/2 frames inside one succeeded operation and one synchronized
control boundary. The process exited normally without leaving an Isaac worker behind.
Common errors
- Hard-coding native joint indices: use descriptor axes and units instead.
- Reusing one resource in two tracks: one chunk may not contain overlapping resource owners.
- Sending arm and door separately: that no longer proves multi-resource atomicity.
- Treating the door as a robot:
articulations.*is the correct Scenario group. - Depending on rollback after a provider rejects the middle of a native batch: the current World SPI has no rollback primitive, so FastSim fails the adapter closed.
Next: 16 · Backend selection.