mcpField
D
data-collection-sim

data-collection-sim

github.com/isaac-simData & databases4.4k39 installsUpdated 5d ago
Repository

About data-collection-sim

A synthetic data generation skill for Isaac Sim users, designed to capture annotated static scenes in headless batch runs. Replicator writers output RGB, depth, segmentation, bounding boxes, and pose data, with configuration-driven capture and randomization.

Key features

  1. 01Capture static-scene data in headless batches
  2. 02Output RGB, depth, and segmentation annotations
  3. 03Support bounding boxes and pose data
  4. 04Write data to disk with Replicator writers
  5. 05Control capture with configuration and randomization

Use cases

  1. 01Generate synthetic images for vision model training
  2. 02Capture annotated frames from warehouse scenes in batches
  3. 03Validate frame counts and annotations in generated data

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/isaac-sim/isaacsim --skill data-collection-sim

After installing, type/data-collection-simin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

scripts/
minimal_sdg_pipeline.py
production_capture_qa.py
production_qa_config.yaml
shelf_pose_grid_capture.py
validate_sdg_output.sh
warehouse_sdg.py

Details

From the project README

Data Collection Simulation

Purpose

Produce annotated static-scene synthetic data with Replicator writers (RGB, depth, segmentation, pose, Kitti/COCO variants) in headless batch runs.

Prerequisites

  • Built Isaac Sim ($ISAAC_SIM_DIR or _build/linux-x86_64/release).
  • NVIDIA GPU with a current driver (nvidia-smi).
  • Shell env contract from isaac-sim-orchestrator: $ISAAC_SIM_DIR, $ISAAC_LAB_DIR, $WORKSPACE_DIR.

Limitations

  • Targets Isaac Sim 6 / Kit 110 unless a section states otherwise.
  • Does not replace official NVIDIA documentation for unsupported edge cases.

Troubleshooting

Error / symptomCauseSolution
Extension or import not foundWrong $ISAAC_SIM_DIR or stale buildPoint env vars at _build/linux-x86_64/release or rebuild
Black or empty framesMissing lights or non-RTX render modeAdd dome/key light; confirm RTX / PathTracing settings
Hang on stage load or first renderMDL compile or oversized stageFollow isolation steps in isaac-sim-troubleshooting

Build headless SDG pipelines using Isaac Sim 6.0 Replicator. Outputs annotated frames (RGB, depth, segmentation, bbox, pose) to disk via writers.

Available Scripts

ScriptPurposeArguments
scripts/minimal_sdg_pipeline.pyMinimal static-scene SDG pipeline using Isaac Sim Replicatorsee script --help
scripts/shelf_pose_grid_capture.pyShelf pose grid capture for static-scene SDGCLI flags via argparse (see script --help)
scripts/validate_sdg_output.shValidate sdg outputpositional args per script header (see script)
scripts/warehouse_sdg.pyWarehouse sdgCLI flags via argparse (see script --help)

Running scripts

From agent runtimes that expose skill execution helpers, invoke helpers with run_script():

run_script("scripts/minimal_sdg_pipeline.py", args=["--help"])

From a built Isaac Sim tree, run the same file with ./python.sh (Linux) or python.bat (Windows) from _build/*/release, or execute shell helpers directly when they do not require the simulator.

Related Skills

  • mobility-gen — mobile-robot trajectory recording then replay+render (two-phase, robot-mounted sensors)
  • isaac-sim-sensor — sensor primitives (camera, LiDAR, IMU, contact)
  • occupancy-map — produces occupancy maps for spawn placement

Architecture

Config (YAML/JSON) → SimulationApp (headless) → Scene Setup → Randomizers → Capture Loop → Writer → Disk

Required Imports

from isaacsim import SimulationApp
simulation_app = SimulationApp({"renderer": "RealTimePathTracing", "headless": True})

import carb.settings
import omni.replicator.core as rep
import omni.usd
import isaacsim.core.experimental.utils.stage as stage_utils
from isaacsim.core.experimental.utils.semantics import add_labels, remove_all_labels
from isaacsim.storage.native import get_assets_root_path

stage_utils.open_stage() / stage_utils.add_reference_to_stage() / stage_utils.define_prim() / stage_utils.get_current_stage() are the Kit 110 replacements for the legacy isaacsim.core.utils.stage.* and isaacsim.core.utils.prims.create_prim flow. Keep omni.replicator.core for SDG primitives.

Migration: for the full omni.isaac.* → isaacsim.* mapping, see Renaming Extensions.

Writers

Resolve writers via rep.WriterRegistry.get(name) (or rep.writers.get(name), same registry).

omni.replicator.core built-in writers (omni.replicator.core/scripts/writers_default/):

WriterUse case
BasicWriterRGB, bbox_2d (tight/loose), bbox_3d, semantic/instance/instance_id segmentation, depth (image-plane / camera), normals, occlusion, motion vectors, camera params, pointcloud, skeleton
KittiWriterKITTI-format datasets
CocoWriterCOCO-format datasets (instance/bbox)
CosmosWriterCosmos warehouse video clips (PNG sequences + MP4 per modality: rgb, shaded_seg, segmentation, depth, edges). Requires /app/omni.graph.scriptnode/opt_in = True
FPSWriterFrame-rate / capture-time telemetry
Custom Writer subclassdirect access to annotator tensors (subclass omni.replicator.core.Writer, register with rep.writers.register_writer)

isaacsim.replicator.writers adds Isaac-specific writers:

WriterUse case
PoseWriter6-DoF object pose estimation (optional write_debug_images=True)
DataVisualizationWriterdebug / overlay visualization

Deprecated and not for new work: DOPEWriter, YCBVideoWriter, PytorchWriter, PytorchListener (also OgnPose node). They will be removed in a future major release.

Writer initialization patterns

Two equivalent patterns are supported. Recent (Isaac Sim 6.0+) examples favor the explicit-backend form:

backend = rep.backends.get("DiskBackend")
backend.initialize(output_dir="/tmp/sdg_output")
writer = rep.writers.get("BasicWriter")
writer.initialize(backend=backend, rgb=True, bounding_box_2d_tight=True)
writer.attach(rp)

Legacy short form (still works; backend created implicitly from output_dir):

writer = rep.WriterRegistry.get("BasicWriter")
writer.initialize(output_dir="/tmp/sdg_output", rgb=True, bounding_box_2d_tight=True)
writer.attach(rp)

Annotators

Core annotators available via rep.annotators.get(name):

  • rgb — RGBA uint8
  • distance_to_image_plane — depth float32
  • semantic_segmentation — per-pixel class labels
  • instance_segmentation — per-pixel instance IDs
  • bounding_box_2d_tight — tight 2D bboxes
  • bounding_box_2d_loose — loose 2D bboxes
  • bounding_box_3d — 3D bboxes in world coords
  • camera_params — intrinsics, extrinsics, resolution
  • occlusion — visibility ratio per instance
  • normals — surface normals
  • pointcloud — 3D point cloud from depth

Minimal Pipeline

run_minimal_sdg_pipeline(output_dir, num_frames, rt_subframes) — open a warehouse stage, tag a prop with semantic labels, create a camera, attach a BasicWriter, and run the capture loop.

See scripts/minimal_sdg_pipeline.py.

Full warehouse pipeline

For a config-driven, headless warehouse capture (YAML config, --num-frames, --output-dir), see scripts/warehouse_sdg.py. Validate the produced dataset with scripts/validate_sdg_output.sh:

bash scripts/validate_sdg_output.sh <output_dir> [expected_frames]

Domain Randomization

Use rep.functional API for randomization each frame:

# Scatter objects on surface
rep.functional.randomizer.scatter_2d(prims=objects, surface_prims=plane, check_for_collisions=True, rng=rng)

# Randomize camera pose
rep.functional.modify.pose(cam, position_value=rng.uniform(pos_min, pos_max),
                           look_at_value=target_prim, look_at_up_axis=(0, 0, 1))

# Randomize lights via OmniGraph events
rep.utils.send_og_event(event_name="randomize_lights")

Headless Execution

The canonical Isaac Sim Python launcher is python.sh (use python.bat on Windows). isaac-sim.sh launches the full editor app and is not the right entry point for standalone SDG scripts.

# $ISAAC_SIM_DIR is either the install root or <repo>/_build/linux-x86_64/release
"$ISAAC_SIM_DIR/python.sh" "$WORKSPACE_DIR/data_collection.py" --config config.yaml

Headlessness is controlled by SimulationApp({"headless": True}) inside the script, not by a launcher flag.

Or via the Isaac Lab runner ($ISAAC_LAB_DIR is your Isaac Lab checkout):

"$ISAAC_LAB_DIR/isaaclab.sh" -p data_collection.py --config config.yaml

Configuration Pattern

Use YAML config to parameterize everything:

resolution: [1280, 720]
rt_subframes: 32
num_frames: 100
headless: true
env_url: "/Isaac/Environments/Simple_Warehouse/full_warehouse.usd"
writer: BasicWriter
output_dir: /tmp/sdg_output
annotations:
  rgb: true
  bounding_box_2d_tight: true
  semantic_segmentation: true
  distance_to_image_plane: true
  bounding_box_3d: true
objects:
  - url: "/Isaac/Props/YCB/Axis_Aligned/003_cracker_box.usd"
    label: cracker_box
    count: 5
  - url: "/Isaac/Props/YCB/Axis_Aligned/008_pudding_box.usd"
    label: pudding_box
    count: 3

Validation Checklist

  1. Output directory contains expected number of frames
  2. RGB images are non-black (mean RGB > 30)
  3. Annotation files match frame count
  4. Semantic labels appear in segmentation maps
  5. Bounding boxes have non-zero area
  6. No NaN in depth maps

Key Rules

  • Set rep.orchestrator.set_capture_on_play(False) for manual step control.
  • rt_subframes: render the same frame multiple times to reduce ghosting from large pose deltas and to let materials/textures converge. Tune for your renderer: small (4-8) is often enough for RTX Real-Time + DLSS Quality; 16-32 is typical for path tracing or scenes with heavy material streaming.
  • DLSS Quality: carb.settings.get_settings().set("rtx/post/dlss/execMode", 2). Recommended for SDG; default Performance mode can produce edge artifacts below ~600x600.
  • Tag every prim you want annotated via add_labels(...) (taxonomy-aware) or rep.functional.modify.semantics(...). Both write the UsdSemantics.LabelsAPI schema.
  • For static-scene SDG, pass delta_time=0.0 to rep.orchestrator.step so the timeline does not advance between captures.
  • Call rep.orchestrator.wait_until_complete() before cleanup so the background backend has flushed everything to disk.
  • Use rng = np.random.default_rng(seed) and rep.set_global_seed(seed) for reproducible randomization.
  • Performance knobs for high-throughput captures (see sdg_getting_started_05.py):
    • rep.orchestrator.step(wait_for_render=False) decouples capture from render completion. Data may correspond to a previous frame; only use when strict frame-to-data correspondence is not required.
    • carb.settings.get_settings().set("/exts/omni.replicator.core/enableWriteToFabric", True) writes randomization deltas directly to Fabric instead of going through USD first. Faster, but transient — changes are not persisted in the USD stage.

Sibling SDG workflows

WorkflowModule / example
Mobile-robot trajectory record + replaymobility-gen skill + isaacsim.replicator.mobility_gen
Grasp dataset generationisaacsim.replicator.grasping (GraspingManager, GraspPhase) — source/standalone_examples/api/isaacsim.replicator.grasping/grasping_workflow_sdg.py
Episode record + replayisaacsim.replicator.episode_recorder
Teleop record + replayisaacsim.replicator.teleop
Reusable randomization behavior scripts (attached to prims, USD-persistent)isaacsim.replicator.behavior
Sensor primitives (LiDAR, IMU, camera)isaac-sim-sensor, isaac-camera
Spawn placement from a mapoccupancy-map

Reference examples

Paths relative to $ISAAC_SIM_DIR (install root or <this-repo> for a source build) and $ISAAC_LAB_DIR:

  • API examples: $ISAAC_SIM_DIR/source/standalone_examples/api/isaacsim.replicator.examples/sdg_getting_started_0[1-5].py, sdg_workflow_0[12].py, multi_camera.py, motion_blur_raytracing.py, motion_blur_pathtracing.py, cosmos_writer_simple.py, simready_assets_sdg.py, sdg_deformables.py, sdg_geomsubset.py, subscribers_and_events.py, custom_event_and_write.py, custom_fps_writer_annotator.py.
  • Scene-based SDG: $ISAAC_SIM_DIR/source/standalone_examples/replicator/scene_based_sdg/
  • Object-based SDG: $ISAAC_SIM_DIR/source/standalone_examples/replicator/object_based_sdg/
  • Augmentation pipelines: $ISAAC_SIM_DIR/source/standalone_examples/replicator/augmentation/
  • Cosmos warehouse writer: $ISAAC_SIM_DIR/source/standalone_examples/replicator/cosmos_writer_warehouse.py
  • Infinigen SDG: $ISAAC_SIM_DIR/source/standalone_examples/replicator/infinigen/
  • Grasping SDG: $ISAAC_SIM_DIR/source/standalone_examples/api/isaacsim.replicator.grasping/grasping_workflow_sdg.py
  • Isaac Lab imitation learning: $ISAAC_LAB_DIR/scripts/imitation_learning/

Comments

Markdown supported