Skip to content

Asset validation

An asset gets a published version only after its validation passes. When you run simulo asset publish, Simulo runs an asset_validation job in the cloud, and a broken package is caught there instead of halfway through a training run. The same checks apply to your organization’s catalog and the Simulo catalog. Which ones run depends on the asset’s kind and source format:

Stage, in order Runs for What it checks
structural Every package The manifest, that every file stays inside the package, that the entry file exists, and that the contents match their digest.
conversion URDF robots Converts the URDF to USD and fills in the physics settings URDF can’t express. A URDF can only be published as a robot.
usd_checks Every uploaded package; the converted USD for a URDF robot That references inside the package resolve, that units and up axis are declared, and the relevant physics schemas.
engine Robots The settle and actuation probes below, run in the simulator.

Some built-in Simulo-catalog assets record usd_checks as skipped, with the reason.

Worlds and props have no joints to drive, so the probes do not run for them; their report shows the engine stage as skipped, with the reason.

Both probes run the robot in one environment. Asset validation checks whether the robot is safe to publish and records position tracking as facts. Preview keeps the stricter checks that judge the robot inside your task.

The robot is placed on a ground plane and left alone for about two seconds. A floating-base robot starts with its lowest bound just above the floor. The probe fails if state becomes non-finite, a joint exceeds its explosion speed, or the robot falls through the floor. A driven joint that is still moving at the end produces a warning with its measured tail speed and a damping hint.

Every joint with an authored position drive is sent a small position target inside its limits. For a floating-base robot whose rigid articulation root is a descendant of the entry prim, the probe fixes that root above the floor so contact with the floor does not distort the measurement. Otherwise it uses the spawned robot without a fixed root. When a robot has position-driven joints and its root cannot be held, the report notes that it was measured standing on the floor. A joint within 0.1 rad of its target passes. A larger offset produces a warning that records the offset, tail speed, and stiffness, whether the joint stopped short, is still converging, or is oscillating.

Actuation fails only when state becomes non-finite, a joint exceeds its explosion speed, or a driven joint barely changed position over the whole actuation phase.

The probe tests only drives the asset actually authored. A joint without a position drive is not tracked, and a robot with no position drives at all passes with a note saying tracking did not apply, since effort-driven robots are legitimate. Settle shows the robot remains physically bounded; actuation shows whether its authored controls respond and records how closely they track.

Terminal window
simulo asset inspect robot/my-arm:v1
simulo asset inspect simulo/robot/cartpole:v1

The summary lists the validation runs on its Validated: line, then a Facts block of what the platform measured about the asset. For the full record as JSON:

Terminal window
simulo asset inspect robot/my-arm:v1 --json > my-arm.record.json

The facts are under version.facts:

Field Meaning
articulation_root The robot’s articulation root.
joints, dof The joints and the total degrees of freedom.
collision_shape_count How many collision shapes were found.
units, up_axis The authored scale and orientation.
link_masses, total_mass_kg Each link’s mass and the total.
probe_outcomes The settle and actuation results, each with passed and detail, for robots.
step_cost_indicator The median physics step time measured during settle, a rough sign of how expensive the robot is to simulate. For robots whose root is held during actuation, this figure includes the held copy.

The report explains why a validation passed or failed:

Terminal window
simulo asset inspect robot/my-arm:v1 --report my-arm.validation.json
simulo asset validate ./my-arm --kind robot --report my-arm.validation.json # check without publishing

It lists stages, each with rows of individual checks. This sketch shows its shape; the angle-bracket values stand in for real text:

{
"report_schema_version": "simulo.asset_validation_report.v1",
"verdict": "passed",
"runtime": "<runtime>",
"kind": "robot",
"entry": "robot.usda",
"source_format": "usd",
"summary": "Validation passed.",
"stages": [
{
"stage": "engine",
"status": "passed",
"skip_reason": null,
"rows": [
{"status": "pass", "check": "probe_settle", "title": "<title>", "problem": null, "fix": null, "detail": "<measured result>"},
{"status": "pass", "check": "probe_actuation", "title": "<title>", "problem": null, "fix": null, "detail": "<measured result>"},
{"status": "warn", "check": "probe_actuation_tracking_offset", "title": "<joint> position tracking", "problem": "<measured offset>", "fix": "<plain fix hint>", "detail": "<offset, tail speed, and stiffness>"}
]
}
]
}

A failing row leads with problem and fix, and keeps the measured value in detail. A stage that did not run is recorded as skipped with its skip_reason, never as passed.

What you see Usually means Try first
Entry or reference check fails The entry file is ambiguous or missing, or a dependency lives outside the package folder. Put every dependency under one folder, and pass --entry if needed.
Units or up-axis warning The USD file relies on a default instead of declaring them. Author metersPerUnit and upAxis explicitly.
Settle warning A driven joint is still moving after two seconds. Add damping if the joint should come to rest before training.
Settle fails State became non-finite, a joint exceeded its explosion speed, or the robot fell through the floor. Check collision shapes, masses, inertia, limits, and drive gains.
Actuation warning A driven joint changed position but remained more than 0.1 rad from its target. Use the reported offset, tail speed, and stiffness to decide whether to raise the gain for position control.
Actuation fails State became non-finite, a joint exceeded its explosion speed, or a driven joint barely changed position over the whole actuation phase. Check that the drive is authored, enabled, and free to move.
URDF conversion fails A mesh reference is missing or unsafe, or the URDF uses something unsupported. Keep meshes inside the package folder and fix the row the report names.