Skip to main content
A rig is one JSON object. Unknown fields are refused everywhere, so a typo fails simforge rig validate instead of being ignored. The JSON Schema is /docs/render-rig.schema.json, and the CLI checks exactly the same rules.

The file

Every source

Two sources may not share an outputName, or the same actorId, sensorId and modality.
Note. Lidar point clouds (PLY) use a different frame: +Z is to the right (CARLA parity). See sensor outputs.

Camera (modality: rgb)

A camera has exactly one of horizontalFovDeg and cameraModel. A pinhole camera’s intrinsics follow from these fields: the principal point is the image centre, pixels are square, and the focal length in pixels is fx = fy = (width / 2) / tan(horizontalFovDeg / 2). A 1280x720 camera with a 90 degree field of view has fx = fy = 640, cx = 640 and cy = 360, and a vertical field of 58.7 degrees; rig show prints each camera’s vertical field. Every camera writes the passes you ask for with --passes: rgb (the image), depth, id (instances) and semantic. See sensor outputs.

Lens camera (cameraModel)

For wide-angle and fisheye cameras, an f-theta lens maps the distance of a pixel from the principal point to the angle of its ray from the optical axis.
The f-theta camera above, previewed at 5 s on easterbrook-discovery-school The open CLI checks a lens’s shape; the installed runtime plans it, so rig validate and rig show of a rig with a lens need the runtime. Only the Helios Engine draws f-theta lenses.

Lidar (modality: lidar)

Each ring takes pointsPerSecond / (channels x rotationFrequencyHz) samples per revolution, rounded and kept between 64 and 4096. A beam that hits nothing within rangeM returns no point.

Radar (modality: radar)

A rig with a radar needs video (its fps is the radar’s sample rate). Each frame lists the detections with their range, angles and radial velocity.

What the renderer adds on top

rig validate checks the format. A render also checks what the Helios Engine can draw, and fails with a named error before any work: