Configuration File Guide#
This guide describes how to configure the Isaac Sim Replicator Agent (IRA) for simulation and synthetic data generation. The configuration controls the environment, sensor generation and placement, character/robot agents, behaviors, and data generation.
Concepts and Workflow#
Before diving into detailed configuration, review the general workflow and key concepts of an IRA simulation.
Workflow Overview#
Environment Setup: Define the static 3D environment where the simulation takes place.
Agent & Sensor Definition: Configure characters, robots, and cameras (sensors) to populate the environment.
Behavior Configuration: Assign routines (weighted random actions like walking, idling) and triggers (reactive behaviors like when a collision occurs) to actors. Alternatively, drive a group with a behavior tree instead of routines and triggers (experimental; available for both character and robot groups).
Data Generation: Configure the Replicator writers to generate ground-truth data (RGB, segmentation).
Key Concepts#
Environment: The static 3D world (USD stage) loaded for the simulation. It also defines the NavMesh for navigation.
Agents (Actors): Dynamic entities in the scene, which can be Characters (humans) or Robots.
Behaviors: Atomic actions an actor can perform, such as
wander,patrol, oridle.Routines: A collection of behaviors assigned to an actor group. Actors randomly select behaviors from this pool based on assigned weights.
Triggers: Conditional logic that interrupts normal routines. When a condition is met (for example, a specific time or event), the trigger executes its defined list of behaviors in sequence. Once the trigger sequence is complete, the agent resumes its standard routine until another trigger activates.
Behavior Tree (experimental): An alternative to the routine-trigger system. A character or robot group may specify a
behavior_treeJSON asset instead ofroutines/triggers; all of the group’s logic is then authored inside the tree. See Behavior Tree Character Group (Experimental) and Behavior Tree Robot Group (Experimental).Sensors: Cameras placed in the scene to observe the simulation.
Replicator: The system responsible for rendering frames and writing annotated data (ground truth) to disk or cloud storage.
Top-level Structure#
Configs are YAML files with a single root key isaacsim.replicator.agent:
isaacsim.replicator.agent:
version: 1.6.0
environment: { ... } # required
seed: 123456789 # optional; 32-bit (0..4294967295); autogenerated if omitted
simulation_duration: 60.0 # optional; defaults to 60.0
character: { ... } # optional
robot: { ... } # optional
sensor: { ... } # optional
replicator: { ... } # optional
Root Parameters#
version (required): Semantic version of the configuration schema (for example, “1.0.0”).
environment (required): Defines the simulation world.
seed (optional): A 32-bit unsigned integer (0..4,294,967,295). - Used to initialize random number generators for deterministic simulations (for example, character spawn locations, routine variations). - If omitted, a seed is generated based on the current system time.
simulation_duration (optional): The total run time of the simulation in seconds (must be >= 0). - The simulation runs with the timeline’s per-tick
dtset to1/30 sand the application’s loop rate-limited to 30 Hz, giving an effective 30 FPS playback rate. - Defaults to60.0seconds.character (optional): Configures human agents (appearance, behaviors like wander/patrol, and triggers).
robot (optional): Configures robot agents (config path, behaviors/commands, data collection).
sensor (optional): Configures static cameras using placement strategies (for example, aim at targets, coverage).
replicator (optional): Configures data writers (for example, output directory, annotators like RGB/segmentation).
Quick Start (Minimal)#
isaacsim.replicator.agent:
version: 1.6.0
environment:
base_stage_asset_path: "Isaac/Environments/Simple_Warehouse/full_warehouse.usd"
Sections#
Environment#
Defines the static 3D environment and additional assets to load.
base_stage_asset_path(required): Path or URL to the main USD stage. - Supportshttp(s)://(including S3 presigned URLs), Windows/UNC paths, and local filesystem paths. - Also supports paths relative to the Isaac Sim Assets root.prop_asset_paths(optional): A list of additional USD assets to load as sublayers into the stage. This is useful for adding props or lighting to a base environment without modifying it. Supports paths relative to the Isaac Sim Assets root.
Example:
environment:
base_stage_asset_path: "Isaac/Environments/Simple_Warehouse/full_warehouse.usd"
prop_asset_paths:
- "Isaac/Props/Conveyors/ConveyorBelt_A08.usd"
Character#
Defines groups of human characters, their appearance, and their behavior.
root_prim_path(optional): Root path for spawning characters (default:/World/Characters).motion_library_path(optional): Path to a custom motion library file. Supports paths relative to the Isaac Sim Assets root. Default:Isaac/People/MotionLibrary/HumanMotionLibrary.usd.groups: Dictionary of character groups.
There are two types of Character Groups:
BaseCharacterGroup that define Behaviors on Routine-Trigger manners.
BehaviorTreeGroup (experimental) that receives a behavior tree json file.
Base Character Group#
Group Parameters#
num(required): Number of characters to spawn (>= 0).asset_path(optional): USD path to character assets. Supports paths relative to the Isaac Sim Assets root. Default:Isaac/People/Characters/.spawn_areas(optional): List of NavMesh area names where characters can spawn. If empty, spawns anywhere on the NavMesh.semantic_labels(optional): List of[type, data]pairs for semantic segmentation. Default:[["class", "character"]].routines(optional): List of behaviors the characters will execute. Default:[{ wander: {} }].triggers(optional): List of event-based triggers that interrupt routines.colliders(optional): List of colliders to be spawned under the characters.
Behaviors#
Behaviors are defined in the routines list. Common fields:
weight(default 1): Probability weight for selecting this behavior.repeat(default 1): How many times to repeat this behavior before choosing a new one.
Supported Behaviors:
wander: Randomly walk and idle.
walk: -speed_range: [min, max] m/s (default [1.0, 1.0]). -distance_range: [min, max] distance to travel per walk leg (default [5.0, 15.0]). -navigation_areas: List of allowed NavMesh area tags. Each entry must be a unique, non-empty string.idle: Array of idle options. -animation: Name of the animation (must exist in motion lib). -time_range: [min, max] duration in seconds (default [2.0, 5.0]). -weight: Selection probability.
patrol: Follow a specific path.
speed_range: [min, max] m/s (default [1.0, 1.0]).Exactly one of (required): -
path_points: List of 3D points[[x,y,z], [x,y,z], ...]. -target_prims: List of prim paths to visit.Note
Both
path_pointsandtarget_primsmust be on the NavMesh and reachable by the actors.
stop: Stop and idle in place for a random duration.
time_range: [min, max] duration in seconds (default [5.0, 5.0]).
Colliders#
Characters can define a list of colliders to spawn and attach under their root. These colliders are to be used together with collision_trigger (details in Trigger section below) to create scenarios where characters perform behaviors when they are entering or exiting other colliders.
When the following two types of colliders supported are spawned, the collider prim will be applied with PhysicsRigidBodyAPI, PhysicsCollisionAPI and PhysxTriggerAPI:
box: The collider from UsdGeom.Cube.
dimension: The dimension of the cube in x, y, z order (for example, [1.0, 1.0, 1.0]). Value type is Array.
cylinder: The collider from UsdGeom.Cylinder.
radius: The cylinder radius. Value type is Float.
Each colldier also defines a name. This name will be translated into a custom USD String attribute metro:collider:name on the collider, to be used in self_collider or other_colliders from collision_trigger for collision filtering.
The spawned colliders will generate overlap events with other colliders that have PhysicsCollisionAPI. collision_trigger will further filter them by checking if they have the custom USD String attribute metro:collider:name.
However, Collision triggering between two characters will not be detected because Physx does not support triggering between two PhysxTriggerAPI.
The recommended workflow is to pre-define colliders in stage, adding metro:collider:name to them, then set up colliders and collision_trigger in the config file.
character:
groups:
Worker:
asset_path: "Isaac/People/Characters/"
num: 10
colliders:
# Spawn a cylinder collider for each worker
- cylinder:
name: worker_collider_0
radius: 1.2
triggers:
# Worker will pause a few sceonds when it walks into colldiers with name "loading_zone" or "unloading_zone" in stage
- collision_trigger:
self_collider: worker_collider_0
other_colliders: loading_zone;unloading_zone
behavior:
- stop:
time_range: [2.0, 4.0]
Triggers#
Triggers define events that interrupt normal routines to execute a list of reaction behavior.
Each actor can specify a list of triggers to listen to.
priority(default 1): Higher priority triggers override lower ones. Must be >= 1.behavior: List of behaviors to execute in sequence when triggered.
Note
Every trigger variant is strict: unknown keys inside a trigger block fail validation.
Tip
Authoring a specific sequence of actions
Routines select behaviors randomly based on weights, so they are not suited for deterministic sequences. If you need actors to perform actions in a specific order (for example, walk to point A, idle for five seconds, then walk to point B), use a trigger instead. A trigger’s behavior list is always executed in order, making it the right tool for scripted sequences. Use a time_trigger with time: 0 to start the sequence immediately when the simulation begins.
Trigger Types:
event_trigger: Fires on a named carb event.event: The carb event name. Value type is String; must be non-empty.
time_trigger: Fires after a specific time after play.time: The time in seconds. Value type is Float; must be >= 0.
collision_trigger: Fires after a specific collider under this actor begins or ends overlapping with other colliders.self_collider: The name of the collider on this actor to use (spawned by thecollidersfield in the group setting). Value type is String; must be non-empty.other_colliders: (Optional) Semicolon-separated name list of other colliders to react to. Value type is String; defaults to""(react to any collider on the overlap partner).trigger_enter: (Optional) Trigger when entering the overlap. Value type is Boolean. Default is True.trigger_exit: (Optional) Trigger when exiting the overlap. Value type is Boolean. Default is False.
Tip
Dispatching Events from Python
# Send out a custom event named 'my_test_event' import carb carb.eventdispatcher.get_eventdispatcher().dispatch_event(event_name="my_test_event") # Actors spawned by trigger setting will react to `my_test_event`. # triggers: # - event_trigger: # event: my_test_event # priority: 10 # behavior: [...]
Example:
character:
root_prim_path: "/World/Characters"
groups:
warehouse_workers:
asset_path: "Isaac/People/Characters/"
num: 10
spawn_areas: ["warehouse_floor"]
routines:
- wander:
walk:
speed_range: [0.8, 1.5]
distance_range: [5.0, 10.0]
idle:
- animation: look_around
time_range: [2.0, 5.0]
triggers:
- time_trigger:
time: 30.0
priority: 10
behavior:
- patrol: # Move to break room
speed_range: [1.0, 1.2]
target_prims: ["/World/BreakRoom"]
- event_trigger:
event: test_event
priority: 10
behavior:
- patrol:
speed_range: [5.0, 5.5]
path_points:
- [0, 0, 0]
- [0, -5, 0]
# Pause a few sceonds when it walks into colldiers with name "loading_zone" or "unloading_zone"
- collision_trigger:
self_collider: worker_sensing_collider
other_colliders: loading_zone;unloading_zone
behavior:
- stop:
time_range: [2.0, 4.0]
colliders:
- cylinder:
name: worker_sensing_collider # A collider to represent the sensing range of the worker
radius: 10.0
Behavior Tree Character Group (Experimental)#
Warning
Behavior tree character support is experimental and may change in future releases.
When a character group contains a behavior_tree key instead of routines and triggers, IRA treats it as a behavior-tree character group. In this mode, all behavior logic is defined inside the referenced behavior tree rather than through the IRA routine-trigger system.
A single configuration can mix both group types. For example, one group using IRA routines and another using a behavior tree.
Note
routines and triggers fields are not available for behavior-tree groups. Any reactive or conditional logic must be authored as nodes inside the behavior tree itself.
Behavior-Tree-Specific Parameters:
behavior_tree(required): Path or URL to a JSON behavior tree asset. Supports Isaac asset-root-relative paths (for example,Isaac/...), absolute filesystem paths, and paths relative to the config file directory. The tree must reference node libraries such asomni.behavior.tree.coreandomni.anim.behavior.tree.overrides(optional): A YAML multi-line string containing JSON that overrides node port values at runtime without modifying the original tree file. The JSON follows theomni.behavior.treeoverride schema withschemaVersionandinstanceOverrideskeys. Refer to the Behavior Tree’s User Guide for more details on instance overrides.
Shared Parameters (same as IRA character groups):
num(required): Number of characters to spawn (>= 0).asset_path(optional): USD path to character assets. Default:Isaac/People/Characters/.spawn_areas(optional): List of NavMesh area names where characters can spawn.semantic_labels(optional): List of[type, data]pairs. Default:[["class", "character"]].motion_library_path(optional): Path to a custom motion library file.colliders(optional): List of collider objects for the character group.
Minimal Example:
character:
groups:
bt_workers:
num: 3
asset_path: "Isaac/People/Characters/"
behavior_tree: ../sample_behavior_tree/character_wander.json
Example with Overrides:
The overrides field is a JSON string (written as a YAML multi-line block scalar with |) that lets you adjust node parameters per-group without editing the tree file. The JSON structure has two keys:
schemaVersion(required): Must be"2.0.0".instanceOverrides(required): A dictionary mapping node paths (for example,/Root/MoveTo:RandomNavMeshPoint) to port overrides, which is a dictionary of port name to its type and overriden value.
For example, to change the wander radius of a RandomNavMeshPoint modifier node:
character:
groups:
bt_workers:
num: 3
asset_path: "Isaac/People/Characters/"
behavior_tree: ../sample_behavior_tree/character_wander.json
overrides: |
{
"schemaVersion": "2.0.0",
"instanceOverrides": {
"/Root/MoveTo:RandomNavMeshPoint": {
"radius": {
"type": "carb::Float2",
"value": [2.0, 10.0]
}
}
}
}
Mixed Configuration Example (IRA + Behavior Tree):
character:
root_prim_path: "/World/Characters"
groups:
ira_wanderers:
num: 5
routines:
- wander:
walk:
speed_range: [0.8, 1.5]
bt_patrol_group:
num: 3
behavior_tree: ../sample_behavior_tree/character_wander.json
Robot#
Defines robot agents.
root_prim_path(optional): Root path for robots (default:/World/Robots).groups: Dictionary of robot groups.
Robot Group Parameters#
num(required): Number of robots (>= 1).config_file_path(required): Path to the robot agent YAML configuration file for this robot type. Supports absolute paths or paths relative to the built-in sample config folder (data/sample_configs/within theisaacsim.anim.robot.coreextension).spawn_areas(optional): NavMesh areas for spawning.agent_radius(optional): Radius in meters used for NavMesh queries. Must be > 0 when set. If omitted, defaults to0.5at runtime.write_data(optional): Iftrue, enables data collection from the robot’s onboard cameras.camera_prim_paths(optional): List of specific camera prims on the robot to use. If empty andwrite_datais true, all cameras on the robot are used. Requireswrite_datato betrue.semantic_labels(optional): Default[["class", "robot"]].semantic_label_path(optional): Relative path under the robot prim to apply semantics.routines(optional): List of robot behaviors. Default:[{ wander: {} }].triggers(optional): List of triggers that interrupt routines. Robots supportevent_trigger,time_trigger, andcollision_trigger.colliders(optional): List of colliders to spawn and attach under each robot (same schema as charactercolliders; refer to the Colliders section). Used together withcollision_triggerto drive behaviors when the robot enters or exits other colliders.
Robot Behaviors#
wander: -
move: {distance_range: [min, max] (default [10.0, 15.0]),navigation_areas: list of allowed NavMesh area tags, each entry must be a unique, non-empty string (default []) } -idle: {time_range: [min, max] (default [2.0, 5.0]) }patrol (exactly one of
path_pointsortarget_primsis required): -path_points: List of 3D points[[x,y,z], [x,y,z], ...]. -target_prims: List of prim paths to visit.Note
Both
path_pointsandtarget_primsmust be on the NavMesh and reachable by the robots.halt: -
time_range: [min, max] seconds to remain halted (default [5.0, 5.0]).
Behavior Tree Robot Group (Experimental)#
Warning
Behavior tree robot support is experimental and may change in future releases.
When a robot group contains a behavior_tree key instead of routines and triggers, IRA treats it as a behavior-tree robot group. In this mode, all behavior logic is defined inside the referenced behavior tree rather than through the IRA routine-trigger system, and the robot is driven by Animated Robot Behavior Tree Nodes (RobotMoveTo, RobotTurn, RobotIdle, RobotPlayAnimation, and the RobotIsInState modifier).
A single configuration can mix both group types. For example, one routine-driven group and another behavior-tree-driven group.
Note
routines, triggers, and colliders are not available for behavior-tree robot groups. Any reactive or conditional logic must be authored as nodes inside the behavior tree itself.
Behavior-Tree-Specific Parameters:
behavior_tree(required): Path or URL to a JSON behavior tree asset. Supports Isaac asset-root-relative paths (for example,Isaac/...), absolute filesystem paths, and paths relative to the config file directory.overrides(optional): A YAML multi-line string containing JSON that overrides node port values at runtime without modifying the original tree file. Follows theomni.behavior.treeoverride schema (schemaVersion+instanceOverrides); see Behavior Tree Character Group (Experimental) for an example.
Shared Parameters (same as IRA robot groups):
num(required): Number of robots to spawn (>= 1).config_file_path(optional): Path to the per-robot agent YAML (default:nova_carter.yaml).spawn_areas(optional): List of NavMesh area names where robots can spawn.agent_radius(optional): NavMesh query radius in meters (must be > 0 when set).semantic_labels(optional): Default[["class", "robot"]].semantic_label_path(optional): Relative path under the robot prim to apply semantics.
Minimal Example:
robot:
groups:
bt_carters:
num: 2
config_file_path: nova_carter.yaml
behavior_tree: ../sample_behavior_tree/robot_wander.json
Sensor#
Defines static cameras in the scene. Cameras are organized into named groups.
root_prim_path(optional): Absolute prim path where all camera groups will be created (default:/World/Cameras).groups: A dictionary where keys are group names and values define the camera configuration.
Group Configuration#
Each group must specify num (number of cameras) and one placement strategy (aim_at_targets OR maximum_coverage).
- For aim_at_targets, num must be >= 0.
- For maximum_coverage, num can be >= -1. If -1, the number of cameras is automatically calculated based on the grid resolution and coverage ratio.
1. Placement Strategy: aim_at_targets
Places cameras to look at specific targets.
targets(optional): List of target prim paths (for example,/World/Characters) or identifiers.raycast_density(optional): Density of rays used to find valid camera positions. Higher values are more precise but slower.yaw_range(optional): [min, max] degrees (0..360) for the camera’s rotation around the target.occlusion_threshold(optional): Threshold for filtering occluded views (-1 to disable).
2. Placement Strategy: maximum_coverage
Places cameras to maximize visual coverage of the environment.
target_coverage_ratio(optional): Desired coverage ratio (0.0 to 1.0). Default0.9.grid_resolution(optional): Size of the grid cells (in meters) used for coverage calculation. Default1.0.
Shared Parameters
These apply to all placement strategies:
height_range: [min, max] height in meters (Z-axis).look_down_angle_range: [min, max] pitch angle in degrees (0 = horizontal, 90 = straight down).focal_length_range: [min, max] focal length in millimeters.distance_range: [min, max] distance from the camera to its target or interest point in meters.
Example:
sensor:
root_prim_path: "/World/Cameras"
groups:
ceiling_cameras:
num: 20
aim_at_targets:
targets: ["/World/Characters"]
distance_range: [5, 10]
height_range: [7, 10]
focal_length_range: [10, 15]
look_down_angle_range: [30, 45]
coverage_cameras:
num: 5
maximum_coverage:
target_coverage_ratio: 0.8
height_range: [2, 5]
Replicator#
Controls the generation of synthetic data (images, annotations) using Omniverse Replicator.
writers(required): Dictionary of writer configurations.hide_debug_visualization(optional, defaulttrue): Hides debug visualizations (NavMesh, skeletons, lights) during data capture.
Writer Configuration#
Supported writers: IRABasicWriter, CosmosIRAWriter, SceneGraphWriter, CustomWriter.
Note
In previous releases, the stock Replicator BasicWriter appeared as its own entry in the Add Writer dropdown and could be used directly as a writer key (for example, BasicWriter:). Starting with version 1.6.1 of isaacsim.replicator.agent.core, BasicWriter has been removed from the UI dropdown and is no longer accepted as a top-level writer key in the configuration. If you need the stock BasicWriter, use a CustomWriter entry with writer_name: "BasicWriter" instead. Refer to the CustomWriter section below for details.
Common Settings per Writer:
Timing: -
start_frame/end_frame: Frame-based control (inclusive/exclusive). Defaults tostart_frame: 30if not specified. -start_time/end_time: Time-based control (seconds).Sensors: -
sensor_prim_list: Optional list of cameras to use. If omitted, uses all cameras defined insensor.root_prim_path.
Output Settings:
output_dir: Local directory for output. Defaults to~/IRA_outputif not set.s3_bucket,s3_region,s3_endpoint: For direct S3 upload.
Common Annotators (Parameters):
rgb: RGB Image.bounding_box_2d_tight/loose: 2D Bounding boxes.bounding_box_3d: 3D Bounding boxes.semantic_segmentation: Pixel-wise semantic class IDs.instance_segmentation: Pixel-wise instance IDs.distance_to_camera: Depth map.normals: Surface normals.motion_vectors: Pixel motion.colorize_*: For example,colorize_semantic_segmentation(save as visible color map compaired to raw ID).
Specialized Writers#
IRABasicWriter:
The foundational writer for Agent simulations, derived from Replicator’s
BasicWriter. It organizes output into separate folders per annotator and consolidates object and agent metadata intoobject_detection.json.Key Features:
Folder Structure: Outputs each annotator’s data into separate folders for better readability.
Object Detection: Consolidates bounding box and skeleton data into a single file named
object_detection.json.Default Semantic Filter:
class:character|robot;id:*(captures characters and robots).Action data output: When object detection is enabled (object_info or agent_info annotators are on), the action data for each IRA actor will be included as well.
Overwritten Annotators: The following standard annotators are replaced by specialized
object_info_*versions and written toobject_detection.json:bounding_box_2d_tightbounding_box_2d_loosebounding_box_3dskeleton_data(replaced byagent_info_skeleton_data)
Defaults:
rgb: Enabled.camera_params: Enabled.S3-related parameters: Disabled.
Special Parameters:
video_rendering_annotator_list: Generates.mp4videos for specified annotators (for example,["rgb", "semantic_segmentation"]).agent_info_skeleton_data: Exports 2D/3D skeleton joints for characters.
Action data:
Action data is for describing the current behavior of each actor. It is in
object_detection.jsonunder themetro_agent_datasection. Data includes:prim path: The prim path of the actor schema is applied.agent_type: The actor schema type.agent_name: The name of the actor.agent_group: The group name of the actor.world_position: Actor position (vec3) in world space.world_rotation: Actor rotation (quaternion) in world space.world_moving_direction: Actor moving direction (vec3) in world space.nullmeans actor is not moving.world_facing_direction: Actor facing direction (vec3) in world space.speed: The actor moving speed.current_task_name: Actor’s current action name (not behavior name).asset_url: The asset URL of the actor.
IRABasicWriter example:
replicator: writers: IRABasicWriter: output_dir: "<your_output_directory>" start_frame: 0 end_frame: 300 rgb: true camera_params: true bounding_box_2d_tight: true semantic_segmentation: true agent_info_skeleton_data: true video_rendering_annotator_list: ["rgb", "semantic_segmentation"]
CosmosIRAWriter:
Adds “Cosmos” Specific post-processing.
shaded_seg: Shaded segmentation visualization.canny_edge: Canny edge detection filter (withcanny_threshold_low/high).
SceneGraphWriter:
Writes per-frame scene captions alongside the standard output. This writer is provided by the
Isaacsim.Replicator.Captionextension; for configuration and a complete example, refer to Use Isaacsim.Replicator.Caption in Isaacsim.Replicator.Agent.CustomWriter:
A flexible wrapper that delegates to any writer registered in
omni.replicator.core.WriterRegistry. UseCustomWriterwhen you want to use a third-party writer, a writer from another extension, or your ownomni.replicator.core.Writersubclass without modifying the IRA codebase.Required parameters:
writer_name(string, required): The registry name of the target writer (for example,"BasicWriter","KittiWriter", or a user-defined name). Any writer registered inWriterRegistrycan be referenced here, including the stock ReplicatorBasicWriter.
Optional parameters:
writer_scope(string, optional): A flexible field for discovering and registering writers that are not yet in theWriterRegistry. It accepts three input modes, auto-detected by the system:Package or module path (for example,
"omni.replicator.core"): scans all submodules for concreteWritersubclasses and batch-registers them.Full class path (for example,
"my_extension.writers.MyWriter"): imports and registers a single specific writer class.Filesystem path to a
.pyfile (for example,"<path/to/your_writers.py>"): loads the file and registers allWritersubclasses defined in it.
Use
writer_nameto select the specific writer from the discovered set.
Additional parameters: All other key-value pairs in the YAML block are passed directly to the target writer’s
initialize(**kwargs)call. Only parameters you explicitly list override the writer’s built-in defaults; unlisted parameters keep the writer’s own default values.
How parameter discovery works
When a
CustomWriterentry is loaded, the system introspects the target writer’s__init__signature to discover all accepted parameters along with their types and default values. A typed Pydantic model is dynamically generated from this signature, which enables:Type validation: Supplied parameter values are checked against the writer’s expected types before the simulation starts.
UI integration: In the Configuration Editor UI, each discoverable parameter appears as an addable field with the correct widget type. Click Add Parameter to override a default, or remove a parameter to revert to the writer’s own default.
Parameters whose types cannot be represented in JSON (for example, custom backend objects) are excluded from the dynamic model and the UI but can still be passed in YAML.
Note
Some writers accept
widthandheightparameters that configure the writer’s output dimensions but do not modify the underlying RenderProduct resolution. To change the actual rendered resolution, first adjust the RenderProduct Resolution in the CustomWriter UI panel, then set the writer’swidthandheightparameters to match.Auto-registration using writer scope
If the writer class is not yet in the
WriterRegistrywhen the config is loaded, providewriter_scopeto have IRA discover and register it automatically. The system auto-detects which mode to use based on the value:File path (contains
/,\, or ends with.py): loads the.pyfile from disk and registers allWritersubclasses found in it.Single class path (last segment starts with an uppercase letter, for example
"my_extension.writers.MyWriter"): imports and registers that one class.Package scan (for example
"omni.replicator.core"): recursively walks the package and registers all concreteWritersubclasses.
Already-registered writers are skipped silently. After resolution, select the target writer using the
writer_namefield.If
writer_scopeis omitted, the writer must already be registered (for example, by enabling the extension that provides it).Using CustomWriter in the UI
When adding a
CustomWriterthrough the Configuration Editor:Click Add Writer and select CustomWriter from the type list.
A dedicated dialog appears with two fields:
Writer Name: A dropdown listing all writers currently in the
WriterRegistry. Select the target writer.Writer Scope: An optional text field that accepts a package path, a dotted class path, or a filesystem path to a
.pyfile. Click Register to discover, validate, and register writers from the scope, which also refreshes the Writer Name dropdown.
Click OK to confirm. The editor displays the writer’s name as a read-only label and lists all currently set parameters with their values.
Use the Add Parameter dropdown at the bottom to override additional defaults from the writer’s
__init__signature.
Important
Always click OK to confirm after selecting or registering a writer. The CustomWriter is not added until you confirm the dialog.
Note
The Writer Scope field in the UI replaces the former Class Path field. It accepts all three input modes (package path, class path, and file path) and the system auto-detects which mode to use.
Note
Parameter names displayed in the UI are derived automatically from the writer’s
__init__signature (for example,sensorSetNameinRTSPStreamWriter). Because users can import custom or third-party writers, no specific naming format is enforced. The UI capitalizes the first letter of each name for readability (for example,sensorSetNameappears as SensorSetName), but the original name is used when passing values to the writer.Multiple CustomWriter instances
You can configure multiple
CustomWriterentries in the same config. Append a numeric suffix to create unique keys:replicator: writers: CustomWriter: writer_name: "<your_writer_name>" <writer_param>: <your_value> CustomWriter_1: writer_name: "<your_other_writer_name>" <writer_param>: <your_value>
The suffix (
_1,_2, and so on) is stripped when resolving the writer type; thewriter_namefield determines which registry writer is used.For a step-by-step walkthrough that uses
CustomWriterto set up live RTSP streaming, refer to Example: RTSP streaming with CustomWriter.CustomWriter examples:
# Use a registered writer, overriding only specific defaults replicator: writers: CustomWriter: writer_name: "<your_writer_name>" <writer_param>: <your_value>
# Auto-register a writer class by its dotted import path replicator: writers: CustomWriter: writer_name: "<your_writer_name>" writer_scope: "<your_package.module.ClassName>" <writer_param>: <your_value>
# Discover all writers from a package replicator: writers: CustomWriter: writer_name: "<your_writer_name>" writer_scope: "<your_package>" <writer_param>: <your_value>
# Load writers from a standalone .py file replicator: writers: CustomWriter: writer_name: "<your_writer_name>" writer_scope: "<path/to/your_writers.py>" <writer_param>: <your_value>