Gallery › robotparts › Models × benches

Models × benches

The rack comparison Zach keeps rebuilding: every friction and drivetrain model of the GIM4305-10 (CAN 14) scored on the bam-rack/1 suite by its twin's joint-angle error, q RMS. The pivot is models × tests with each cell's median and spread; two charts put every run, and each model's median, against the twin-grade lines (held-out error at most 1.5 × the 1.08 mrad floor, 1.62 mrad, and at most 2.16 mrad in every motion class). The chart shows the report's verdict at a glance: M4.ripple with the moteus-c1 driver twin sits at about 1 × the floor on the Oct 23 tapes and at 8.2 × on the Oct 24 cycle runs, so no model is twin-grade yet.

robotpartspivotcharttable4 views of one models.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.

# Models × benches: the CAN 14 twin-error comparison (suite bam-rack/1), one row per model and run. The pivot is the
# table lane's preset; the charts put every run per model against the twin-grade line (1.5 × the 1.08 mrad floor).
# Check it: node bin/data-ui.mjs check <this file>
data: models.json
facets:
  - family
  - suite
  - test
  - { property: q_rms_mrad, as: range }
properties:
  variant: { displayName: Model }
  model: { displayName: Model id }
  backend: { displayName: Backend }
  family: { displayName: Family }
  rung: { displayName: Rung }
  about: { displayName: What it models }
  suite: { displayName: Suite }
  test: { displayName: Test }
  run: { displayName: Run }
  q_rms_mrad: { displayName: q RMS }
  x_floor: { displayName: × floor }
  bench_steps: { displayName: Bench steps }
  bench_min: { displayName: Bench time }
  sensors_missing: { displayName: Sensors the rack lacks }
views:
  - type: pivot
    name: Benchmarks
    order: [variant]
    groupBy: { property: family }
    splitBy: [suite, test]
    value: { property: q_rms_mrad, summary: Median, display: dist }
  - type: chart
    name: Every run per model
    chart:
      mark: { type: tick, thickness: 2, size: 26 }
      encoding:
        x: { field: q_rms_mrad, scale: { type: log } }
        y: { field: variant }
        color: { field: suite }
    guides:
      - { rule: { x: 1.0818 }, label: "floor 1.08" }
      - { rule: { x: 1.6227 }, label: "twin-grade ≤ 1.62" }
      - { rule: { x: 2.1636 }, label: "every class ≤ 2.16" }
    hover: { title: variant, fields: [q_rms_mrad, x_floor, suite, test, run] }
  - type: chart
    name: Median per model
    chart:
      mark: bar
      encoding:
        x: { field: q_rms_mrad, aggregate: median }
        y: { field: variant, sort: x }
        color: { field: family }
    guides:
      - { rule: { x: 1.6227 }, label: "twin-grade ≤ 1.62 mrad" }
  - type: table
    name: All runs
    order: [variant, suite, test, run, q_rms_mrad, x_floor]
    groupBy: { property: variant }
    sort:
      - { property: q_rms_mrad, direction: DESC }
    display: { q_rms_mrad: bar }
    fold: closed
// models.json: 100 rows, 48 KB; the first 3
{
 "id": "models-benches",
 "title": "Models × benches (CAN 14)",
 "titleProperty": "variant",
 "source": "lane/datasheet @ ec9a13c: docs/proposals/build_models_report_r2.py (CAN 14, suite bam-rack/1); floor 1.0818 mrad (5 repeats of one tape), twin-grade = 1.5 x floor = 1.62 mrad",
 "properties": {
  "variant": {
   "type": "text",
   "width": 230
  },
  "model": {
   "type": "text",
   "width": 160
  },
  "backend": {
   "type": "text",
   "width": 250
  },
  "family": {
   "type": "text",
   "width": 230
  },
  "rung": {
   "type": "text",
   "width": 60
  },
  "about": {
   "type": "text",
   "width": 240
  },
  "suite": {
   "type": "text",
   "width": 170
  },
  "test": {
   "type": "text",
   "width": 110
  },
  "run": {
   "type": "text",
   "width": 300
  },
  "q_rms_mrad": {
   "type": "number",
   "unitText": "mrad",
   "decimals": 2,
   "width": 110,
   "better": "lower"
  },
  "x_floor": {
   "type": "number",
   "unitText": "× floor",
   "decimals": 2,
   "width": 100,
   "derived": "q RMS / the 1.082 mrad floor"
  },
  "bench_steps": {
   "type": "list",
   "width": 280
  },
  "bench_min": {
   "type": "number",
   "unitText": "min",
   "width": 90
  },
  "sensors_missing": {
   "type": "list",
   "width": 220
  },
  "model_order": {
   "type": "number",
   "hidden": true
  }
 },
 "records": {
  "columns": [
   {
    "id": "suite",
    "label": "Suite"
   },
   {
    "id": "test",
    "label": "Test"
   },
   {
    "id": "run",
    "label": "Run"
   },
   {
    "id": "q_rms_mrad",
    "label": "q RMS (mrad)"
   },
   {
    "id": "x_floor",
    "label": "× floor"
   }
  ]
 },
 "rows": [
  {
   "id": "r000",
   "variant": "M0.ideal",
   "model": "M0.ideal",
   "backend": "MuJoCo native",
   "family": "M0 · ideal",
   "rung": "M0",
   "about": "no friction, datasheet inertia",
   "suite": null,
   "test": null,
   "run": null,
   "q_rms_mrad": null,
   "x_floor": null,
   "bench_steps": [
    "velocity plateaus + chirps"
   ],
   "bench_min": 6,
   "sensors_missing": [],
   "model_order": 0
  },
  {
   "id": "r001",
   "variant": "M1.datasheet",
   "model": "M1.datasheet",
   "backend": "MuJoCo native",
   "family": "M1 · datasheet",
   "rung": "M1",
   "about": "the stated values",
   "suite": null,
   "test": null,
   "run": null,
   "q_rms_mrad": null,
   "x_floor": null,
   "bench_steps": [
    "read the datasheet"
   ],
   "bench_min": 0,
   "sensors_missing": [],
   "model_order": 1
  },
  {
   "id": "r002",
   "variant": "M2.coulomb_viscous",
   "model": "M2.coulomb_viscous",
   "backend": "MuJoCo native, soft friction",
   "family": "M2 · fitted constant friction",
   "rung": "M2",
   "about": "Coulomb + viscous",
   "suite": "Budget tapes, Oct 23",
   "test": "staircase",
   "run": "session_01a/runs/s01_can14_staircase",
   "q_rms_mrad": 2.9049,
   "x_floor": 2.685,
   "bench_steps": [
    "velocity plateaus + chirps"
   ],
   "bench_min": 6,
   "sensors_missing": [],
   "model_order": 2
  }
 ]
}
README.md
# Models × benches

The rack comparison Zach keeps rebuilding: every friction and drivetrain model of the GIM4305-10 (CAN 14) scored on
the bam-rack/1 suite by its twin's joint-angle error, q RMS. The pivot is models × tests with each cell's median and
spread; two charts put every run, and each model's median, against the twin-grade lines (held-out error at most
1.5 × the 1.08 mrad floor, 1.62 mrad, and at most 2.16 mrad in every motion class). The chart shows the report's
verdict at a glance: M4.ripple with the moteus-c1 driver twin sits at about 1 × the floor on the Oct 23 tapes and
at 8.2 × on the Oct 24 cycle runs, so no model is twin-grade yet.

- **App:** robotparts
- **Replaces:** the hand-built HTML tables and SVG strips of robotparts' models report
  (`lane/datasheet` `docs/proposals/build_models_report_r2.py`: `dist_svg`, the per-test rows, the floor and twin-grade
  lines drawn by hand) and the table lane's `models.html` prototype (`design/tables-2026-10-25/presets/models.base`).
- **Shows:** `type: pivot` (models grouped by family x suite / test, median with its distribution, click a cell for
  its runs); a strip `chart` of every run per model on a log axis, coloured by suite, with the floor and the
  twin-grade line as `guides: rule`; a bar `chart` of each model's median (hover a bar for the rows behind it,
  click to list them); the runs table. Models with no run yet show "—" in the pivot and are counted out of the
  charts, said so in the status line.
- **Data:** `models.json`, written by `source/build.py` from `source/models-runs.json`, the table lane's snapshot
  (robotparts lane/tables @ ab5ba92, from lane/datasheet @ ec9a13c), unchanged.

The original UI it replaces

the hand-built HTML tables and SVG strips of robotparts' models report (lane/datasheet docs/proposals/build_models_report_r2.py: dist_svg, the per-test rows, the floor and twin-grade lines drawn by hand) and the table lane's models.html prototype (design/tables-2026-10-25/presets/models.base).

What it shows

type: pivot (models grouped by family x suite / test, median with its distribution, click a cell for its runs); a strip chart of every run per model on a log axis, coloured by suite, with the floor and the twin-grade line as guides: rule; a bar chart of each model's median (hover a bar for the rows behind it, click to list them); the runs table. Models with no run yet show "—" in the pivot and are counted out of the charts, said so in the status line.

Data

models.json, written by source/build.py from source/models-runs.json, the table lane's snapshot (robotparts lane/tables @ ab5ba92, from lane/datasheet @ ec9a13c), unchanged.