Advanced Metal Research
GitHub Contact AMR

Robot description files

On this page
  1. Loaders and tools
  2. robot_description_manifest.json
  3. Identity algorithm
  4. robot.urdf and robot.srdf
  5. config.json
  6. rtcore_definition.json
  7. spheres.json
  8. machine_planning_calibration.json
  9. The empty document
  10. Calibration identity
  11. Program header identities

This page lists every file in a robot description directory, robot_description/robots/<model_id>/, with its fields, units and the rules the loaders enforce. For what a description is and how its identity is used, read Robot description and coordinate frames first.

Check every description in the repository:

python3 robot_description/tools/manifest.py --check
# manifest: rosie_1400_v3 ok, <n> files   (one line per model)

Loaders and tools#

ToolWhat it does
python3 robot_description/tools/manifest.py --check [model ...]Reports a registered file that is missing, a needed file that is not registered, and a mesh the URDF references that is not in meshes/. It does not fail on unregistered extra files. Exit 1 on any problem. CI runs this.
python3 robot_description/tools/manifest.py <model>Rewrites that model's manifest and prints its identity. It imports weldplan from weld_planner/v1/python to compute the hash.
go run ./cmd/identity <dir> ... (in robot_description/go)Prints sha256:<hex> <dir> for each directory. Exit 1 if any fails, 2 with no arguments.
Go module rosieos/robotdescDescriptionFiles, RobotDescriptionSHA256, HashFiles, HashEntries, MachinePlanningCalibrationSHA256, Store.Load, Resolve. Used by rtctl and OLP.
rtctl compileChecks the machine's pin against the identity, reads rtcore_definition.json, and refuses with a robot compile reason.

robot_description_manifest.json#

robot_description/robots/rosie_1420_v1/robot_description_manifest.json (shape)JSON
{
  "schema": "rosie.robot-manifest.v1",
  "model_id": "rosie_1420_v1",
  "files": ["config.json", "meshes/link_1.dae", "robot.srdf", "robot.urdf", "rtcore_definition.json", "spheres.json"]
}
FieldTypeRequiredDescription
schemastringYesExactly rosie.robot-manifest.v1.
model_idstringYesMust equal the directory name.
filesstring[]YesNon-empty. Paths relative to the description directory, with / separators.

Rules for files, applied by DescriptionFiles:

  • No empty, absolute or backslash path, no . or .. segment, no duplicates.
  • The manifest cannot list itself.
  • It cannot list machine_planning_calibration.json. That name belongs to the cell's own file, which is served beside the description.
  • Every entry must be a regular file.

manifest.py registers robot.urdf, robot.srdf, config.json, spheres.json and rtcore_definition.json when present, plus every file in meshes/. Everything else in the directory is provenance.

Identity algorithm#

The identity is a domain-separated SHA-256 over the manifest and every registered file:

  1. Build the entry list: the manifest itself, plus every file in files. Each entry is its path and the SHA-256 of its bytes.
  2. Sort the entries by path (byte order).
  3. Hash, in order:
    • the ASCII domain rosie.robot-description.identity.v1 followed by one 0x00 byte
    • the entry count, as a big-endian uint64
    • for each entry: the path length as a big-endian uint64, the path bytes, then the 32-byte file digest
  4. Write the result as sha256: followed by 64 lowercase hex digits.

Because the manifest is an entry, removing a name from it changes the identity even if the file stays on disk.

robot.urdf and robot.srdf#

Standard URDF and SRDF, with these constraints:

  • The URDF <robot name> must equal the model id.
  • Every movable joint needs bounded <limit lower upper>. Revolute limits are in rad and velocity in rad/s.
  • Mesh references use package://.../meshes/<file>, and each named mesh must be registered.
  • The SRDF defines a manipulator group for Tesseract. On the Rosie models it also defines a home group state with every joint at 0.

config.json#

Schema rosie.robot-config.v1. Unknown fields are rejected. A description with no config.json still loads, with zero correction caps (no cell correction can be accepted).

FieldTypeUnitDescription
schemastring—rosie.robot-config.v1.
model_idstring—Must equal the directory name.
frames.baselink name—Frame everything is measured in.
frames.toollink name—Tool centre point.
frames.workframe name—Frame a workpiece is fixtured to.
frames.work_surface.parentlink name—Optional. The link the work frame is attached to.
frames.work_surface.xyz_m[3]numbermOffset of the work frame from parent.
kinematic_correction_caps.xyz_mnumbermLargest per-component translation a cell calibration may apply. Not negative.
kinematic_correction_caps.rpy_radnumberradLargest per-component rotation a cell calibration may apply. Not negative.
planning.speed_ceiling_rad_snumberrad/sPlanning speed ceiling. Must not exceed the URDF's fastest revolute joint.
planning.joints.<J>.velocity_rad_snumberrad/sPlanning velocity. Positive, and not above the URDF velocity of that joint.
planning.joints.<J>.acceleration_rad_s2numberrad/s²Planning acceleration. Positive. rt-core also uses it for the axis's trajectory and jog acceleration, and requires it for every robot-bound axis.
axes.drivenstring[]—Joints the planner moves. Each must be a revolute URDF joint.
axes.heldmapradJoints the planner keeps fixed, with their value. Finite.
reset_posemapradNamed reset position per joint.
torch.tool_framelink name—The torch's frame, normally tool0.
torch.electrode_axis[3]numberunit vectorWire direction in the tool frame.

Every joint named in planning.joints, axes and reset_pose must be a revolute joint in the URDF. Do not restate a number the URDF already holds: state only what the URDF cannot.

rtcore_definition.json#

Schema rosie.robot-definition.v1. It tells rt-core how each joint maps to a drive. The annotated template is rt-core/config/templates/robot.json, where every field has a _doc sibling with its unit, range and default.

Note

This file carries each joint's gearing and encoder scale. These docs list the fields only. Take the values from the robot's own definition file.

Every numeric robot fact needs a <field>_source or <field>_unverified sibling that says where the number came from. Duplicate JSON keys and unexpected fields are rejected.

FieldTypeDescription
schemastringrosie.robot-definition.v1.
robot_idtokenMust equal the description directory name and the URDF robot name.
namestringDisplay name. Non-empty.
revisionintegerModel revision, 1 to 2⁶⁴−1.
calibration.identitytokenMust be home_calibration. Home offsets and encoder anchors live in a separate Home calibration record, never here.
calibration.notestringNon-empty.
defaults.drive_profiledrive config nameDefault drive config (a basename in rt-core/config/drives/).
defaults.coordinate_evidence_modemulti_turn | single_turn_absoluteHow absolute position evidence is judged.
defaults.home_policyrequired | optionalWhether joints need Home before motion. Default required.
joints[]array1 to 16 uniquely named joints that together map every movable URDF joint.
joints[].nametokenJoint name, for example J1.
joints[].kindarm | positioner | externalJoint role.
joints[].urdf_jointstring | nullThe URDF joint this drive turns. null only for a non-Cartesian external or positioner joint. arm joints require a mapping.
joints[].cartesian_participatesbooleantrue only with a valid URDF mapping.
joints[].drive_profilestring | nullPer-joint drive config; null inherits defaults.drive_profile.
joints[].gear_ratio.numerator, .denominatorintegerMechanical ratio, each 1 to 4294967295. Requires a source.
joints[].motor_encoder_counts_per_revintegerEncoder counts per motor revolution, 1 to 2147483647.
joints[].sign−1 | +1Direction multiplier from logical to drive motion.
joints[].encoder_batterypresent | absentWhether the absolute encoder has battery backup. Requires encoder_battery_source.
joints[].mechanical_travel.min, .maxnumberrad or m. Only for an external joint with no URDF joint. URDF-mapped joints inherit their URDF limits.

spheres.json#

The arm's collision spheres, used by the weld planner's screen. The verifier re-checks results against the exact meshes.

FieldTypeDescription
schemastringamr-weld-planner-v1.sphere-model.v1.
cell_idstringThe model id.
provenance.robot_urdf_sha256hexSHA-256 of the URDF the spheres were fitted against.
provenance.meshes_sha256sha256:<hex>Hash of the meshes they were fitted against.
notestringFree text.
links.<link>[]arraySpheres in that link's own frame: center_m [3]number (m) and radius_m number (m).
coverageobjectThe fit's coverage report.

A URDF or mesh change that leaves provenance stale is caught by the planner's provenance test. Refit or restamp with weld_planner/v1/tools/fit_spheres.py (see Add a robot model).

machine_planning_calibration.json#

Per cell, not in the repository. Schema rosie.machine-planning-calibration.v1. A machine config pins it with robot.machine_planning_calibration{path, sha256, source}, and the compiled configuration serves it beside the description. Unknown fields are rejected.

machine_planning_calibration.json (example shape, values illustrative)JSON
{
  "schema": "rosie.machine-planning-calibration.v1",
  "model_id": "rosie_1420_v1",
  "limits": {
    "speed_ceiling_rad_s": 2.0,
    "joints": { "J1": { "lower_rad": -3.0, "upper_rad": 3.0, "velocity_rad_s": 1.5 } },
    "held": {}
  },
  "kinematics": { "J2": { "xyz_m": [0.0005, 0, 0], "rpy_rad": [0, 0.001, 0] } }
}
FieldTypeUnitRule
schemastring—rosie.machine-planning-calibration.v1.
model_idstring—Must equal the description's model id.
limits.speed_ceiling_rad_snumberrad/sPositive, and not above the URDF's fastest revolute joint.
limits.joints.<J>.lower_radnumberradRevolute URDF joint with stated limits. Must not be below the URDF lower limit.
limits.joints.<J>.upper_radnumberradMust not be above the URDF upper limit, and must stay above lower_rad.
limits.joints.<J>.velocity_rad_snumberrad/sIn (0, URDF velocity].
limits.held.<J>numberradFinite, and inside the joint's limits (narrowed ones if given).
kinematics.<J>.xyz_m[3]numbermEach component's magnitude at most kinematic_correction_caps.xyz_m.
kinematics.<J>.rpy_rad[3]numberradEach component's magnitude at most kinematic_correction_caps.rpy_rad.

A correction composes onto the URDF joint origin as T' = T_origin · Trans(xyz) · R(rpy), where R follows URDF convention Rz(yaw)·Ry(pitch)·Rx(roll).

The empty document#

A cell with no calibration serves this exact document for its model, and planners hash it the same way:

{"schema":"rosie.machine-planning-calibration.v1","model_id":"<model_id>"}

followed by one newline (\n).

Calibration identity#

The identity is the SHA-256 of the file's exact bytes, never a re-serialisation. Planners and program headers write it sha256:<hex>. The machine config pin (robot.machine_planning_calibration.sha256) is the same digest as 64 bare lowercase hex digits.

Program header identities#

A dense program's robot_cell header block carries these fields, which OLP Load compares with the cell:

FieldCompared at LoadDescription
model_idYesThe model the plan was made for.
robot_description_sha256YesThe description identity.
machine_planning_calibration_sha256YesThe calibration identity, or the empty document's.
machine_planning_calibration_sourceNotarget if the bytes came from the cell, empty if the plan used the empty document.
machine_configuration_sha256Nosha256: plus the machine's configuration digest, when known. A difference only adds a note.

See Load refusals and Dense trajectory format.