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.arm exposes resource group arm with two joints;
  • articulations.door exposes resource group door with 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

python
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.

python
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.

python
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.

python
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:

bash
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:

text
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.