Examples › robotparts › Model lineage

Model lineage

The GIM4305-10 actuator model ladder, M0 to M5, as a tree of life: x is the rung, each model hangs off the model it adds physics to, the c1 soft-friction twin splices in M2's soft friction, the four models with bench runs stay alive and the five with none fold into "+N". Labels instead of pictures: the same lineage view as the brand case, over another kind of data.

robotpartslineagetable3 views of one ladder.json

The .base file and its data

Every tab above is one entry of this file; the views read these rows. ⋯ in the toolbar copies the current view as YAML.

# The GIM4305-10 actuator model ladder (M0 -> M5) as a lineage: x is the rung, each model hangs off the one it adds
# physics to, labels instead of pictures. The same view as the brand case's, over other data: the view is generic.
# Check it: node bin/data-ui.mjs check <this file> --data ladder.json
data: ladder.json
facets:
  - family
  - status
views:
  - type: lineage
    name: Ladder
    order: [variant, family, backend, about, runs, q_rms_median, parents_why]
    lineage:
      parents: parents
      x: rung
      xLabel: rung_name
      label: variant
      focus: m4-ripple-c1
      kept: { status: [measured] }
      extinct: collapse
  - type: lineage
    name: Ladder, radial
    order: [variant, family, backend, about, runs, q_rms_median, parents_why]
    lineage:
      parents: parents
      x: rung
      xLabel: rung_name
      label: variant
      focus: m4-ripple-c1-soft
      kept: { status: [measured] }
      extinct: show
      layout: radial
  - type: table
    name: Table
    order: [variant, rung_name, family, status, runs, q_rms_median, parents, parents_why]
// ladder.json: 11 rows, 6 KB; the first 3
{
 "id": "model-lineage",
 "title": "GIM4305-10 actuator model ladder",
 "titleProperty": "variant",
 "source": "models-benches/models.json (robotparts lane/datasheet @ ec9a13c); parents from robotparts lane/datasheet docs/proposals/models-2026-10-25.md",
 "properties": {
  "variant": {
   "type": "text",
   "width": 240
  },
  "rung": {
   "type": "number",
   "width": 60,
   "note": "how much physics the model captures (M0-M5)"
  },
  "rung_name": {
   "type": "text",
   "width": 60
  },
  "family": {
   "type": "text",
   "width": 230
  },
  "backend": {
   "type": "text",
   "width": 250
  },
  "about": {
   "type": "text",
   "width": 260
  },
  "runs": {
   "type": "number",
   "width": 60
  },
  "q_rms_median": {
   "type": "number",
   "unitText": "mrad",
   "decimals": 2,
   "width": 110,
   "better": "lower"
  },
  "status": {
   "type": "text",
   "width": 90,
   "display": "badge",
   "colors": {
    "measured": 1,
    "no runs": 0
   }
  },
  "parents": {
   "type": "list",
   "width": 200,
   "relation": true,
   "note": "the model this one adds physics to; two = a splice"
  },
  "parents_why": {
   "type": "text",
   "width": 320,
   "note": "the sentence in robotparts lane/datasheet docs/proposals/models-2026-10-25.md that names the parent"
  }
 },
 "rows": [
  {
   "id": "m0-ideal",
   "variant": "M0.ideal",
   "rung": 0,
   "rung_name": "M0",
   "family": "M0 · ideal",
   "backend": "MuJoCo native",
   "about": "no friction, datasheet inertia",
   "runs": 0,
   "q_rms_median": {
    "value": null,
    "why": "no run on the bench yet"
   },
   "status": "no runs",
   "parents": [],
   "parents_why": "heads every ladder as the ablation baseline"
  },
  {
   "id": "m1-datasheet",
   "variant": "M1.datasheet",
   "rung": 1,
   "rung_name": "M1",
   "family": "M1 · datasheet",
   "backend": "MuJoCo native",
   "about": "the stated values",
   "runs": 0,
   "q_rms_median": {
    "value": null,
    "why": "no run on the bench yet"
   },
   "status": "no runs",
   "parents": [
    "m0-ideal"
   ],
   "parents_why": "M1 adds the stated values (Kt, any stated friction and backlash) to M0's gear ratio and inertia"
  },
  {
   "id": "m2-coulomb-viscous",
   "variant": "M2.coulomb_viscous",
   "rung": 2,
   "rung_name": "M2",
   "family": "M2 · fitted constant friction",
   "backend": "MuJoCo native, soft friction",
   "about": "Coulomb + viscous",
   "runs": 19,
   "q_rms_median": 2.102,
   "status": "measured",
   "parents": [
    "m1-datasheet"
   ],
   "parents_why": "M2 adds fitted constant friction: Coulomb, viscous"
  }
 ]
}
README.md
# Model lineage

The GIM4305-10 actuator model ladder, M0 to M5, as a tree of life: x is the rung, each model hangs off the model it
adds physics to, the c1 soft-friction twin splices in M2's soft friction, the four models with bench runs stay alive
and the five with none fold into "+N". Labels instead of pictures: the same lineage view as the brand case, over
another kind of data.

- **App:** robotparts
- **Replaces:** the ladder drawn in prose in robotparts' models proposal (`docs/proposals/models-2026-10-25.md`, "Rung k
  adds a layer of physics") and the rung column of the models-benches pivot.
- **Shows:** `type: lineage` with label nodes (no `image`), `x: rung` with `xLabel`, a splice, `kept: {status:
  [measured]}` with `extinct: collapse`, the radial layout, and the peek's `parents_why` saying where each edge comes from.
- **Data:** `ladder.json`, written by `source/make.py` from the models-benches case's runs (robotparts lane/datasheet @
  ec9a13c), one row per model variant with its run count and median q RMS. `parents` is authored in `make.py`, each
  edge with the sentence of the models proposal that names it; M5.dcmotor's base is never named, so it has none.

The original UI it replaces

the ladder drawn in prose in robotparts' models proposal (docs/proposals/models-2026-10-25.md, "Rung k adds a layer of physics") and the rung column of the models-benches pivot.

What it shows

type: lineage with label nodes (no image), x: rung with xLabel, a splice, kept: {status: [measured]} with extinct: collapse, the radial layout, and the peek's parents_why saying where each edge comes from.

Data

ladder.json, written by source/make.py from the models-benches case's runs (robotparts lane/datasheet @ ec9a13c), one row per model variant with its run count and median q RMS. parents is authored in make.py, each edge with the sentence of the models proposal that names it; M5.dcmotor's base is never named, so it has none.