{"id":"robotparts-models","title":"Actuator models × benches (BAM rack)","titleProperty":"variant","source":"BAM rack analysis, /archive/datasets/bam_rig (budget Oct 23, dataset Oct 24/25, floors, model cards); naming: robotparts lane/datasheet @ ec9a13c","properties":{"kind":{"type":"text","width":70},"actuator":{"type":"text","width":220},"can":{"type":"number","hidden":true},"part":{"type":"text","width":170},"board":{"type":"text","width":110},"rung":{"type":"text","width":70},"family":{"type":"text","width":210},"model":{"type":"text","width":160},"variant":{"type":"text","width":190},"about":{"type":"text","width":300},"backend":{"type":"text","width":260},"ladder_step":{"type":"text","width":170},"ladder":{"type":"text","hidden":true},"headline_mrad":{"type":"number","unitText":"mrad","decimals":2,"width":130,"values":"headline_runs","better":"lower"},"headline_runs":{"type":"list","hidden":true},"headline_x":{"type":"number","unitText":"× floor","decimals":2,"width":130,"values":"headline_x_runs","better":"lower"},"headline_x_runs":{"type":"list","hidden":true},"dataset_x":{"type":"number","unitText":"× floor","decimals":2,"width":120,"better":"lower","derived":"median over the Oct 24 dataset / floor"},"worst_class_x":{"type":"number","unitText":"× floor","decimals":2,"width":120,"better":"lower","derived":"the worst motion class's median / floor"},"worst_class":{"type":"text","width":100},"floor_tape_x":{"type":"number","unitText":"× floor","decimals":2,"width":120,"better":"lower","derived":"median over the 5 floor repeats / floor"},"oct25_x":{"type":"number","unitText":"× floor","decimals":2,"width":120,"better":"lower","derived":"median over the Oct 25 held-out seeds / floor"},"floor_mrad":{"type":"number","unitText":"mrad","decimals":3,"width":100},"n_runs":{"type":"number","unitText":"","decimals":0,"width":70},"benches":{"type":"list","width":260},"rank":{"type":"number","unitText":"","decimals":0,"width":60},"rank_desc":{"type":"number","hidden":true,"derived":"models ranked on this actuator, worst first"},"best":{"type":"boolean","width":60},"best_model":{"type":"text","width":170},"leader":{"type":"text","width":300},"runner_up_x":{"type":"number","unitText":"× floor","decimals":2,"width":110,"derived":"the second-best model's headline on this actuator"},"twin_grade":{"type":"text","width":100,"display":"badge","colors":{"yes":3,"no":8}},"bench":{"type":"text","width":190},"bench_order":{"type":"number","hidden":true},"test":{"type":"text","width":110},"test_order":{"type":"number","hidden":true},"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,"better":"lower","derived":"q RMS / this actuator's floor"},"term":{"type":"text","width":150},"term_note":{"type":"text","width":360},"delta_mrad":{"type":"number","unitText":"mrad","decimals":3,"width":130,"values":"delta_runs"},"delta_runs":{"type":"list","hidden":true},"delta_x":{"type":"number","unitText":"× floor","decimals":2,"width":110,"derived":"delta / this actuator's floor"},"description":{"type":"text","display":"markdown","width":320},"readme":{"type":"text","display":"markdown","width":320},"code_commit":{"type":"text","width":260},"code_path":{"type":"text","width":320},"code_hosted":{"type":"text","width":220},"code_url":{"type":"text","display":"link","width":220},"page":{"type":"text","hidden":true},"coulomb":{"type":"number","unitText":"N·m","decimals":3,"width":185},"viscous":{"type":"number","unitText":"N·m·s/rad","decimals":4,"width":185},"breakaway":{"type":"number","unitText":"N·m","decimals":3,"width":185},"stribeck_velocity":{"type":"number","unitText":"rad/s","decimals":3,"width":185},"weakening":{"type":"number","unitText":"N·m·s/rad","decimals":4,"width":185},"capture_fraction":{"type":"number","unitText":"","decimals":2,"width":185},"capture_speed":{"type":"number","unitText":"rad/s","decimals":3,"width":185},"capture_dwell":{"type":"number","unitText":"s","decimals":3,"width":185},"ripple":{"type":"number","unitText":"N·m","decimals":4,"width":185},"backlash":{"type":"number","unitText":"arcmin","decimals":1,"width":185},"gear_stiffness":{"type":"number","unitText":"N·m/rad","decimals":0,"width":185},"inertia":{"type":"number","unitText":"kg·m²","decimals":6,"width":185},"torque_scale":{"type":"number","unitText":"","decimals":2,"width":185},"kt":{"type":"number","unitText":"N·m/A","decimals":3,"width":185},"current_loop":{"type":"number","unitText":"Hz","decimals":0,"width":185},"latency":{"type":"number","unitText":"ms","decimals":1,"width":185},"resistance":{"type":"number","unitText":"Ω","decimals":3,"width":185},"inductance":{"type":"number","unitText":"mH","decimals":3,"width":185},"kv":{"type":"number","unitText":"rpm/V","decimals":1,"width":185},"winding_rth":{"type":"number","unitText":"K/W","decimals":2,"width":185}},"records":{"columns":[{"id":"bench","label":"Bench"},{"id":"test","label":"Test"},{"id":"run","label":"Run"},{"id":"q_rms_mrad","label":"q RMS (mrad)"},{"id":"x_floor","label":"× floor"}]},"rows":[{"kind":"model","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","ladder":null,"ladder_step":"1 · M2 identified","headline_mrad":{"value":2.101711,"unit":"mrad","n":19,"basis":"measured","source":"median q RMS over the 19 Oct 23 held-out runs (budget_can14.json)"},"headline_runs":[2.904902,2.517507,1.356701,3.423471,3.08045,2.681032,3.142865,1.770424,2.006569,2.148341,1.629252,1.976596,2.138154,1.817268,1.980765,2.164142,1.593516,1.873887,2.101711],"headline_x":{"value":1.942787,"n":19,"basis":"derived","source":"headline / this actuator's floor, 1.082 mrad (floors.json, 5 repeats)"},"headline_x_runs":[2.685243,2.327142,1.254112,3.1646,2.847517,2.478302,2.905213,1.63655,1.854839,1.985891,1.506054,1.827132,1.976474,1.679853,1.830986,2.000497,1.47302,1.73219,1.942787],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":1.081802,"n_runs":19,"benches":["Held-out tapes · Oct 23"],"rank":3,"rank_desc":2,"best":false,"best_model":"M4.ripple.ideal","leader":"CAN 14 · M4.ripple.ideal","runner_up_x":1.032416,"twin_grade":"no","coulomb":{"value":0.04133438,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03967717,"high":0.04354373},"viscous":{"value":-0.00655994,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00994945,"high":-0.00393923},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous"},"inertia":{"value":0.00010966,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (argmin over a geometric armature grid of the q RMS of the identified+ twin replaying the fixed-frequency chirps (parabola in log I); 95% CI: small-sample t over each run's own minimum)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.99e-05,"high":0.00023554},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous"},"kt":{"value":null,"why":"not in M2.coulomb_viscous"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous"},"latency":{"value":null,"why":"not in M2.coulomb_viscous"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous"},"kv":{"value":null,"why":"not in M2.coulomb_viscous"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous"},"description":"**M2.coulomb_viscous** on CAN 14 · GIM4305-10: Coulomb + viscous, as identified.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe budget's *identified* reference twin: the identified Coulomb friction and inertia on MuJoCo's native joint friction, no driver twin.","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"b0ad72b5cd + uncommitted changes (source sha256 e0c3b227ec95e1a1)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"m0000"},{"kind":"model","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","ladder":null,"ladder_step":"4 · full + driver twin","headline_mrad":{"value":1.11687,"unit":"mrad","n":19,"basis":"measured","source":"median q RMS over the 19 Oct 23 held-out runs (budget_can14.json)"},"headline_runs":[1.268209,1.269012,2.044472,1.240039,1.064797,1.178394,1.612492,1.130757,1.103063,1.11687,1.096979,1.083231,1.125344,1.176362,0.999837,1.09128,1.061484,1.051552,1.107015],"headline_x":{"value":1.032416,"n":19,"basis":"derived","source":"headline / this actuator's floor, 1.082 mrad (floors.json, 5 repeats)"},"headline_x_runs":[1.172311,1.173054,1.889876,1.146272,0.984281,1.089288,1.490561,1.045253,1.019653,1.032416,1.014029,1.001321,1.040249,1.08741,0.924233,1.008761,0.981218,0.972037,1.023307],"dataset_x":4.239043,"worst_class_x":8.239367,"worst_class":"cycle","floor_tape_x":3.602484,"oct25_x":null,"floor_mrad":1.081802,"n_runs":36,"benches":["Held-out tapes · Oct 23","Dataset · Oct 24","Floor repeats · Oct 24"],"rank":2,"rank_desc":3,"best":false,"best_model":"M4.ripple.ideal","leader":"CAN 14 · M4.ripple.ideal","runner_up_x":1.032416,"twin_grade":"no","coulomb":{"value":0.04133438,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03967717,"high":0.04354373},"viscous":{"value":-0.00655994,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00994945,"high":-0.00393923},"breakaway":{"value":null,"why":"not in M4.ripple.c1"},"stribeck_velocity":{"value":null,"why":"not in M4.ripple.c1"},"weakening":{"value":0.00655994,"unit":"N·m·s/rad","source":"model card: velocity weakening (Stribeck-like) (minus the plateaus' viscous slope b (tau = Fc*sgn(v) + b*v + tau0), applied up to the fastest plateau speed)","basis":"measured","low":0.00393923,"high":0.00994945},"capture_fraction":{"value":null,"why":"not in M4.ripple.c1"},"capture_speed":{"value":null,"why":"not in M4.ripple.c1"},"capture_dwell":{"value":null,"why":"not in M4.ripple.c1"},"ripple":{"value":0.01862969,"unit":"N·m","source":"model card: torque ripple + cogging (rotor-angle map, RMS) (tau = c_plateau + sum_k a_k cos(k*10*q) + b_k sin, k = 1..32 per rotor revolution, on settled plateaus with k_max*r*|v|/2pi <= 0.7 x the reply Nyquist rate; block bootstrap of the map RMS; tiers [64, 128] only if every leave-one-run-out fold gains >= 0.02 R2)","basis":"measured","low":0.01796942,"high":0.01926719},"backlash":{"value":12.21336486,"unit":"arcmin","source":"model card: gear backlash (dead band) (camera tag (output) vs encoder (rotor / N) at settled staircase holds, differenced per level (up vs down))","basis":"measured","low":8.13125715,"high":15.91993247},"gear_stiffness":{"value":null,"why":"not measured yet"},"inertia":{"value":0.00010966,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (argmin over a geometric armature grid of the q RMS of the identified+ twin replaying the fixed-frequency chirps (parabola in log I); 95% CI: small-sample t over each run's own minimum)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.99e-05,"high":0.00023554},"torque_scale":{"value":1.36,"basis":"measured","source":"budget: full_twin.torque_scale (independent Kt check)"},"kt":{"value":0.50872801,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":100.0,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":14.01323696,"unit":"ms","source":"model card: command -> motion delay (closed loop) (median over runs of the cross-correlation lag qd_target -> qd)","basis":"measured","low":7.53553958,"high":27.38150994},"resistance":{"value":null,"why":"not in M4.ripple.c1"},"inductance":{"value":null,"why":"not in M4.ripple.c1"},"kv":{"value":null,"why":"not in M4.ripple.c1"},"winding_rth":{"value":null,"why":"not in M4.ripple.c1"},"description":"**M4.ripple.c1** on CAN 14 · GIM4305-10: Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin.\n\nContract kind `ripple_map` (robotparts contract 2.3, not merged): Cogging and commutation ripple as rotor-periodic torque harmonics at the output (the torque_ripple records in one map), optionally with Coulomb and viscous friction.\n\n```\ntau_ripple = sum_k amplitude_k*sin(rotor_harmonic_k*theta_rotor + phase_k), theta_rotor = gear_ratio*theta_output in rad from the rotor zero the simulator uses\n```\n\nThe full twin with the moteus-c1 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can14.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: UPPER BOUND of the refused fit's 95% CI, 0.0003008 kg.m^2 (ill-posed: 95% CI [-6.39e-05, 0.000301] includes zero; filter windows (13, 21, 31) move it by 9.24e-05, more than 25% of it); replay-error inertia refused (95% CI [-1.99e-05, 0.000236] includes zero)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (negative viscous -0.00656 (CI excludes zero): Stribeck-like, not a damping a twin can run)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: plateau ripple map, k 1..96 per rotor rev (r 10), RMS 18.6 mN.m [18.0, 19.3], cross-validated R2 0.54, 0.26, 0.33, 0.43, 0.51\n- **friction_weakening**: 0.00656 N.m.s/rad [0.00394, 0.00995] up to 1 rad/s (the plateaus' negative viscous slope)\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"b0ad72b5cd + uncommitted changes (source sha256 e0c3b227ec95e1a1)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"m0001"},{"kind":"model","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","ladder":null,"ladder_step":"3 · full, ideal driver","headline_mrad":{"value":1.101199,"unit":"mrad","n":19,"basis":"measured","source":"median q RMS over the 19 Oct 23 held-out runs (budget_can14.json)"},"headline_runs":[1.282905,1.284585,1.809055,1.115638,1.021629,1.182252,1.620853,1.03897,1.065223,1.129556,1.002165,1.041609,1.137089,1.066692,0.970864,1.101199,0.957311,1.021648,1.113429],"headline_x":{"value":1.01793,"n":19,"basis":"derived","source":"headline / this actuator's floor, 1.082 mrad (floors.json, 5 repeats)"},"headline_x_runs":[1.185896,1.187449,1.672261,1.031277,0.944377,1.092854,1.49829,0.960407,0.984674,1.044143,0.926385,0.962846,1.051106,0.986033,0.897451,1.01793,0.884923,0.944395,1.029236],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":1.081802,"n_runs":19,"benches":["Held-out tapes · Oct 23"],"rank":1,"rank_desc":4,"best":true,"best_model":"M4.ripple.ideal","leader":"CAN 14 · M4.ripple.ideal","runner_up_x":1.032416,"twin_grade":{"value":null,"why":"not run on the motion classes (Oct 24)"},"coulomb":{"value":0.04133438,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03967717,"high":0.04354373},"viscous":{"value":-0.00655994,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00994945,"high":-0.00393923},"breakaway":{"value":null,"why":"not in M4.ripple.ideal"},"stribeck_velocity":{"value":null,"why":"not in M4.ripple.ideal"},"weakening":{"value":0.00655994,"unit":"N·m·s/rad","source":"model card: velocity weakening (Stribeck-like) (minus the plateaus' viscous slope b (tau = Fc*sgn(v) + b*v + tau0), applied up to the fastest plateau speed)","basis":"measured","low":0.00393923,"high":0.00994945},"capture_fraction":{"value":null,"why":"not in M4.ripple.ideal"},"capture_speed":{"value":null,"why":"not in M4.ripple.ideal"},"capture_dwell":{"value":null,"why":"not in M4.ripple.ideal"},"ripple":{"value":0.01862969,"unit":"N·m","source":"model card: torque ripple + cogging (rotor-angle map, RMS) (tau = c_plateau + sum_k a_k cos(k*10*q) + b_k sin, k = 1..32 per rotor revolution, on settled plateaus with k_max*r*|v|/2pi <= 0.7 x the reply Nyquist rate; block bootstrap of the map RMS; tiers [64, 128] only if every leave-one-run-out fold gains >= 0.02 R2)","basis":"measured","low":0.01796942,"high":0.01926719},"backlash":{"value":12.21336486,"unit":"arcmin","source":"model card: gear backlash (dead band) (camera tag (output) vs encoder (rotor / N) at settled staircase holds, differenced per level (up vs down))","basis":"measured","low":8.13125715,"high":15.91993247},"gear_stiffness":{"value":null,"why":"not measured yet"},"inertia":{"value":0.00010966,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (argmin over a geometric armature grid of the q RMS of the identified+ twin replaying the fixed-frequency chirps (parabola in log I); 95% CI: small-sample t over each run's own minimum)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.99e-05,"high":0.00023554},"torque_scale":{"value":1.36,"basis":"measured","source":"budget: full_twin.torque_scale (independent Kt check)"},"kt":{"value":0.50872801,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M4.ripple.ideal"},"latency":{"value":null,"why":"not in M4.ripple.ideal"},"resistance":{"value":null,"why":"not in M4.ripple.ideal"},"inductance":{"value":null,"why":"not in M4.ripple.ideal"},"kv":{"value":null,"why":"not in M4.ripple.ideal"},"winding_rth":{"value":null,"why":"not in M4.ripple.ideal"},"description":"**M4.ripple.ideal** on CAN 14 · GIM4305-10: Coulomb + weakening + cogging map + backlash, ideal driver (current loop off).\n\nContract kind `ripple_map` (robotparts contract 2.3, not merged): Cogging and commutation ripple as rotor-periodic torque harmonics at the output (the torque_ripple records in one map), optionally with Coulomb and viscous friction.\n\n```\ntau_ripple = sum_k amplitude_k*sin(rotor_harmonic_k*theta_rotor + phase_k), theta_rotor = gear_ratio*theta_output in rad from the rotor zero the simulator uses\n```\n\nThe same twin with the driver's current loop switched off (an ideal driver): the budget's `current loop` ablation, run by run.\n\nWhat this twin runs (`budget_can14.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: UPPER BOUND of the refused fit's 95% CI, 0.0003008 kg.m^2 (ill-posed: 95% CI [-6.39e-05, 0.000301] includes zero; filter windows (13, 21, 31) move it by 9.24e-05, more than 25% of it); replay-error inertia refused (95% CI [-1.99e-05, 0.000236] includes zero)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (negative viscous -0.00656 (CI excludes zero): Stribeck-like, not a damping a twin can run)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: plateau ripple map, k 1..96 per rotor rev (r 10), RMS 18.6 mN.m [18.0, 19.3], cross-validated R2 0.54, 0.26, 0.33, 0.43, 0.51\n- **friction_weakening**: 0.00656 N.m.s/rad [0.00394, 0.00995] up to 1 rad/s (the plateaus' negative viscous slope)\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"b0ad72b5cd + uncommitted changes (source sha256 e0c3b227ec95e1a1)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"m0002"},{"kind":"model","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","ladder":null,"ladder_step":"2 · full, soft friction","headline_mrad":{"value":2.183293,"unit":"mrad","n":19,"basis":"measured","source":"median q RMS over the 19 Oct 23 held-out runs (budget_can14.json)"},"headline_runs":[2.953585,2.621389,1.558833,2.802335,2.46431,2.718809,2.872169,1.389605,1.674405,2.183293,1.323258,1.646812,2.238328,1.408964,1.597504,2.21051,1.352213,1.659053,2.255747],"headline_x":{"value":2.018199,"n":19,"basis":"derived","source":"headline / this actuator's floor, 1.082 mrad (floors.json, 5 repeats)"},"headline_x_runs":[2.730245,2.423169,1.440959,2.590432,2.277967,2.513222,2.654985,1.284527,1.547792,2.018199,1.223198,1.522286,2.069073,1.302423,1.476706,2.043359,1.249963,1.533601,2.085175],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":1.081802,"n_runs":19,"benches":["Held-out tapes · Oct 23"],"rank":4,"rank_desc":1,"best":false,"best_model":"M4.ripple.ideal","leader":"CAN 14 · M4.ripple.ideal","runner_up_x":1.032416,"twin_grade":"no","coulomb":{"value":0.04133438,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03967717,"high":0.04354373},"viscous":{"value":-0.00655994,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00994945,"high":-0.00393923},"breakaway":{"value":null,"why":"not in M4.ripple.soft"},"stribeck_velocity":{"value":null,"why":"not in M4.ripple.soft"},"weakening":{"value":0.00655994,"unit":"N·m·s/rad","source":"model card: velocity weakening (Stribeck-like) (minus the plateaus' viscous slope b (tau = Fc*sgn(v) + b*v + tau0), applied up to the fastest plateau speed)","basis":"measured","low":0.00393923,"high":0.00994945},"capture_fraction":{"value":null,"why":"not in M4.ripple.soft"},"capture_speed":{"value":null,"why":"not in M4.ripple.soft"},"capture_dwell":{"value":null,"why":"not in M4.ripple.soft"},"ripple":{"value":0.01862969,"unit":"N·m","source":"model card: torque ripple + cogging (rotor-angle map, RMS) (tau = c_plateau + sum_k a_k cos(k*10*q) + b_k sin, k = 1..32 per rotor revolution, on settled plateaus with k_max*r*|v|/2pi <= 0.7 x the reply Nyquist rate; block bootstrap of the map RMS; tiers [64, 128] only if every leave-one-run-out fold gains >= 0.02 R2)","basis":"measured","low":0.01796942,"high":0.01926719},"backlash":{"value":12.21336486,"unit":"arcmin","source":"model card: gear backlash (dead band) (camera tag (output) vs encoder (rotor / N) at settled staircase holds, differenced per level (up vs down))","basis":"measured","low":8.13125715,"high":15.91993247},"gear_stiffness":{"value":null,"why":"not measured yet"},"inertia":{"value":0.00010966,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (argmin over a geometric armature grid of the q RMS of the identified+ twin replaying the fixed-frequency chirps (parabola in log I); 95% CI: small-sample t over each run's own minimum)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.99e-05,"high":0.00023554},"torque_scale":{"value":null,"why":"not in M4.ripple.soft"},"kt":{"value":null,"why":"not in M4.ripple.soft"},"current_loop":{"value":null,"why":"not in M4.ripple.soft"},"latency":{"value":null,"why":"not in M4.ripple.soft"},"resistance":{"value":null,"why":"not in M4.ripple.soft"},"inductance":{"value":null,"why":"not in M4.ripple.soft"},"kv":{"value":null,"why":"not in M4.ripple.soft"},"winding_rth":{"value":null,"why":"not in M4.ripple.soft"},"description":"**M4.ripple.soft** on CAN 14 · GIM4305-10: Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction.\n\nContract kind `ripple_map` (robotparts contract 2.3, not merged): Cogging and commutation ripple as rotor-periodic torque harmonics at the output (the torque_ripple records in one map), optionally with Coulomb and viscous friction.\n\n```\ntau_ripple = sum_k amplitude_k*sin(rotor_harmonic_k*theta_rotor + phase_k), theta_rotor = gear_ratio*theta_output in rad from the rotor zero the simulator uses\n```\n\nThe same twin on MuJoCo's default soft friction (it creeps instead of sticking): the budget's `friction stiffness` ablation, run by run.\n\nWhat this twin runs (`budget_can14.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: UPPER BOUND of the refused fit's 95% CI, 0.0003008 kg.m^2 (ill-posed: 95% CI [-6.39e-05, 0.000301] includes zero; filter windows (13, 21, 31) move it by 9.24e-05, more than 25% of it); replay-error inertia refused (95% CI [-1.99e-05, 0.000236] includes zero)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (negative viscous -0.00656 (CI excludes zero): Stribeck-like, not a damping a twin can run)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: plateau ripple map, k 1..96 per rotor rev (r 10), RMS 18.6 mN.m [18.0, 19.3], cross-validated R2 0.54, 0.26, 0.33, 0.43, 0.51\n- **friction_weakening**: 0.00656 N.m.s/rad [0.00394, 0.00995] up to 1 rad/s (the plateaus' negative viscous slope)\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"b0ad72b5cd + uncommitted changes (source sha256 e0c3b227ec95e1a1)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"m0003"},{"kind":"model","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M0","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":1.081802,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M4.ripple.ideal","leader":"CAN 14 · M4.ripple.ideal","runner_up_x":1.032416,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M0.ideal"},"viscous":{"value":null,"why":"not in M0.ideal"},"breakaway":{"value":null,"why":"not in M0.ideal"},"stribeck_velocity":{"value":null,"why":"not in M0.ideal"},"weakening":{"value":null,"why":"not in M0.ideal"},"capture_fraction":{"value":null,"why":"not in M0.ideal"},"capture_speed":{"value":null,"why":"not in M0.ideal"},"capture_dwell":{"value":null,"why":"not in M0.ideal"},"ripple":{"value":null,"why":"not in M0.ideal"},"backlash":{"value":null,"why":"not in M0.ideal"},"gear_stiffness":{"value":null,"why":"not in M0.ideal"},"inertia":{"value":null,"why":"not in M0.ideal"},"torque_scale":{"value":1.36,"basis":"measured","source":"budget: full_twin.torque_scale (independent Kt check)"},"kt":{"value":0.50872801,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M0.ideal"},"latency":{"value":null,"why":"not in M0.ideal"},"resistance":{"value":null,"why":"not in M0.ideal"},"inductance":{"value":null,"why":"not in M0.ideal"},"kv":{"value":null,"why":"not in M0.ideal"},"winding_rth":{"value":null,"why":"not in M0.ideal"},"description":"**M0.ideal** on CAN 14 · GIM4305-10: no friction, datasheet inertia.\n\nNo friction and the datasheet's inertia: the ablation baseline. Not a contract kind.\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"m0004"},{"kind":"model","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M1","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":1.081802,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M4.ripple.ideal","leader":"CAN 14 · M4.ripple.ideal","runner_up_x":1.032416,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M1.datasheet"},"viscous":{"value":null,"why":"not in M1.datasheet"},"breakaway":{"value":null,"why":"not in M1.datasheet"},"stribeck_velocity":{"value":null,"why":"not in M1.datasheet"},"weakening":{"value":null,"why":"not in M1.datasheet"},"capture_fraction":{"value":null,"why":"not in M1.datasheet"},"capture_speed":{"value":null,"why":"not in M1.datasheet"},"capture_dwell":{"value":null,"why":"not in M1.datasheet"},"ripple":{"value":null,"why":"not in M1.datasheet"},"backlash":{"value":15.0,"basis":"datasheet","unit":"arcmin","source":"datasheet: SteadyWin GIM4305-10 (integrated 10:1 planetary)"},"gear_stiffness":{"value":null,"why":"not in M1.datasheet"},"inertia":{"value":null,"why":"not in M1.datasheet"},"torque_scale":{"value":null,"why":"not in M1.datasheet"},"kt":{"value":null,"why":"not in M1.datasheet"},"current_loop":{"value":null,"why":"not in M1.datasheet"},"latency":{"value":null,"why":"not in M1.datasheet"},"resistance":{"value":0.565,"low":0.555,"high":0.575,"basis":"datasheet","unit":"Ω","source":"datasheet: SteadyWin GIM4305-10 (integrated 10:1 planetary) (phase-phase / 2)"},"inductance":{"value":null,"why":"not in M1.datasheet"},"kv":{"value":160.0,"low":152.5,"high":167.5,"basis":"datasheet","unit":"rpm/V","source":"datasheet: SteadyWin GIM4305-10 (integrated 10:1 planetary)"},"winding_rth":{"value":null,"why":"not in M1.datasheet"},"description":"**M1.datasheet** on CAN 14 · GIM4305-10: the stated values, nothing fitted.\n\nContract kind `datasheet` (robotparts contract 2.3, not merged): The datasheet's own model: the part's stated values and nothing fitted. Every term is a registry key and equals the part's spec in SI (relative tolerance 1e-6), and fitted_from is []. MJCF joint attributes express it (armature, frictionloss, damping), so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v; armature = output_inertia, or gear_ratio^2*(rotor_inertia + gearbox_input_inertia)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"m0005"},{"kind":"model","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M3.lugre","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":1.081802,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M4.ripple.ideal","leader":"CAN 14 · M4.ripple.ideal","runner_up_x":1.032416,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.04133438,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03967717,"high":0.04354373},"viscous":{"value":-0.00655994,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00994945,"high":-0.00393923},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":null,"why":"not in M3.lugre"},"capture_fraction":{"value":null,"why":"not in M3.lugre"},"capture_speed":{"value":null,"why":"not in M3.lugre"},"capture_dwell":{"value":null,"why":"not in M3.lugre"},"ripple":{"value":null,"why":"not in M3.lugre"},"backlash":{"value":null,"why":"not in M3.lugre"},"gear_stiffness":{"value":null,"why":"not in M3.lugre"},"inertia":{"value":0.00010966,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (argmin over a geometric armature grid of the q RMS of the identified+ twin replaying the fixed-frequency chirps (parabola in log I); 95% CI: small-sample t over each run's own minimum)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.99e-05,"high":0.00023554},"torque_scale":{"value":null,"why":"not in M3.lugre"},"kt":{"value":null,"why":"not in M3.lugre"},"current_loop":{"value":null,"why":"not in M3.lugre"},"latency":{"value":null,"why":"not in M3.lugre"},"resistance":{"value":null,"why":"not in M3.lugre"},"inductance":{"value":null,"why":"not in M3.lugre"},"kv":{"value":null,"why":"not in M3.lugre"},"winding_rth":{"value":null,"why":"not in M3.lugre"},"description":"**M3.lugre** on CAN 14 · GIM4305-10: LuGre: a bristle state.\n\nContract kind `lugre` (robotparts contract 2.3, not merged): The LuGre dynamic friction model (Canudas de Wit, Olsson, Astrom and Lischinsky, IEEE TAC 1995): bristles of deflection z give pre-sliding displacement, the Stribeck curve and frictional lag.\n\n```\ndz/dt = v - sigma0*|v|*z/g(v), g(v) = coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent); tau_f = sigma0*z + sigma1*dz/dt + sigma2*v; stribeck_exponent is 2 when absent\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"m0006"},{"kind":"model","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M5","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":1.081802,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M4.ripple.ideal","leader":"CAN 14 · M4.ripple.ideal","runner_up_x":1.032416,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M5.dcmotor"},"viscous":{"value":null,"why":"not in M5.dcmotor"},"breakaway":{"value":null,"why":"not in M5.dcmotor"},"stribeck_velocity":{"value":null,"why":"not in M5.dcmotor"},"weakening":{"value":null,"why":"not in M5.dcmotor"},"capture_fraction":{"value":null,"why":"not in M5.dcmotor"},"capture_speed":{"value":null,"why":"not in M5.dcmotor"},"capture_dwell":{"value":null,"why":"not in M5.dcmotor"},"ripple":{"value":null,"why":"not in M5.dcmotor"},"backlash":{"value":null,"why":"not in M5.dcmotor"},"gear_stiffness":{"value":null,"why":"not in M5.dcmotor"},"inertia":{"value":null,"why":"not in M5.dcmotor"},"torque_scale":{"value":null,"why":"not in M5.dcmotor"},"kt":{"value":0.50872801,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M5.dcmotor"},"latency":{"value":null,"why":"not in M5.dcmotor"},"resistance":{"value":0.651022,"unit":"Ω","source":"model card: phase resistance (phase-neutral), the board's calibration (moteus_tool calibration (conf get motor.resistance_ohm))","basis":"measured"},"inductance":{"value":0.230534,"unit":"mH","source":"model card: q-axis inductance, the board's calibration (conf get motor.inductance_q_H)","basis":"measured"},"kv":{"value":162.561,"unit":"rpm/V","source":"model card: Kv (rotor), the board's calibration (conf get motor.Kv)","basis":"measured"},"winding_rth":{"value":6.716,"unit":"K/W","source":"model card: thermal (winding from R; board limits) (winding rise from copper resistance (alpha 0.00393) by fixed 1.5/0.75 A d-axis probe windows; 1-pole Foster network fitted to the rise (residual 3.5 degC))","basis":"measured"},"description":"**M5.dcmotor** on CAN 14 · GIM4305-10: R, L, motor constant, winding heat.\n\nContract kind `mujoco_dcmotor` (robotparts contract 2.3, not merged): MuJoCo's DC motor actuator (the dcmotor shortcut, mjs_setToDCMotor, MuJoCo 3.16): electrical dynamics, gain and bias (back-EMF, cogging, LuGre friction), with its parameters named and shaped as MuJoCo takes them. The simulator pins the MuJoCo release and the code that sets them.\n\n```\nMuJoCo's own: mjDYN_DCMOTOR (electrical dynamics), mjGAIN_DCMOTOR (K or K/R), mjBIAS_DCMOTOR (back-EMF, cogging, LuGre friction)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"m0007"},{"kind":"model","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","ladder":null,"ladder_step":"1 · M2 identified","headline_mrad":{"value":3.850121,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can21.json)"},"headline_runs":[5.479771,3.89604,3.850121,3.577858,3.707092],"headline_x":{"value":1.813796,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.123 mrad (floors.json, 5 repeats)"},"headline_x_runs":[2.581526,1.835428,1.813796,1.685533,1.746415],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.122687,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":3,"rank_desc":2,"best":false,"best_model":"M3.stribeck.ideal","leader":"CAN 21 · M3.stribeck.ideal","runner_up_x":1.70396,"twin_grade":"no","coulomb":{"value":0.04029278,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 0.1218*sin(q - -3.0860) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03721742,"high":0.04342791},"viscous":{"value":-0.02098425,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 0.1218*sin(q - -3.0860) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.03078019,"high":-0.01144711},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous"},"inertia":{"value":0.00153339,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00132709,"high":0.00165443},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous"},"kt":{"value":null,"why":"not in M2.coulomb_viscous"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous"},"latency":{"value":null,"why":"not in M2.coulomb_viscous"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous"},"kv":{"value":null,"why":"not in M2.coulomb_viscous"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous"},"description":"**M2.coulomb_viscous** on CAN 21 · JMC 60ASM400 direct: Coulomb + viscous, as identified.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe budget's *identified* reference twin: the identified Coulomb friction and inertia on MuJoCo's native joint friction, no driver twin.","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"425561768b","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"m0008"},{"kind":"model","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","ladder":null,"ladder_step":"4 · full + driver twin","headline_mrad":{"value":3.616973,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can21.json)"},"headline_runs":[5.37579,3.616973,4.578859,3.561037,3.481399],"headline_x":{"value":1.70396,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.123 mrad (floors.json, 5 repeats)"},"headline_x_runs":[2.53254,1.70396,2.157105,1.677608,1.640091],"dataset_x":22.157001,"worst_class_x":37.191284,"worst_class":"cycle","floor_tape_x":14.637151,"oct25_x":null,"floor_mrad":2.122687,"n_runs":22,"benches":["Held-out tapes · Oct 23","Dataset · Oct 24","Floor repeats · Oct 24"],"rank":2,"rank_desc":3,"best":false,"best_model":"M3.stribeck.ideal","leader":"CAN 21 · M3.stribeck.ideal","runner_up_x":1.70396,"twin_grade":"no","coulomb":{"value":0.04029278,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 0.1218*sin(q - -3.0860) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03721742,"high":0.04342791},"viscous":{"value":-0.02098425,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 0.1218*sin(q - -3.0860) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.03078019,"high":-0.01144711},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":0.02098425,"unit":"N·m·s/rad","source":"model card: velocity weakening (Stribeck-like) (minus the plateaus' viscous slope b (tau = Fc*sgn(v) + b*v + tau0), applied up to the fastest plateau speed)","basis":"measured","low":0.01144711,"high":0.03078019},"capture_fraction":{"value":null,"why":"not in M3.stribeck.r4"},"capture_speed":{"value":null,"why":"not in M3.stribeck.r4"},"capture_dwell":{"value":null,"why":"not in M3.stribeck.r4"},"ripple":{"value":null,"why":"not in M3.stribeck.r4"},"backlash":{"value":null,"why":"not in M3.stribeck.r4"},"gear_stiffness":{"value":null,"why":"not in M3.stribeck.r4"},"inertia":{"value":0.00153339,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00132709,"high":0.00165443},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.07905702,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":100.0000664990891,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":31.93144962,"unit":"ms","source":"model card: command -> motion delay (closed loop) (median over runs of the cross-correlation lag qd_target -> qd)","basis":"measured","low":21.69897535,"high":56.01719551},"resistance":{"value":null,"why":"not in M3.stribeck.r4"},"inductance":{"value":null,"why":"not in M3.stribeck.r4"},"kv":{"value":null,"why":"not in M3.stribeck.r4"},"winding_rth":{"value":null,"why":"not in M3.stribeck.r4"},"description":"**M3.stribeck.r4** on CAN 21 · JMC 60ASM400 direct: Coulomb + velocity weakening, with the moteus-r4.11 driver twin.\n\nContract kind `stribeck` (robotparts contract 2.3, not merged): Friction that falls from its breakaway value to the Coulomb value as the output speeds up, plus viscous friction (the Stribeck curve).\n\n```\ntau_f = (coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent))*sign(v) + viscous_friction*v; stribeck_exponent is 2 when absent\n```\n\nThe full twin with the moteus-r4.11 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can21.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: identified axis inertia 0.001533 kg.m^2\n- **frictionloss**: identified Coulomb (plateaus with the identified gravity load taken off)\n- **damping**: none: viscous refused (negative viscous -0.02098 (CI excludes zero): Stribeck-like, not a damping a twin can run)\n- **gravity**: identified G 0.1218 N.m [0.113, 0.13], bottom -3.0860 rad [-3.104, -3.067] (output frame): a point mass on the bare hinge (twin.gravity_point_mass); over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.06 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: 0.02098 N.m.s/rad [0.0114, 0.0308] up to 0.4 rad/s (the plateaus' negative viscous slope)\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"425561768b","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"m0009"},{"kind":"model","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","ladder":null,"ladder_step":"3 · full, ideal driver","headline_mrad":{"value":3.615944,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can21.json)"},"headline_runs":[5.382008,3.615944,4.575105,3.557022,3.479208],"headline_x":{"value":1.703475,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.123 mrad (floors.json, 5 repeats)"},"headline_x_runs":[2.53547,1.703475,2.155336,1.675717,1.639058],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.122687,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":1,"rank_desc":4,"best":true,"best_model":"M3.stribeck.ideal","leader":"CAN 21 · M3.stribeck.ideal","runner_up_x":1.70396,"twin_grade":"no","coulomb":{"value":0.04029278,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 0.1218*sin(q - -3.0860) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03721742,"high":0.04342791},"viscous":{"value":-0.02098425,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 0.1218*sin(q - -3.0860) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.03078019,"high":-0.01144711},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":0.02098425,"unit":"N·m·s/rad","source":"model card: velocity weakening (Stribeck-like) (minus the plateaus' viscous slope b (tau = Fc*sgn(v) + b*v + tau0), applied up to the fastest plateau speed)","basis":"measured","low":0.01144711,"high":0.03078019},"capture_fraction":{"value":null,"why":"not in M3.stribeck.ideal"},"capture_speed":{"value":null,"why":"not in M3.stribeck.ideal"},"capture_dwell":{"value":null,"why":"not in M3.stribeck.ideal"},"ripple":{"value":null,"why":"not in M3.stribeck.ideal"},"backlash":{"value":null,"why":"not in M3.stribeck.ideal"},"gear_stiffness":{"value":null,"why":"not in M3.stribeck.ideal"},"inertia":{"value":0.00153339,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00132709,"high":0.00165443},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.07905702,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M3.stribeck.ideal"},"latency":{"value":null,"why":"not in M3.stribeck.ideal"},"resistance":{"value":null,"why":"not in M3.stribeck.ideal"},"inductance":{"value":null,"why":"not in M3.stribeck.ideal"},"kv":{"value":null,"why":"not in M3.stribeck.ideal"},"winding_rth":{"value":null,"why":"not in M3.stribeck.ideal"},"description":"**M3.stribeck.ideal** on CAN 21 · JMC 60ASM400 direct: Coulomb + velocity weakening, ideal driver (current loop off).\n\nContract kind `stribeck` (robotparts contract 2.3, not merged): Friction that falls from its breakaway value to the Coulomb value as the output speeds up, plus viscous friction (the Stribeck curve).\n\n```\ntau_f = (coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent))*sign(v) + viscous_friction*v; stribeck_exponent is 2 when absent\n```\n\nThe same twin with the driver's current loop switched off (an ideal driver): the budget's `current loop` ablation, run by run.\n\nWhat this twin runs (`budget_can21.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: identified axis inertia 0.001533 kg.m^2\n- **frictionloss**: identified Coulomb (plateaus with the identified gravity load taken off)\n- **damping**: none: viscous refused (negative viscous -0.02098 (CI excludes zero): Stribeck-like, not a damping a twin can run)\n- **gravity**: identified G 0.1218 N.m [0.113, 0.13], bottom -3.0860 rad [-3.104, -3.067] (output frame): a point mass on the bare hinge (twin.gravity_point_mass); over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.06 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: 0.02098 N.m.s/rad [0.0114, 0.0308] up to 0.4 rad/s (the plateaus' negative viscous slope)\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"425561768b","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"m0010"},{"kind":"model","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","ladder":null,"ladder_step":"2 · full, soft friction","headline_mrad":{"value":4.170634,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can21.json)"},"headline_runs":[5.799221,4.170634,4.659385,4.049042,4.019563],"headline_x":{"value":1.96479,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.123 mrad (floors.json, 5 repeats)"},"headline_x_runs":[2.732019,1.96479,2.195041,1.907508,1.89362],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.122687,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":4,"rank_desc":1,"best":false,"best_model":"M3.stribeck.ideal","leader":"CAN 21 · M3.stribeck.ideal","runner_up_x":1.70396,"twin_grade":"no","coulomb":{"value":0.04029278,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 0.1218*sin(q - -3.0860) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03721742,"high":0.04342791},"viscous":{"value":-0.02098425,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 0.1218*sin(q - -3.0860) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.03078019,"high":-0.01144711},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":0.02098425,"unit":"N·m·s/rad","source":"model card: velocity weakening (Stribeck-like) (minus the plateaus' viscous slope b (tau = Fc*sgn(v) + b*v + tau0), applied up to the fastest plateau speed)","basis":"measured","low":0.01144711,"high":0.03078019},"capture_fraction":{"value":null,"why":"not in M3.stribeck.soft"},"capture_speed":{"value":null,"why":"not in M3.stribeck.soft"},"capture_dwell":{"value":null,"why":"not in M3.stribeck.soft"},"ripple":{"value":null,"why":"not in M3.stribeck.soft"},"backlash":{"value":null,"why":"not in M3.stribeck.soft"},"gear_stiffness":{"value":null,"why":"not in M3.stribeck.soft"},"inertia":{"value":0.00153339,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00132709,"high":0.00165443},"torque_scale":{"value":null,"why":"not in M3.stribeck.soft"},"kt":{"value":null,"why":"not in M3.stribeck.soft"},"current_loop":{"value":null,"why":"not in M3.stribeck.soft"},"latency":{"value":null,"why":"not in M3.stribeck.soft"},"resistance":{"value":null,"why":"not in M3.stribeck.soft"},"inductance":{"value":null,"why":"not in M3.stribeck.soft"},"kv":{"value":null,"why":"not in M3.stribeck.soft"},"winding_rth":{"value":null,"why":"not in M3.stribeck.soft"},"description":"**M3.stribeck.soft** on CAN 21 · JMC 60ASM400 direct: Coulomb + velocity weakening, MuJoCo's soft friction.\n\nContract kind `stribeck` (robotparts contract 2.3, not merged): Friction that falls from its breakaway value to the Coulomb value as the output speeds up, plus viscous friction (the Stribeck curve).\n\n```\ntau_f = (coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent))*sign(v) + viscous_friction*v; stribeck_exponent is 2 when absent\n```\n\nThe same twin on MuJoCo's default soft friction (it creeps instead of sticking): the budget's `friction stiffness` ablation, run by run.\n\nWhat this twin runs (`budget_can21.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: identified axis inertia 0.001533 kg.m^2\n- **frictionloss**: identified Coulomb (plateaus with the identified gravity load taken off)\n- **damping**: none: viscous refused (negative viscous -0.02098 (CI excludes zero): Stribeck-like, not a damping a twin can run)\n- **gravity**: identified G 0.1218 N.m [0.113, 0.13], bottom -3.0860 rad [-3.104, -3.067] (output frame): a point mass on the bare hinge (twin.gravity_point_mass); over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.06 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: 0.02098 N.m.s/rad [0.0114, 0.0308] up to 0.4 rad/s (the plateaus' negative viscous slope)\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"425561768b","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"m0011"},{"kind":"model","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M0","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.122687,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M3.stribeck.ideal","leader":"CAN 21 · M3.stribeck.ideal","runner_up_x":1.70396,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M0.ideal"},"viscous":{"value":null,"why":"not in M0.ideal"},"breakaway":{"value":null,"why":"not in M0.ideal"},"stribeck_velocity":{"value":null,"why":"not in M0.ideal"},"weakening":{"value":null,"why":"not in M0.ideal"},"capture_fraction":{"value":null,"why":"not in M0.ideal"},"capture_speed":{"value":null,"why":"not in M0.ideal"},"capture_dwell":{"value":null,"why":"not in M0.ideal"},"ripple":{"value":null,"why":"not in M0.ideal"},"backlash":{"value":null,"why":"not in M0.ideal"},"gear_stiffness":{"value":null,"why":"not in M0.ideal"},"inertia":{"value":null,"why":"not in M0.ideal"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.07905702,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M0.ideal"},"latency":{"value":null,"why":"not in M0.ideal"},"resistance":{"value":null,"why":"not in M0.ideal"},"inductance":{"value":null,"why":"not in M0.ideal"},"kv":{"value":null,"why":"not in M0.ideal"},"winding_rth":{"value":null,"why":"not in M0.ideal"},"description":"**M0.ideal** on CAN 21 · JMC 60ASM400 direct: no friction, datasheet inertia.\n\nNo friction and the datasheet's inertia: the ablation baseline. Not a contract kind.\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"m0012"},{"kind":"model","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M1","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.122687,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M3.stribeck.ideal","leader":"CAN 21 · M3.stribeck.ideal","runner_up_x":1.70396,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M1.datasheet"},"viscous":{"value":null,"why":"not in M1.datasheet"},"breakaway":{"value":null,"why":"not in M1.datasheet"},"stribeck_velocity":{"value":null,"why":"not in M1.datasheet"},"weakening":{"value":null,"why":"not in M1.datasheet"},"capture_fraction":{"value":null,"why":"not in M1.datasheet"},"capture_speed":{"value":null,"why":"not in M1.datasheet"},"capture_dwell":{"value":null,"why":"not in M1.datasheet"},"ripple":{"value":null,"why":"not in M1.datasheet"},"backlash":{"value":null,"why":"not published"},"gear_stiffness":{"value":null,"why":"not in M1.datasheet"},"inertia":{"value":null,"why":"not in M1.datasheet"},"torque_scale":{"value":null,"why":"not in M1.datasheet"},"kt":{"value":null,"why":"not in M1.datasheet"},"current_loop":{"value":null,"why":"not in M1.datasheet"},"latency":{"value":null,"why":"not in M1.datasheet"},"resistance":{"value":null,"why":"not published"},"inductance":{"value":null,"why":"not in M1.datasheet"},"kv":{"value":null,"why":"not published"},"winding_rth":{"value":null,"why":"not in M1.datasheet"},"description":"**M1.datasheet** on CAN 21 · JMC 60ASM400 direct: the stated values, nothing fitted.\n\nContract kind `datasheet` (robotparts contract 2.3, not merged): The datasheet's own model: the part's stated values and nothing fitted. Every term is a registry key and equals the part's spec in SI (relative tolerance 1e-6), and fitted_from is []. MJCF joint attributes express it (armature, frictionloss, damping), so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v; armature = output_inertia, or gear_ratio^2*(rotor_inertia + gearbox_input_inertia)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"m0013"},{"kind":"model","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M3.lugre","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.122687,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M3.stribeck.ideal","leader":"CAN 21 · M3.stribeck.ideal","runner_up_x":1.70396,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.04029278,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 0.1218*sin(q - -3.0860) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03721742,"high":0.04342791},"viscous":{"value":-0.02098425,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 0.1218*sin(q - -3.0860) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.03078019,"high":-0.01144711},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":null,"why":"not in M3.lugre"},"capture_fraction":{"value":null,"why":"not in M3.lugre"},"capture_speed":{"value":null,"why":"not in M3.lugre"},"capture_dwell":{"value":null,"why":"not in M3.lugre"},"ripple":{"value":null,"why":"not in M3.lugre"},"backlash":{"value":null,"why":"not in M3.lugre"},"gear_stiffness":{"value":null,"why":"not in M3.lugre"},"inertia":{"value":0.00153339,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00132709,"high":0.00165443},"torque_scale":{"value":null,"why":"not in M3.lugre"},"kt":{"value":null,"why":"not in M3.lugre"},"current_loop":{"value":null,"why":"not in M3.lugre"},"latency":{"value":null,"why":"not in M3.lugre"},"resistance":{"value":null,"why":"not in M3.lugre"},"inductance":{"value":null,"why":"not in M3.lugre"},"kv":{"value":null,"why":"not in M3.lugre"},"winding_rth":{"value":null,"why":"not in M3.lugre"},"description":"**M3.lugre** on CAN 21 · JMC 60ASM400 direct: LuGre: a bristle state.\n\nContract kind `lugre` (robotparts contract 2.3, not merged): The LuGre dynamic friction model (Canudas de Wit, Olsson, Astrom and Lischinsky, IEEE TAC 1995): bristles of deflection z give pre-sliding displacement, the Stribeck curve and frictional lag.\n\n```\ndz/dt = v - sigma0*|v|*z/g(v), g(v) = coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent); tau_f = sigma0*z + sigma1*dz/dt + sigma2*v; stribeck_exponent is 2 when absent\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"m0014"},{"kind":"model","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M5","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.122687,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M3.stribeck.ideal","leader":"CAN 21 · M3.stribeck.ideal","runner_up_x":1.70396,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M5.dcmotor"},"viscous":{"value":null,"why":"not in M5.dcmotor"},"breakaway":{"value":null,"why":"not in M5.dcmotor"},"stribeck_velocity":{"value":null,"why":"not in M5.dcmotor"},"weakening":{"value":null,"why":"not in M5.dcmotor"},"capture_fraction":{"value":null,"why":"not in M5.dcmotor"},"capture_speed":{"value":null,"why":"not in M5.dcmotor"},"capture_dwell":{"value":null,"why":"not in M5.dcmotor"},"ripple":{"value":null,"why":"not in M5.dcmotor"},"backlash":{"value":null,"why":"not in M5.dcmotor"},"gear_stiffness":{"value":null,"why":"not in M5.dcmotor"},"inertia":{"value":null,"why":"not in M5.dcmotor"},"torque_scale":{"value":null,"why":"not in M5.dcmotor"},"kt":{"value":0.07905702,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M5.dcmotor"},"latency":{"value":null,"why":"not in M5.dcmotor"},"resistance":{"value":0.086851,"unit":"Ω","source":"model card: phase resistance (phase-neutral), the board's calibration (moteus_tool calibration (conf get motor.resistance_ohm))","basis":"measured"},"inductance":{"value":null,"why":"not on the model card"},"kv":{"value":104.60719518,"unit":"rpm/V","source":"model card: Kv (rotor), the board's calibration (motor.v_per_hz upgraded as moteus_tool does (1.09 x 30 / v_per_hz))","basis":"measured"},"winding_rth":{"value":null,"why":"not measured yet"},"description":"**M5.dcmotor** on CAN 21 · JMC 60ASM400 direct: R, L, motor constant, winding heat.\n\nContract kind `mujoco_dcmotor` (robotparts contract 2.3, not merged): MuJoCo's DC motor actuator (the dcmotor shortcut, mjs_setToDCMotor, MuJoCo 3.16): electrical dynamics, gain and bias (back-EMF, cogging, LuGre friction), with its parameters named and shaped as MuJoCo takes them. The simulator pins the MuJoCo release and the code that sets them.\n\n```\nMuJoCo's own: mjDYN_DCMOTOR (electrical dynamics), mjGAIN_DCMOTOR (K or K/R), mjBIAS_DCMOTOR (back-EMF, cogging, LuGre friction)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"m0015"},{"kind":"model","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","ladder":null,"ladder_step":"1 · M2 identified","headline_mrad":{"value":1.88816,"unit":"mrad","n":14,"basis":"measured","source":"median q RMS over the 14 Oct 23 held-out runs (budget_can15.json)"},"headline_runs":[0.630949,0.477987,4.238137,1.971064,4.745507,3.292329,1.46565,1.233514,1.29505,1.457062,1.805257,2.710832,2.388489,2.197834],"headline_x":{"value":2.022365,"n":14,"basis":"derived","source":"headline / this actuator's floor, 0.934 mrad (floors.json, 5 repeats)"},"headline_x_runs":[0.675795,0.511961,4.539371,2.111161,5.082802,3.526337,1.569824,1.321189,1.387099,1.560625,1.933569,2.90351,2.558255,2.354049],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.93364,"n_runs":14,"benches":["Held-out tapes · Oct 23"],"rank":3,"rank_desc":2,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 15 · M2.coulomb_viscous.ideal","runner_up_x":1.731929,"twin_grade":"no","coulomb":{"value":0.0621415,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 0.1229*sin(q - +0.1830) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.0598332,"high":0.06319447},"viscous":{"value":0.02031673,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 0.1229*sin(q - +0.1830) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.01661946,"high":0.02842532},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous"},"inertia":{"value":0.0021304,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00202225,"high":0.00217834},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous"},"kt":{"value":null,"why":"not in M2.coulomb_viscous"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous"},"latency":{"value":null,"why":"not in M2.coulomb_viscous"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous"},"kv":{"value":null,"why":"not in M2.coulomb_viscous"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous"},"description":"**M2.coulomb_viscous** on CAN 15 · small arm, 28-pole + 10:1: Coulomb + viscous, as identified.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe budget's *identified* reference twin: the identified Coulomb friction and inertia on MuJoCo's native joint friction, no driver twin.","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"m0016"},{"kind":"model","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","ladder":null,"ladder_step":"4 · full + driver twin","headline_mrad":{"value":1.616998,"unit":"mrad","n":14,"basis":"measured","source":"median q RMS over the 14 Oct 23 held-out runs (budget_can15.json)"},"headline_runs":[0.485378,0.419674,3.45499,1.849871,2.148937,1.759124,1.482433,1.685827,1.508841,1.547068,1.761633,1.659818,1.574178,1.489957],"headline_x":{"value":1.731929,"n":14,"basis":"derived","source":"headline / this actuator's floor, 0.934 mrad (floors.json, 5 repeats)"},"headline_x_runs":[0.519877,0.449503,3.700559,1.981354,2.301677,1.884157,1.5878,1.805651,1.616085,1.657028,1.886844,1.777793,1.686065,1.595859],"dataset_x":9.351451,"worst_class_x":14.585566,"worst_class":"cycle","floor_tape_x":6.593014,"oct25_x":null,"floor_mrad":0.93364,"n_runs":31,"benches":["Held-out tapes · Oct 23","Dataset · Oct 24","Floor repeats · Oct 24"],"rank":2,"rank_desc":3,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 15 · M2.coulomb_viscous.ideal","runner_up_x":1.731929,"twin_grade":"no","coulomb":{"value":0.0621415,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 0.1229*sin(q - +0.1830) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.0598332,"high":0.06319447},"viscous":{"value":0.02031673,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 0.1229*sin(q - +0.1830) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.01661946,"high":0.02842532},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"inertia":{"value":0.0021304,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00202225,"high":0.00217834},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.83614664,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":200.0,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":16.1081194,"unit":"ms","source":"model card: command -> motion delay (closed loop) (median over runs of the cross-correlation lag qd_target -> qd)","basis":"measured","low":9.71258962,"high":32.13388958},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.c1"},"description":"**M2.coulomb_viscous.c1** on CAN 15 · small arm, 28-pole + 10:1: Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe full twin with the moteus-c1 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can15.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: identified axis inertia 0.00213 kg.m^2\n- **frictionloss**: identified Coulomb (plateaus with the identified gravity load taken off)\n- **damping**: identified viscous\n- **gravity**: identified G 0.1229 N.m [0.114, 0.132], bottom +0.1830 rad [+0.162, +0.210] (output frame): a point mass on the bare hinge (twin.gravity_point_mass); over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: cross-validated R2 ['-0.06', '-0.14'] below 0.1: the map does not predict ripple it was not fitted on\n- **friction_weakening**: none: the plateaus' viscous slope is not negative\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"m0017"},{"kind":"model","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","ladder":null,"ladder_step":"3 · full, ideal driver","headline_mrad":{"value":1.615714,"unit":"mrad","n":14,"basis":"measured","source":"median q RMS over the 14 Oct 23 held-out runs (budget_can15.json)"},"headline_runs":[0.484202,0.418564,3.455724,1.850426,2.147928,1.763504,1.467877,1.685084,1.50802,1.546823,1.726016,1.658021,1.573408,1.489659],"headline_x":{"value":1.730554,"n":14,"basis":"derived","source":"headline / this actuator's floor, 0.934 mrad (floors.json, 5 repeats)"},"headline_x_runs":[0.518618,0.448314,3.701346,1.981948,2.300596,1.888848,1.572209,1.804854,1.615205,1.656766,1.848696,1.775868,1.68524,1.59554],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.93364,"n_runs":14,"benches":["Held-out tapes · Oct 23"],"rank":1,"rank_desc":4,"best":true,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 15 · M2.coulomb_viscous.ideal","runner_up_x":1.731929,"twin_grade":"no","coulomb":{"value":0.0621415,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 0.1229*sin(q - +0.1830) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.0598332,"high":0.06319447},"viscous":{"value":0.02031673,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 0.1229*sin(q - +0.1830) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.01661946,"high":0.02842532},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"inertia":{"value":0.0021304,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00202225,"high":0.00217834},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.83614664,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"latency":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"description":"**M2.coulomb_viscous.ideal** on CAN 15 · small arm, 28-pole + 10:1: Coulomb, sticking friction, tuned inertia, ideal driver (current loop off).\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe same twin with the driver's current loop switched off (an ideal driver): the budget's `current loop` ablation, run by run.\n\nWhat this twin runs (`budget_can15.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: identified axis inertia 0.00213 kg.m^2\n- **frictionloss**: identified Coulomb (plateaus with the identified gravity load taken off)\n- **damping**: identified viscous\n- **gravity**: identified G 0.1229 N.m [0.114, 0.132], bottom +0.1830 rad [+0.162, +0.210] (output frame): a point mass on the bare hinge (twin.gravity_point_mass); over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: cross-validated R2 ['-0.06', '-0.14'] below 0.1: the map does not predict ripple it was not fitted on\n- **friction_weakening**: none: the plateaus' viscous slope is not negative\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"m0018"},{"kind":"model","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","ladder":null,"ladder_step":"2 · full, soft friction","headline_mrad":{"value":1.89233,"unit":"mrad","n":14,"basis":"measured","source":"median q RMS over the 14 Oct 23 held-out runs (budget_can15.json)"},"headline_runs":[0.631797,0.478341,4.241945,1.973709,4.746717,3.29389,1.468132,1.237321,1.297308,1.458291,1.810951,2.71504,2.391602,2.199951],"headline_x":{"value":2.026831,"n":14,"basis":"derived","source":"headline / this actuator's floor, 0.934 mrad (floors.json, 5 repeats)"},"headline_x_runs":[0.676703,0.512339,4.543449,2.113994,5.084098,3.528009,1.572482,1.325266,1.389517,1.561942,1.939668,2.908016,2.56159,2.356317],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.93364,"n_runs":14,"benches":["Held-out tapes · Oct 23"],"rank":4,"rank_desc":1,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 15 · M2.coulomb_viscous.ideal","runner_up_x":1.731929,"twin_grade":"no","coulomb":{"value":0.0621415,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 0.1229*sin(q - +0.1830) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.0598332,"high":0.06319447},"viscous":{"value":0.02031673,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 0.1229*sin(q - +0.1830) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.01661946,"high":0.02842532},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"inertia":{"value":0.0021304,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00202225,"high":0.00217834},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"kt":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"latency":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"description":"**M2.coulomb_viscous.soft** on CAN 15 · small arm, 28-pole + 10:1: Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe same twin on MuJoCo's default soft friction (it creeps instead of sticking): the budget's `friction stiffness` ablation, run by run.\n\nWhat this twin runs (`budget_can15.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: identified axis inertia 0.00213 kg.m^2\n- **frictionloss**: identified Coulomb (plateaus with the identified gravity load taken off)\n- **damping**: identified viscous\n- **gravity**: identified G 0.1229 N.m [0.114, 0.132], bottom +0.1830 rad [+0.162, +0.210] (output frame): a point mass on the bare hinge (twin.gravity_point_mass); over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: cross-validated R2 ['-0.06', '-0.14'] below 0.1: the map does not predict ripple it was not fitted on\n- **friction_weakening**: none: the plateaus' viscous slope is not negative\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"m0019"},{"kind":"model","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M0","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.93364,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 15 · M2.coulomb_viscous.ideal","runner_up_x":1.731929,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M0.ideal"},"viscous":{"value":null,"why":"not in M0.ideal"},"breakaway":{"value":null,"why":"not in M0.ideal"},"stribeck_velocity":{"value":null,"why":"not in M0.ideal"},"weakening":{"value":null,"why":"not in M0.ideal"},"capture_fraction":{"value":null,"why":"not in M0.ideal"},"capture_speed":{"value":null,"why":"not in M0.ideal"},"capture_dwell":{"value":null,"why":"not in M0.ideal"},"ripple":{"value":null,"why":"not in M0.ideal"},"backlash":{"value":null,"why":"not in M0.ideal"},"gear_stiffness":{"value":null,"why":"not in M0.ideal"},"inertia":{"value":null,"why":"not in M0.ideal"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.83614664,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M0.ideal"},"latency":{"value":null,"why":"not in M0.ideal"},"resistance":{"value":null,"why":"not in M0.ideal"},"inductance":{"value":null,"why":"not in M0.ideal"},"kv":{"value":null,"why":"not in M0.ideal"},"winding_rth":{"value":null,"why":"not in M0.ideal"},"description":"**M0.ideal** on CAN 15 · small arm, 28-pole + 10:1: no friction, datasheet inertia.\n\nNo friction and the datasheet's inertia: the ablation baseline. Not a contract kind.\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"m0020"},{"kind":"model","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M1","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.93364,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 15 · M2.coulomb_viscous.ideal","runner_up_x":1.731929,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M1.datasheet"},"viscous":{"value":null,"why":"not in M1.datasheet"},"breakaway":{"value":null,"why":"not in M1.datasheet"},"stribeck_velocity":{"value":null,"why":"not in M1.datasheet"},"weakening":{"value":null,"why":"not in M1.datasheet"},"capture_fraction":{"value":null,"why":"not in M1.datasheet"},"capture_speed":{"value":null,"why":"not in M1.datasheet"},"capture_dwell":{"value":null,"why":"not in M1.datasheet"},"ripple":{"value":null,"why":"not in M1.datasheet"},"backlash":{"value":null,"why":"not published"},"gear_stiffness":{"value":null,"why":"not in M1.datasheet"},"inertia":{"value":null,"why":"not in M1.datasheet"},"torque_scale":{"value":null,"why":"not in M1.datasheet"},"kt":{"value":null,"why":"not in M1.datasheet"},"current_loop":{"value":null,"why":"not in M1.datasheet"},"latency":{"value":null,"why":"not in M1.datasheet"},"resistance":{"value":null,"why":"not published"},"inductance":{"value":null,"why":"not in M1.datasheet"},"kv":{"value":null,"why":"not published"},"winding_rth":{"value":null,"why":"not in M1.datasheet"},"description":"**M1.datasheet** on CAN 15 · small arm, 28-pole + 10:1: the stated values, nothing fitted.\n\nContract kind `datasheet` (robotparts contract 2.3, not merged): The datasheet's own model: the part's stated values and nothing fitted. Every term is a registry key and equals the part's spec in SI (relative tolerance 1e-6), and fitted_from is []. MJCF joint attributes express it (armature, frictionloss, damping), so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v; armature = output_inertia, or gear_ratio^2*(rotor_inertia + gearbox_input_inertia)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"m0021"},{"kind":"model","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M3.lugre","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.93364,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 15 · M2.coulomb_viscous.ideal","runner_up_x":1.731929,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.0621415,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 0.1229*sin(q - +0.1830) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.0598332,"high":0.06319447},"viscous":{"value":0.02031673,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 0.1229*sin(q - +0.1830) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.01661946,"high":0.02842532},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":null,"why":"not in M3.lugre"},"capture_fraction":{"value":null,"why":"not in M3.lugre"},"capture_speed":{"value":null,"why":"not in M3.lugre"},"capture_dwell":{"value":null,"why":"not in M3.lugre"},"ripple":{"value":null,"why":"not in M3.lugre"},"backlash":{"value":null,"why":"not in M3.lugre"},"gear_stiffness":{"value":null,"why":"not in M3.lugre"},"inertia":{"value":0.0021304,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00202225,"high":0.00217834},"torque_scale":{"value":null,"why":"not in M3.lugre"},"kt":{"value":null,"why":"not in M3.lugre"},"current_loop":{"value":null,"why":"not in M3.lugre"},"latency":{"value":null,"why":"not in M3.lugre"},"resistance":{"value":null,"why":"not in M3.lugre"},"inductance":{"value":null,"why":"not in M3.lugre"},"kv":{"value":null,"why":"not in M3.lugre"},"winding_rth":{"value":null,"why":"not in M3.lugre"},"description":"**M3.lugre** on CAN 15 · small arm, 28-pole + 10:1: LuGre: a bristle state.\n\nContract kind `lugre` (robotparts contract 2.3, not merged): The LuGre dynamic friction model (Canudas de Wit, Olsson, Astrom and Lischinsky, IEEE TAC 1995): bristles of deflection z give pre-sliding displacement, the Stribeck curve and frictional lag.\n\n```\ndz/dt = v - sigma0*|v|*z/g(v), g(v) = coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent); tau_f = sigma0*z + sigma1*dz/dt + sigma2*v; stribeck_exponent is 2 when absent\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"m0022"},{"kind":"model","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M5","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.93364,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 15 · M2.coulomb_viscous.ideal","runner_up_x":1.731929,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M5.dcmotor"},"viscous":{"value":null,"why":"not in M5.dcmotor"},"breakaway":{"value":null,"why":"not in M5.dcmotor"},"stribeck_velocity":{"value":null,"why":"not in M5.dcmotor"},"weakening":{"value":null,"why":"not in M5.dcmotor"},"capture_fraction":{"value":null,"why":"not in M5.dcmotor"},"capture_speed":{"value":null,"why":"not in M5.dcmotor"},"capture_dwell":{"value":null,"why":"not in M5.dcmotor"},"ripple":{"value":null,"why":"not in M5.dcmotor"},"backlash":{"value":null,"why":"not in M5.dcmotor"},"gear_stiffness":{"value":null,"why":"not in M5.dcmotor"},"inertia":{"value":null,"why":"not in M5.dcmotor"},"torque_scale":{"value":null,"why":"not in M5.dcmotor"},"kt":{"value":0.83614664,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M5.dcmotor"},"latency":{"value":null,"why":"not in M5.dcmotor"},"resistance":{"value":0.982769,"unit":"Ω","source":"model card: phase resistance (phase-neutral), the board's calibration (moteus_tool calibration (conf get motor.resistance_ohm))","basis":"measured"},"inductance":{"value":0.461719,"unit":"mH","source":"model card: q-axis inductance, the board's calibration (conf get motor.inductance_q_H)","basis":"measured"},"kv":{"value":98.9053,"unit":"rpm/V","source":"model card: Kv (rotor), the board's calibration (conf get motor.Kv)","basis":"measured"},"winding_rth":{"value":1.99,"unit":"K/W","source":"model card: thermal (winding from R; board limits) (winding rise from copper resistance (alpha 0.00393) by fixed 1.5/0.75 A d-axis probe windows; 2-pole Foster network fitted to the rise (residual 1.7 degC))","basis":"measured"},"description":"**M5.dcmotor** on CAN 15 · small arm, 28-pole + 10:1: R, L, motor constant, winding heat.\n\nContract kind `mujoco_dcmotor` (robotparts contract 2.3, not merged): MuJoCo's DC motor actuator (the dcmotor shortcut, mjs_setToDCMotor, MuJoCo 3.16): electrical dynamics, gain and bias (back-EMF, cogging, LuGre friction), with its parameters named and shaped as MuJoCo takes them. The simulator pins the MuJoCo release and the code that sets them.\n\n```\nMuJoCo's own: mjDYN_DCMOTOR (electrical dynamics), mjGAIN_DCMOTOR (K or K/R), mjBIAS_DCMOTOR (back-EMF, cogging, LuGre friction)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"m0023"},{"kind":"model","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","ladder":null,"ladder_step":"1 · M2 identified","headline_mrad":{"value":2.315369,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can1.json)"},"headline_runs":[4.062527,2.315369,1.971861,2.27476,3.132695],"headline_x":{"value":2.581741,"n":5,"basis":"derived","source":"headline / this actuator's floor, 0.897 mrad (floors.json, 5 repeats)"},"headline_x_runs":[4.529901,2.581741,2.198714,2.53646,3.493096],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.896825,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":2,"rank_desc":3,"best":false,"best_model":"M4.ripple.soft","leader":"CAN 1 · M4.ripple.soft","runner_up_x":2.581741,"twin_grade":"no","coulomb":{"value":0.06720834,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.0534933,"high":0.0827588},"viscous":{"value":-0.36096193,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.79231292,"high":0.02331965},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous"},"inertia":{"value":0.00059611,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00051408,"high":0.00068032},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous"},"kt":{"value":null,"why":"not in M2.coulomb_viscous"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous"},"latency":{"value":null,"why":"not in M2.coulomb_viscous"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous"},"kv":{"value":null,"why":"not in M2.coulomb_viscous"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous"},"description":"**M2.coulomb_viscous** on CAN 1 · GIM4305-10: Coulomb + viscous, as identified.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe budget's *identified* reference twin: the identified Coulomb friction and inertia on MuJoCo's native joint friction, no driver twin.","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"m0024"},{"kind":"model","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","ladder":null,"ladder_step":"4 · full + driver twin","headline_mrad":{"value":2.586643,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can1.json)"},"headline_runs":[2.183303,2.31846,2.586643,2.761126,2.872179],"headline_x":{"value":2.884224,"n":5,"basis":"derived","source":"headline / this actuator's floor, 0.897 mrad (floors.json, 5 repeats)"},"headline_x_runs":[2.434481,2.585188,2.884224,3.078781,3.202609],"dataset_x":3.617457,"worst_class_x":4.781077,"worst_class":"cycle","floor_tape_x":3.822289,"oct25_x":null,"floor_mrad":0.896825,"n_runs":22,"benches":["Held-out tapes · Oct 23","Dataset · Oct 24","Floor repeats · Oct 24"],"rank":3,"rank_desc":2,"best":false,"best_model":"M4.ripple.soft","leader":"CAN 1 · M4.ripple.soft","runner_up_x":2.581741,"twin_grade":"no","coulomb":{"value":0.06720834,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.0534933,"high":0.0827588},"viscous":{"value":-0.36096193,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.79231292,"high":0.02331965},"breakaway":{"value":null,"why":"not in M4.ripple.c1"},"stribeck_velocity":{"value":null,"why":"not in M4.ripple.c1"},"weakening":{"value":null,"why":"not in this twin (the weakening ablation changes nothing)"},"capture_fraction":{"value":null,"why":"not in M4.ripple.c1"},"capture_speed":{"value":null,"why":"not in M4.ripple.c1"},"capture_dwell":{"value":null,"why":"not in M4.ripple.c1"},"ripple":{"value":0.02162866,"unit":"N·m","source":"model card: torque ripple + cogging (rotor-angle map, RMS) (tau = c_plateau + sum_k a_k cos(k*10*q) + b_k sin, k = 1..32 per rotor revolution, on settled plateaus with k_max*r*|v|/2pi <= 0.7 x the reply Nyquist rate; block bootstrap of the map RMS; tiers [64, 128] only if every leave-one-run-out fold gains >= 0.02 R2)","basis":"measured","low":0.01978032,"high":0.02213662},"backlash":{"value":null,"why":"not in this twin (its ablation changes nothing)"},"gear_stiffness":{"value":460.8,"unit":"N·m/rad","source":"model card: gear torsional stiffness (lower bound: the stop press measures gear and stop in series, so the gear alone is at least this stiff)","basis":"measured","low":435.1,"high":486.4},"inertia":{"value":0.00059611,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00051408,"high":0.00068032},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.50892838,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":200.0,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":15.29365289,"unit":"ms","source":"model card: command -> motion delay (closed loop) (median over runs of the cross-correlation lag qd_target -> qd)","basis":"measured","low":10.63598387,"high":33.90870196},"resistance":{"value":null,"why":"not in M4.ripple.c1"},"inductance":{"value":null,"why":"not in M4.ripple.c1"},"kv":{"value":null,"why":"not in M4.ripple.c1"},"winding_rth":{"value":null,"why":"not in M4.ripple.c1"},"description":"**M4.ripple.c1** on CAN 1 · GIM4305-10: Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin.\n\nContract kind `ripple_map` (robotparts contract 2.3, not merged): Cogging and commutation ripple as rotor-periodic torque harmonics at the output (the torque_ripple records in one map), optionally with Coulomb and viscous friction.\n\n```\ntau_ripple = sum_k amplitude_k*sin(rotor_harmonic_k*theta_rotor + phase_k), theta_rotor = gear_ratio*theta_output in rad from the rotor zero the simulator uses\n```\n\nThe full twin with the moteus-c1 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can1.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: identified axis inertia 0.0005961 kg.m^2\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (95% CI [-0.792, 0.0233] includes zero)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: plateau ripple map, k 1..96 per rotor rev (r 10), RMS 21.6 mN.m [19.8, 22.1], cross-validated R2 0.30, 0.41, 0.40\n- **friction_weakening**: none: 95% CI [-0.0233, 0.792] includes zero\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"m0025"},{"kind":"model","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","ladder":null,"ladder_step":"3 · full, ideal driver","headline_mrad":{"value":2.588004,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can1.json)"},"headline_runs":[2.185058,2.308983,2.588004,2.773697,2.880965],"headline_x":{"value":2.885741,"n":5,"basis":"derived","source":"headline / this actuator's floor, 0.897 mrad (floors.json, 5 repeats)"},"headline_x_runs":[2.436439,2.57462,2.885741,3.092797,3.212406],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.896825,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":4,"rank_desc":1,"best":false,"best_model":"M4.ripple.soft","leader":"CAN 1 · M4.ripple.soft","runner_up_x":2.581741,"twin_grade":"no","coulomb":{"value":0.06720834,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.0534933,"high":0.0827588},"viscous":{"value":-0.36096193,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.79231292,"high":0.02331965},"breakaway":{"value":null,"why":"not in M4.ripple.ideal"},"stribeck_velocity":{"value":null,"why":"not in M4.ripple.ideal"},"weakening":{"value":null,"why":"not in this twin (the weakening ablation changes nothing)"},"capture_fraction":{"value":null,"why":"not in M4.ripple.ideal"},"capture_speed":{"value":null,"why":"not in M4.ripple.ideal"},"capture_dwell":{"value":null,"why":"not in M4.ripple.ideal"},"ripple":{"value":0.02162866,"unit":"N·m","source":"model card: torque ripple + cogging (rotor-angle map, RMS) (tau = c_plateau + sum_k a_k cos(k*10*q) + b_k sin, k = 1..32 per rotor revolution, on settled plateaus with k_max*r*|v|/2pi <= 0.7 x the reply Nyquist rate; block bootstrap of the map RMS; tiers [64, 128] only if every leave-one-run-out fold gains >= 0.02 R2)","basis":"measured","low":0.01978032,"high":0.02213662},"backlash":{"value":null,"why":"not in this twin (its ablation changes nothing)"},"gear_stiffness":{"value":460.8,"unit":"N·m/rad","source":"model card: gear torsional stiffness (lower bound: the stop press measures gear and stop in series, so the gear alone is at least this stiff)","basis":"measured","low":435.1,"high":486.4},"inertia":{"value":0.00059611,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00051408,"high":0.00068032},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.50892838,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M4.ripple.ideal"},"latency":{"value":null,"why":"not in M4.ripple.ideal"},"resistance":{"value":null,"why":"not in M4.ripple.ideal"},"inductance":{"value":null,"why":"not in M4.ripple.ideal"},"kv":{"value":null,"why":"not in M4.ripple.ideal"},"winding_rth":{"value":null,"why":"not in M4.ripple.ideal"},"description":"**M4.ripple.ideal** on CAN 1 · GIM4305-10: Coulomb + weakening + cogging map + backlash, ideal driver (current loop off).\n\nContract kind `ripple_map` (robotparts contract 2.3, not merged): Cogging and commutation ripple as rotor-periodic torque harmonics at the output (the torque_ripple records in one map), optionally with Coulomb and viscous friction.\n\n```\ntau_ripple = sum_k amplitude_k*sin(rotor_harmonic_k*theta_rotor + phase_k), theta_rotor = gear_ratio*theta_output in rad from the rotor zero the simulator uses\n```\n\nThe same twin with the driver's current loop switched off (an ideal driver): the budget's `current loop` ablation, run by run.\n\nWhat this twin runs (`budget_can1.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: identified axis inertia 0.0005961 kg.m^2\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (95% CI [-0.792, 0.0233] includes zero)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: plateau ripple map, k 1..96 per rotor rev (r 10), RMS 21.6 mN.m [19.8, 22.1], cross-validated R2 0.30, 0.41, 0.40\n- **friction_weakening**: none: 95% CI [-0.0233, 0.792] includes zero\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"m0026"},{"kind":"model","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","ladder":null,"ladder_step":"2 · full, soft friction","headline_mrad":{"value":2.161579,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can1.json)"},"headline_runs":[3.647386,2.177052,2.161579,2.061147,2.148931],"headline_x":{"value":2.410258,"n":5,"basis":"derived","source":"headline / this actuator's floor, 0.897 mrad (floors.json, 5 repeats)"},"headline_x_runs":[4.067,2.427512,2.410258,2.298272,2.396155],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.896825,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":1,"rank_desc":4,"best":true,"best_model":"M4.ripple.soft","leader":"CAN 1 · M4.ripple.soft","runner_up_x":2.581741,"twin_grade":"no","coulomb":{"value":0.06720834,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.0534933,"high":0.0827588},"viscous":{"value":-0.36096193,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.79231292,"high":0.02331965},"breakaway":{"value":null,"why":"not in M4.ripple.soft"},"stribeck_velocity":{"value":null,"why":"not in M4.ripple.soft"},"weakening":{"value":null,"why":"not in this twin (the weakening ablation changes nothing)"},"capture_fraction":{"value":null,"why":"not in M4.ripple.soft"},"capture_speed":{"value":null,"why":"not in M4.ripple.soft"},"capture_dwell":{"value":null,"why":"not in M4.ripple.soft"},"ripple":{"value":0.02162866,"unit":"N·m","source":"model card: torque ripple + cogging (rotor-angle map, RMS) (tau = c_plateau + sum_k a_k cos(k*10*q) + b_k sin, k = 1..32 per rotor revolution, on settled plateaus with k_max*r*|v|/2pi <= 0.7 x the reply Nyquist rate; block bootstrap of the map RMS; tiers [64, 128] only if every leave-one-run-out fold gains >= 0.02 R2)","basis":"measured","low":0.01978032,"high":0.02213662},"backlash":{"value":null,"why":"not in this twin (its ablation changes nothing)"},"gear_stiffness":{"value":460.8,"unit":"N·m/rad","source":"model card: gear torsional stiffness (lower bound: the stop press measures gear and stop in series, so the gear alone is at least this stiff)","basis":"measured","low":435.1,"high":486.4},"inertia":{"value":0.00059611,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00051408,"high":0.00068032},"torque_scale":{"value":null,"why":"not in M4.ripple.soft"},"kt":{"value":null,"why":"not in M4.ripple.soft"},"current_loop":{"value":null,"why":"not in M4.ripple.soft"},"latency":{"value":null,"why":"not in M4.ripple.soft"},"resistance":{"value":null,"why":"not in M4.ripple.soft"},"inductance":{"value":null,"why":"not in M4.ripple.soft"},"kv":{"value":null,"why":"not in M4.ripple.soft"},"winding_rth":{"value":null,"why":"not in M4.ripple.soft"},"description":"**M4.ripple.soft** on CAN 1 · GIM4305-10: Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction.\n\nContract kind `ripple_map` (robotparts contract 2.3, not merged): Cogging and commutation ripple as rotor-periodic torque harmonics at the output (the torque_ripple records in one map), optionally with Coulomb and viscous friction.\n\n```\ntau_ripple = sum_k amplitude_k*sin(rotor_harmonic_k*theta_rotor + phase_k), theta_rotor = gear_ratio*theta_output in rad from the rotor zero the simulator uses\n```\n\nThe same twin on MuJoCo's default soft friction (it creeps instead of sticking): the budget's `friction stiffness` ablation, run by run.\n\nWhat this twin runs (`budget_can1.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: identified axis inertia 0.0005961 kg.m^2\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (95% CI [-0.792, 0.0233] includes zero)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: plateau ripple map, k 1..96 per rotor rev (r 10), RMS 21.6 mN.m [19.8, 22.1], cross-validated R2 0.30, 0.41, 0.40\n- **friction_weakening**: none: 95% CI [-0.0233, 0.792] includes zero\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"m0027"},{"kind":"model","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M0","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.896825,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M4.ripple.soft","leader":"CAN 1 · M4.ripple.soft","runner_up_x":2.581741,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M0.ideal"},"viscous":{"value":null,"why":"not in M0.ideal"},"breakaway":{"value":null,"why":"not in M0.ideal"},"stribeck_velocity":{"value":null,"why":"not in M0.ideal"},"weakening":{"value":null,"why":"not in M0.ideal"},"capture_fraction":{"value":null,"why":"not in M0.ideal"},"capture_speed":{"value":null,"why":"not in M0.ideal"},"capture_dwell":{"value":null,"why":"not in M0.ideal"},"ripple":{"value":null,"why":"not in M0.ideal"},"backlash":{"value":null,"why":"not in M0.ideal"},"gear_stiffness":{"value":null,"why":"not in M0.ideal"},"inertia":{"value":null,"why":"not in M0.ideal"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.50892838,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M0.ideal"},"latency":{"value":null,"why":"not in M0.ideal"},"resistance":{"value":null,"why":"not in M0.ideal"},"inductance":{"value":null,"why":"not in M0.ideal"},"kv":{"value":null,"why":"not in M0.ideal"},"winding_rth":{"value":null,"why":"not in M0.ideal"},"description":"**M0.ideal** on CAN 1 · GIM4305-10: no friction, datasheet inertia.\n\nNo friction and the datasheet's inertia: the ablation baseline. Not a contract kind.\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"m0028"},{"kind":"model","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M1","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.896825,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M4.ripple.soft","leader":"CAN 1 · M4.ripple.soft","runner_up_x":2.581741,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M1.datasheet"},"viscous":{"value":null,"why":"not in M1.datasheet"},"breakaway":{"value":null,"why":"not in M1.datasheet"},"stribeck_velocity":{"value":null,"why":"not in M1.datasheet"},"weakening":{"value":null,"why":"not in M1.datasheet"},"capture_fraction":{"value":null,"why":"not in M1.datasheet"},"capture_speed":{"value":null,"why":"not in M1.datasheet"},"capture_dwell":{"value":null,"why":"not in M1.datasheet"},"ripple":{"value":null,"why":"not in M1.datasheet"},"backlash":{"value":15.0,"basis":"datasheet","unit":"arcmin","source":"datasheet: SteadyWin GIM4305-10 (integrated 10:1 planetary)"},"gear_stiffness":{"value":null,"why":"not in M1.datasheet"},"inertia":{"value":null,"why":"not in M1.datasheet"},"torque_scale":{"value":null,"why":"not in M1.datasheet"},"kt":{"value":null,"why":"not in M1.datasheet"},"current_loop":{"value":null,"why":"not in M1.datasheet"},"latency":{"value":null,"why":"not in M1.datasheet"},"resistance":{"value":0.565,"low":0.555,"high":0.575,"basis":"datasheet","unit":"Ω","source":"datasheet: SteadyWin GIM4305-10 (integrated 10:1 planetary) (phase-phase / 2)"},"inductance":{"value":null,"why":"not in M1.datasheet"},"kv":{"value":160.0,"low":152.5,"high":167.5,"basis":"datasheet","unit":"rpm/V","source":"datasheet: SteadyWin GIM4305-10 (integrated 10:1 planetary)"},"winding_rth":{"value":null,"why":"not in M1.datasheet"},"description":"**M1.datasheet** on CAN 1 · GIM4305-10: the stated values, nothing fitted.\n\nContract kind `datasheet` (robotparts contract 2.3, not merged): The datasheet's own model: the part's stated values and nothing fitted. Every term is a registry key and equals the part's spec in SI (relative tolerance 1e-6), and fitted_from is []. MJCF joint attributes express it (armature, frictionloss, damping), so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v; armature = output_inertia, or gear_ratio^2*(rotor_inertia + gearbox_input_inertia)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"m0029"},{"kind":"model","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M3.lugre","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.896825,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M4.ripple.soft","leader":"CAN 1 · M4.ripple.soft","runner_up_x":2.581741,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.06720834,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.0534933,"high":0.0827588},"viscous":{"value":-0.36096193,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.79231292,"high":0.02331965},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":null,"why":"not in M3.lugre"},"capture_fraction":{"value":null,"why":"not in M3.lugre"},"capture_speed":{"value":null,"why":"not in M3.lugre"},"capture_dwell":{"value":null,"why":"not in M3.lugre"},"ripple":{"value":null,"why":"not in M3.lugre"},"backlash":{"value":null,"why":"not in M3.lugre"},"gear_stiffness":{"value":null,"why":"not in M3.lugre"},"inertia":{"value":0.00059611,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"measured","low":0.00051408,"high":0.00068032},"torque_scale":{"value":null,"why":"not in M3.lugre"},"kt":{"value":null,"why":"not in M3.lugre"},"current_loop":{"value":null,"why":"not in M3.lugre"},"latency":{"value":null,"why":"not in M3.lugre"},"resistance":{"value":null,"why":"not in M3.lugre"},"inductance":{"value":null,"why":"not in M3.lugre"},"kv":{"value":null,"why":"not in M3.lugre"},"winding_rth":{"value":null,"why":"not in M3.lugre"},"description":"**M3.lugre** on CAN 1 · GIM4305-10: LuGre: a bristle state.\n\nContract kind `lugre` (robotparts contract 2.3, not merged): The LuGre dynamic friction model (Canudas de Wit, Olsson, Astrom and Lischinsky, IEEE TAC 1995): bristles of deflection z give pre-sliding displacement, the Stribeck curve and frictional lag.\n\n```\ndz/dt = v - sigma0*|v|*z/g(v), g(v) = coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent); tau_f = sigma0*z + sigma1*dz/dt + sigma2*v; stribeck_exponent is 2 when absent\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"m0030"},{"kind":"model","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M5","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":0.896825,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M4.ripple.soft","leader":"CAN 1 · M4.ripple.soft","runner_up_x":2.581741,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M5.dcmotor"},"viscous":{"value":null,"why":"not in M5.dcmotor"},"breakaway":{"value":null,"why":"not in M5.dcmotor"},"stribeck_velocity":{"value":null,"why":"not in M5.dcmotor"},"weakening":{"value":null,"why":"not in M5.dcmotor"},"capture_fraction":{"value":null,"why":"not in M5.dcmotor"},"capture_speed":{"value":null,"why":"not in M5.dcmotor"},"capture_dwell":{"value":null,"why":"not in M5.dcmotor"},"ripple":{"value":null,"why":"not in M5.dcmotor"},"backlash":{"value":null,"why":"not in M5.dcmotor"},"gear_stiffness":{"value":null,"why":"not in M5.dcmotor"},"inertia":{"value":null,"why":"not in M5.dcmotor"},"torque_scale":{"value":null,"why":"not in M5.dcmotor"},"kt":{"value":0.50892838,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M5.dcmotor"},"latency":{"value":null,"why":"not in M5.dcmotor"},"resistance":{"value":0.631857,"unit":"Ω","source":"model card: phase resistance (phase-neutral), the board's calibration (moteus_tool calibration (conf get motor.resistance_ohm))","basis":"measured"},"inductance":{"value":0.224684,"unit":"mH","source":"model card: q-axis inductance, the board's calibration (conf get motor.inductance_q_H)","basis":"measured"},"kv":{"value":162.497,"unit":"rpm/V","source":"model card: Kv (rotor), the board's calibration (conf get motor.Kv)","basis":"measured"},"winding_rth":{"value":4.747,"unit":"K/W","source":"model card: thermal (winding from R; board limits) (winding rise from copper resistance (alpha 0.00393) by fixed 1.5/0.75 A d-axis probe windows; 2-pole Foster network fitted to the rise (residual 1.4 degC))","basis":"measured"},"description":"**M5.dcmotor** on CAN 1 · GIM4305-10: R, L, motor constant, winding heat.\n\nContract kind `mujoco_dcmotor` (robotparts contract 2.3, not merged): MuJoCo's DC motor actuator (the dcmotor shortcut, mjs_setToDCMotor, MuJoCo 3.16): electrical dynamics, gain and bias (back-EMF, cogging, LuGre friction), with its parameters named and shaped as MuJoCo takes them. The simulator pins the MuJoCo release and the code that sets them.\n\n```\nMuJoCo's own: mjDYN_DCMOTOR (electrical dynamics), mjGAIN_DCMOTOR (K or K/R), mjBIAS_DCMOTOR (back-EMF, cogging, LuGre friction)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"m0031"},{"kind":"model","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","ladder":null,"ladder_step":"1 · M2 identified","headline_mrad":{"value":30.555832,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can13.json)"},"headline_runs":[30.555832,23.394971,29.151032,35.465037,70.017767],"headline_x":{"value":10.573348,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.890 mrad (floors.json, 5 repeats)"},"headline_x_runs":[10.573348,8.095449,10.08724,12.272099,24.228509],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.889892,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":4,"rank_desc":1,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 13 · M2.coulomb_viscous.ideal","runner_up_x":2.744993,"twin_grade":"no","coulomb":{"value":0.80193178,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.73761252,"high":0.86415775},"viscous":{"value":0.13032123,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.28095629,"high":0.60996914},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous"},"kt":{"value":null,"why":"not in M2.coulomb_viscous"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous"},"latency":{"value":null,"why":"not in M2.coulomb_viscous"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous"},"kv":{"value":null,"why":"not in M2.coulomb_viscous"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous"},"description":"**M2.coulomb_viscous** on CAN 13 · JMC 60ASM200 + 10:1: Coulomb + viscous, as identified.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe budget's *identified* reference twin: the identified Coulomb friction and inertia on MuJoCo's native joint friction, no driver twin.","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"m0032"},{"kind":"model","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","ladder":null,"ladder_step":"4 · full + driver twin","headline_mrad":{"value":7.932732,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can13.json)"},"headline_runs":[17.447097,5.576086,6.883072,7.932732,55.484927],"headline_x":{"value":2.744993,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.890 mrad (floors.json, 5 repeats)"},"headline_x_runs":[6.037284,1.929514,2.381775,2.744993,19.199656],"dataset_x":3.467788,"worst_class_x":3.80588,"worst_class":"pickplace","floor_tape_x":2.977721,"oct25_x":3.430448,"floor_mrad":2.889892,"n_runs":30,"benches":["Held-out tapes · Oct 23","Dataset · Oct 24","Floor repeats · Oct 24","Dataset seeds · Oct 25"],"rank":2,"rank_desc":3,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 13 · M2.coulomb_viscous.ideal","runner_up_x":2.744993,"twin_grade":"no","coulomb":{"value":0.80193178,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.73761252,"high":0.86415775},"viscous":{"value":0.13032123,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.28095629,"high":0.60996914},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.71073183,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":200.0,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":98.85585288,"unit":"ms","source":"model card: command -> motion delay (closed loop) (median over runs of the cross-correlation lag qd_target -> qd)","basis":"measured","low":98.85585288,"high":98.85585288},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"description":"**M2.coulomb_viscous.r4** on CAN 13 · JMC 60ASM200 + 10:1: Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe full twin with the moteus-r4.11 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can13.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.00316 kg.m^2 (range 0.00247-0.00342) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the tag hub's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (95% CI [-0.281, 0.61] includes zero)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.49 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: the plateaus' viscous slope is not negative\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"m0033"},{"kind":"model","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","ladder":null,"ladder_step":"3 · full, ideal driver","headline_mrad":{"value":7.932644,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can13.json)"},"headline_runs":[17.446265,5.580634,6.884427,7.932644,55.483081],"headline_x":{"value":2.744962,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.890 mrad (floors.json, 5 repeats)"},"headline_x_runs":[6.036996,1.931088,2.382244,2.744962,19.199017],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.889892,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":1,"rank_desc":4,"best":true,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 13 · M2.coulomb_viscous.ideal","runner_up_x":2.744993,"twin_grade":"no","coulomb":{"value":0.80193178,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.73761252,"high":0.86415775},"viscous":{"value":0.13032123,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.28095629,"high":0.60996914},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.71073183,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"latency":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"description":"**M2.coulomb_viscous.ideal** on CAN 13 · JMC 60ASM200 + 10:1: Coulomb, sticking friction, tuned inertia, ideal driver (current loop off).\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe same twin with the driver's current loop switched off (an ideal driver): the budget's `current loop` ablation, run by run.\n\nWhat this twin runs (`budget_can13.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.00316 kg.m^2 (range 0.00247-0.00342) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the tag hub's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (95% CI [-0.281, 0.61] includes zero)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.49 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: the plateaus' viscous slope is not negative\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"m0034"},{"kind":"model","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","ladder":null,"ladder_step":"2 · full, soft friction","headline_mrad":{"value":29.874189,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can13.json)"},"headline_runs":[29.874189,22.544421,28.00078,34.497222,69.919946],"headline_x":{"value":10.337477,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.890 mrad (floors.json, 5 repeats)"},"headline_x_runs":[10.337477,7.80113,9.689214,11.937202,24.194659],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.889892,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":3,"rank_desc":2,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 13 · M2.coulomb_viscous.ideal","runner_up_x":2.744993,"twin_grade":"no","coulomb":{"value":0.80193178,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.73761252,"high":0.86415775},"viscous":{"value":0.13032123,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.28095629,"high":0.60996914},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"kt":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"latency":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"description":"**M2.coulomb_viscous.soft** on CAN 13 · JMC 60ASM200 + 10:1: Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe same twin on MuJoCo's default soft friction (it creeps instead of sticking): the budget's `friction stiffness` ablation, run by run.\n\nWhat this twin runs (`budget_can13.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.00316 kg.m^2 (range 0.00247-0.00342) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the tag hub's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (95% CI [-0.281, 0.61] includes zero)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.49 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: the plateaus' viscous slope is not negative\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 387c4dc5a0edeafe)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"m0035"},{"kind":"model","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","ladder":null,"ladder_step":"5 · M3.capture","headline_mrad":{"value":null,"why":"not run on the Oct 23 held-out tapes"},"headline_runs":[],"headline_x":{"value":null,"why":"not run on the Oct 23 held-out tapes"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":1.411926,"oct25_x":2.090865,"floor_mrad":2.889892,"n_runs":13,"benches":["Floor repeats · Oct 24","Dataset seeds · Oct 25"],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 13 · M2.coulomb_viscous.ideal","runner_up_x":2.744993,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.80193178,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.73761252,"high":0.86415775},"viscous":{"value":0.13032123,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.28095629,"high":0.60996914},"breakaway":{"value":null,"why":"not in M3.capture.r4"},"stribeck_velocity":{"value":null,"why":"not in M3.capture.r4"},"weakening":{"value":null,"why":"not in this twin (the weakening ablation changes nothing)"},"capture_fraction":{"value":0.85,"unit":"","basis":"measured","source":"round 7 capture fit on the training runs (dataset_twin, Oct 25)"},"capture_speed":{"value":0.075,"unit":"rad/s","basis":"measured","source":"round 7 capture fit on the training runs (dataset_twin, Oct 25)"},"capture_dwell":{"value":0.2,"unit":"s","basis":"measured","source":"round 7 capture fit on the training runs (dataset_twin, Oct 25)"},"ripple":{"value":null,"why":"not in M3.capture.r4"},"backlash":{"value":null,"why":"not in M3.capture.r4"},"gear_stiffness":{"value":null,"why":"not in M3.capture.r4"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.71073183,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":200.0,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":98.85585288,"unit":"ms","source":"model card: command -> motion delay (closed loop) (median over runs of the cross-correlation lag qd_target -> qd)","basis":"measured","low":98.85585288,"high":98.85585288},"resistance":{"value":null,"why":"not in M3.capture.r4"},"inductance":{"value":null,"why":"not in M3.capture.r4"},"kv":{"value":null,"why":"not in M3.capture.r4"},"winding_rth":{"value":null,"why":"not in M3.capture.r4"},"description":"**M3.capture.r4** on CAN 13 · JMC 60ASM200 + 10:1: the full twin + friction that captures below a speed.\n\nNot a robotparts 2.3 model kind yet: the rack's round-7 study adds friction that **captures** (sticks) below a capture speed after a dwell, on top of the deployed twin. Its fitted levels are the Capture columns.\n\nThe full twin with the moteus-r4.11 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can13.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.00316 kg.m^2 (range 0.00247-0.00342) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the tag hub's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (95% CI [-0.281, 0.61] includes zero)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.49 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: the plateaus' viscous slope is not negative\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"cdd3e58e10 + uncommitted changes (source sha256 cb867c83c13712e6)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"m0036"},{"kind":"model","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M0","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.889892,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 13 · M2.coulomb_viscous.ideal","runner_up_x":2.744993,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M0.ideal"},"viscous":{"value":null,"why":"not in M0.ideal"},"breakaway":{"value":null,"why":"not in M0.ideal"},"stribeck_velocity":{"value":null,"why":"not in M0.ideal"},"weakening":{"value":null,"why":"not in M0.ideal"},"capture_fraction":{"value":null,"why":"not in M0.ideal"},"capture_speed":{"value":null,"why":"not in M0.ideal"},"capture_dwell":{"value":null,"why":"not in M0.ideal"},"ripple":{"value":null,"why":"not in M0.ideal"},"backlash":{"value":null,"why":"not in M0.ideal"},"gear_stiffness":{"value":null,"why":"not in M0.ideal"},"inertia":{"value":null,"why":"not in M0.ideal"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.71073183,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M0.ideal"},"latency":{"value":null,"why":"not in M0.ideal"},"resistance":{"value":null,"why":"not in M0.ideal"},"inductance":{"value":null,"why":"not in M0.ideal"},"kv":{"value":null,"why":"not in M0.ideal"},"winding_rth":{"value":null,"why":"not in M0.ideal"},"description":"**M0.ideal** on CAN 13 · JMC 60ASM200 + 10:1: no friction, datasheet inertia.\n\nNo friction and the datasheet's inertia: the ablation baseline. Not a contract kind.\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"m0037"},{"kind":"model","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M1","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.889892,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 13 · M2.coulomb_viscous.ideal","runner_up_x":2.744993,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M1.datasheet"},"viscous":{"value":null,"why":"not in M1.datasheet"},"breakaway":{"value":null,"why":"not in M1.datasheet"},"stribeck_velocity":{"value":null,"why":"not in M1.datasheet"},"weakening":{"value":null,"why":"not in M1.datasheet"},"capture_fraction":{"value":null,"why":"not in M1.datasheet"},"capture_speed":{"value":null,"why":"not in M1.datasheet"},"capture_dwell":{"value":null,"why":"not in M1.datasheet"},"ripple":{"value":null,"why":"not in M1.datasheet"},"backlash":{"value":3.0,"basis":"datasheet","unit":"arcmin","source":"datasheet: JMC 60ASM200 (200 W, 36 V) + StepperOnline AD60-G10-D14 10:1"},"gear_stiffness":{"value":null,"why":"not in M1.datasheet"},"inertia":{"value":null,"why":"not in M1.datasheet"},"torque_scale":{"value":null,"why":"not in M1.datasheet"},"kt":{"value":null,"why":"not in M1.datasheet"},"current_loop":{"value":null,"why":"not in M1.datasheet"},"latency":{"value":null,"why":"not in M1.datasheet"},"resistance":{"value":null,"why":"not published"},"inductance":{"value":null,"why":"not in M1.datasheet"},"kv":{"value":null,"why":"not published"},"winding_rth":{"value":null,"why":"not in M1.datasheet"},"description":"**M1.datasheet** on CAN 13 · JMC 60ASM200 + 10:1: the stated values, nothing fitted.\n\nContract kind `datasheet` (robotparts contract 2.3, not merged): The datasheet's own model: the part's stated values and nothing fitted. Every term is a registry key and equals the part's spec in SI (relative tolerance 1e-6), and fitted_from is []. MJCF joint attributes express it (armature, frictionloss, damping), so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v; armature = output_inertia, or gear_ratio^2*(rotor_inertia + gearbox_input_inertia)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"m0038"},{"kind":"model","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M3.lugre","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.889892,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 13 · M2.coulomb_viscous.ideal","runner_up_x":2.744993,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.80193178,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.73761252,"high":0.86415775},"viscous":{"value":0.13032123,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.28095629,"high":0.60996914},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":null,"why":"not in M3.lugre"},"capture_fraction":{"value":null,"why":"not in M3.lugre"},"capture_speed":{"value":null,"why":"not in M3.lugre"},"capture_dwell":{"value":null,"why":"not in M3.lugre"},"ripple":{"value":null,"why":"not in M3.lugre"},"backlash":{"value":null,"why":"not in M3.lugre"},"gear_stiffness":{"value":null,"why":"not in M3.lugre"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":null,"why":"not in M3.lugre"},"kt":{"value":null,"why":"not in M3.lugre"},"current_loop":{"value":null,"why":"not in M3.lugre"},"latency":{"value":null,"why":"not in M3.lugre"},"resistance":{"value":null,"why":"not in M3.lugre"},"inductance":{"value":null,"why":"not in M3.lugre"},"kv":{"value":null,"why":"not in M3.lugre"},"winding_rth":{"value":null,"why":"not in M3.lugre"},"description":"**M3.lugre** on CAN 13 · JMC 60ASM200 + 10:1: LuGre: a bristle state.\n\nContract kind `lugre` (robotparts contract 2.3, not merged): The LuGre dynamic friction model (Canudas de Wit, Olsson, Astrom and Lischinsky, IEEE TAC 1995): bristles of deflection z give pre-sliding displacement, the Stribeck curve and frictional lag.\n\n```\ndz/dt = v - sigma0*|v|*z/g(v), g(v) = coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent); tau_f = sigma0*z + sigma1*dz/dt + sigma2*v; stribeck_exponent is 2 when absent\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"m0039"},{"kind":"model","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M5","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.889892,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 13 · M2.coulomb_viscous.ideal","runner_up_x":2.744993,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M5.dcmotor"},"viscous":{"value":null,"why":"not in M5.dcmotor"},"breakaway":{"value":null,"why":"not in M5.dcmotor"},"stribeck_velocity":{"value":null,"why":"not in M5.dcmotor"},"weakening":{"value":null,"why":"not in M5.dcmotor"},"capture_fraction":{"value":null,"why":"not in M5.dcmotor"},"capture_speed":{"value":null,"why":"not in M5.dcmotor"},"capture_dwell":{"value":null,"why":"not in M5.dcmotor"},"ripple":{"value":null,"why":"not in M5.dcmotor"},"backlash":{"value":null,"why":"not in M5.dcmotor"},"gear_stiffness":{"value":null,"why":"not in M5.dcmotor"},"inertia":{"value":null,"why":"not in M5.dcmotor"},"torque_scale":{"value":null,"why":"not in M5.dcmotor"},"kt":{"value":0.71073183,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M5.dcmotor"},"latency":{"value":null,"why":"not in M5.dcmotor"},"resistance":{"value":0.199699,"unit":"Ω","source":"model card: phase resistance (phase-neutral), the board's calibration (moteus_tool calibration (conf get motor.resistance_ohm))","basis":"measured"},"inductance":{"value":0.543113,"unit":"mH","source":"model card: q-axis inductance, the board's calibration (conf get motor.inductance_q_H)","basis":"measured"},"kv":{"value":116.358,"unit":"rpm/V","source":"model card: Kv (rotor), the board's calibration (conf get motor.Kv)","basis":"measured"},"winding_rth":{"value":null,"why":"not identified"},"description":"**M5.dcmotor** on CAN 13 · JMC 60ASM200 + 10:1: R, L, motor constant, winding heat.\n\nContract kind `mujoco_dcmotor` (robotparts contract 2.3, not merged): MuJoCo's DC motor actuator (the dcmotor shortcut, mjs_setToDCMotor, MuJoCo 3.16): electrical dynamics, gain and bias (back-EMF, cogging, LuGre friction), with its parameters named and shaped as MuJoCo takes them. The simulator pins the MuJoCo release and the code that sets them.\n\n```\nMuJoCo's own: mjDYN_DCMOTOR (electrical dynamics), mjGAIN_DCMOTOR (K or K/R), mjBIAS_DCMOTOR (back-EMF, cogging, LuGre friction)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"m0040"},{"kind":"model","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","ladder":null,"ladder_step":"1 · M2 identified","headline_mrad":{"value":21.838264,"unit":"mrad","n":4,"basis":"measured","source":"median q RMS over the 4 Oct 23 held-out runs (budget_can12.json)"},"headline_runs":[13.697228,20.260073,23.416455,31.76174],"headline_x":{"value":7.464629,"n":4,"basis":"derived","source":"headline / this actuator's floor, 2.926 mrad (floors.json, 5 repeats)"},"headline_x_runs":[4.681907,6.925181,8.004077,10.856613],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.925566,"n_runs":4,"benches":["Held-out tapes · Oct 23"],"rank":3,"rank_desc":2,"best":false,"best_model":"M3.stribeck.r4","leader":"CAN 12 · M3.stribeck.r4","runner_up_x":3.84636,"twin_grade":"no","coulomb":{"value":0.99427911,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.88789456,"high":1.10437502},"viscous":{"value":-1.34664008,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-2.12558041,"high":-0.83995017},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous"},"kt":{"value":null,"why":"not in M2.coulomb_viscous"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous"},"latency":{"value":null,"why":"not in M2.coulomb_viscous"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous"},"kv":{"value":null,"why":"not in M2.coulomb_viscous"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous"},"description":"**M2.coulomb_viscous** on CAN 12 · JMC 60ASM200 + 10:1: Coulomb + viscous, as identified.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe budget's *identified* reference twin: the identified Coulomb friction and inertia on MuJoCo's native joint friction, no driver twin.","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"3f6579b5b4 + uncommitted changes (source sha256 d363a3b617b175d8)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"m0041"},{"kind":"model","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","ladder":null,"ladder_step":"4 · full + driver twin","headline_mrad":{"value":9.74236,"unit":"mrad","n":4,"basis":"measured","source":"median q RMS over the 4 Oct 23 held-out runs (budget_can12.json)"},"headline_runs":[13.783102,10.462676,7.380618,9.022045],"headline_x":{"value":3.330077,"n":4,"basis":"derived","source":"headline / this actuator's floor, 2.926 mrad (floors.json, 5 repeats)"},"headline_x_runs":[4.71126,3.576291,2.5228,3.083863],"dataset_x":5.34461,"worst_class_x":10.792059,"worst_class":"cycle","floor_tape_x":2.888974,"oct25_x":5.488948,"floor_mrad":2.925566,"n_runs":28,"benches":["Held-out tapes · Oct 23","Dataset · Oct 24","Floor repeats · Oct 24","Dataset seeds · Oct 25"],"rank":1,"rank_desc":4,"best":true,"best_model":"M3.stribeck.r4","leader":"CAN 12 · M3.stribeck.r4","runner_up_x":3.84636,"twin_grade":"no","coulomb":{"value":0.99427911,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.88789456,"high":1.10437502},"viscous":{"value":-1.34664008,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-2.12558041,"high":-0.83995017},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":1.34664008,"unit":"N·m·s/rad","source":"model card: velocity weakening (Stribeck-like) (minus the plateaus' viscous slope b (tau = Fc*sgn(v) + b*v + tau0), applied up to the fastest plateau speed)","basis":"measured","low":0.83995017,"high":2.12558041},"capture_fraction":{"value":null,"why":"not in M3.stribeck.r4"},"capture_speed":{"value":null,"why":"not in M3.stribeck.r4"},"capture_dwell":{"value":null,"why":"not in M3.stribeck.r4"},"ripple":{"value":null,"why":"not in M3.stribeck.r4"},"backlash":{"value":null,"why":"not in M3.stribeck.r4"},"gear_stiffness":{"value":null,"why":"not in M3.stribeck.r4"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.71350964,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":200.0,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":null,"why":"not measured yet"},"resistance":{"value":null,"why":"not in M3.stribeck.r4"},"inductance":{"value":null,"why":"not in M3.stribeck.r4"},"kv":{"value":null,"why":"not in M3.stribeck.r4"},"winding_rth":{"value":null,"why":"not in M3.stribeck.r4"},"description":"**M3.stribeck.r4** on CAN 12 · JMC 60ASM200 + 10:1: Coulomb + velocity weakening, with the moteus-r4.11 driver twin.\n\nContract kind `stribeck` (robotparts contract 2.3, not merged): Friction that falls from its breakaway value to the Coulomb value as the output speeds up, plus viscous friction (the Stribeck curve).\n\n```\ntau_f = (coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent))*sign(v) + viscous_friction*v; stribeck_exponent is 2 when absent\n```\n\nThe full twin with the moteus-r4.11 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can12.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.00316 kg.m^2 (range 0.00247-0.00342) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the tag hub's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (negative viscous -1.347 (CI excludes zero): Stribeck-like, not a damping a twin can run)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.48 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: 1.347 N.m.s/rad [0.84, 2.13] up to 0.2 rad/s (the plateaus' negative viscous slope)\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"3f6579b5b4 + uncommitted changes (source sha256 d363a3b617b175d8)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"m0042"},{"kind":"model","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","ladder":null,"ladder_step":"3 · full, ideal driver","headline_mrad":{"value":11.252781,"unit":"mrad","n":4,"basis":"measured","source":"median q RMS over the 4 Oct 23 held-out runs (budget_can12.json)"},"headline_runs":[13.752174,10.407709,7.425882,12.097853],"headline_x":{"value":3.84636,"n":4,"basis":"derived","source":"headline / this actuator's floor, 2.926 mrad (floors.json, 5 repeats)"},"headline_x_runs":[4.700688,3.557503,2.538272,4.135218],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.925566,"n_runs":4,"benches":["Held-out tapes · Oct 23"],"rank":2,"rank_desc":3,"best":false,"best_model":"M3.stribeck.r4","leader":"CAN 12 · M3.stribeck.r4","runner_up_x":3.84636,"twin_grade":"no","coulomb":{"value":0.99427911,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.88789456,"high":1.10437502},"viscous":{"value":-1.34664008,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-2.12558041,"high":-0.83995017},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":1.34664008,"unit":"N·m·s/rad","source":"model card: velocity weakening (Stribeck-like) (minus the plateaus' viscous slope b (tau = Fc*sgn(v) + b*v + tau0), applied up to the fastest plateau speed)","basis":"measured","low":0.83995017,"high":2.12558041},"capture_fraction":{"value":null,"why":"not in M3.stribeck.ideal"},"capture_speed":{"value":null,"why":"not in M3.stribeck.ideal"},"capture_dwell":{"value":null,"why":"not in M3.stribeck.ideal"},"ripple":{"value":null,"why":"not in M3.stribeck.ideal"},"backlash":{"value":null,"why":"not in M3.stribeck.ideal"},"gear_stiffness":{"value":null,"why":"not in M3.stribeck.ideal"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.71350964,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M3.stribeck.ideal"},"latency":{"value":null,"why":"not in M3.stribeck.ideal"},"resistance":{"value":null,"why":"not in M3.stribeck.ideal"},"inductance":{"value":null,"why":"not in M3.stribeck.ideal"},"kv":{"value":null,"why":"not in M3.stribeck.ideal"},"winding_rth":{"value":null,"why":"not in M3.stribeck.ideal"},"description":"**M3.stribeck.ideal** on CAN 12 · JMC 60ASM200 + 10:1: Coulomb + velocity weakening, ideal driver (current loop off).\n\nContract kind `stribeck` (robotparts contract 2.3, not merged): Friction that falls from its breakaway value to the Coulomb value as the output speeds up, plus viscous friction (the Stribeck curve).\n\n```\ntau_f = (coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent))*sign(v) + viscous_friction*v; stribeck_exponent is 2 when absent\n```\n\nThe same twin with the driver's current loop switched off (an ideal driver): the budget's `current loop` ablation, run by run.\n\nWhat this twin runs (`budget_can12.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.00316 kg.m^2 (range 0.00247-0.00342) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the tag hub's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (negative viscous -1.347 (CI excludes zero): Stribeck-like, not a damping a twin can run)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.48 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: 1.347 N.m.s/rad [0.84, 2.13] up to 0.2 rad/s (the plateaus' negative viscous slope)\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"3f6579b5b4 + uncommitted changes (source sha256 d363a3b617b175d8)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"m0043"},{"kind":"model","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","ladder":null,"ladder_step":"2 · full, soft friction","headline_mrad":{"value":27.568156,"unit":"mrad","n":4,"basis":"measured","source":"median q RMS over the 4 Oct 23 held-out runs (budget_can12.json)"},"headline_runs":[21.432965,23.810134,31.326178,37.362885],"headline_x":{"value":9.423187,"n":4,"basis":"derived","source":"headline / this actuator's floor, 2.926 mrad (floors.json, 5 repeats)"},"headline_x_runs":[7.326092,8.138642,10.707732,12.771165],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.925566,"n_runs":4,"benches":["Held-out tapes · Oct 23"],"rank":4,"rank_desc":1,"best":false,"best_model":"M3.stribeck.r4","leader":"CAN 12 · M3.stribeck.r4","runner_up_x":3.84636,"twin_grade":"no","coulomb":{"value":0.99427911,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.88789456,"high":1.10437502},"viscous":{"value":-1.34664008,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-2.12558041,"high":-0.83995017},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":1.34664008,"unit":"N·m·s/rad","source":"model card: velocity weakening (Stribeck-like) (minus the plateaus' viscous slope b (tau = Fc*sgn(v) + b*v + tau0), applied up to the fastest plateau speed)","basis":"measured","low":0.83995017,"high":2.12558041},"capture_fraction":{"value":null,"why":"not in M3.stribeck.soft"},"capture_speed":{"value":null,"why":"not in M3.stribeck.soft"},"capture_dwell":{"value":null,"why":"not in M3.stribeck.soft"},"ripple":{"value":null,"why":"not in M3.stribeck.soft"},"backlash":{"value":null,"why":"not in M3.stribeck.soft"},"gear_stiffness":{"value":null,"why":"not in M3.stribeck.soft"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":null,"why":"not in M3.stribeck.soft"},"kt":{"value":null,"why":"not in M3.stribeck.soft"},"current_loop":{"value":null,"why":"not in M3.stribeck.soft"},"latency":{"value":null,"why":"not in M3.stribeck.soft"},"resistance":{"value":null,"why":"not in M3.stribeck.soft"},"inductance":{"value":null,"why":"not in M3.stribeck.soft"},"kv":{"value":null,"why":"not in M3.stribeck.soft"},"winding_rth":{"value":null,"why":"not in M3.stribeck.soft"},"description":"**M3.stribeck.soft** on CAN 12 · JMC 60ASM200 + 10:1: Coulomb + velocity weakening, MuJoCo's soft friction.\n\nContract kind `stribeck` (robotparts contract 2.3, not merged): Friction that falls from its breakaway value to the Coulomb value as the output speeds up, plus viscous friction (the Stribeck curve).\n\n```\ntau_f = (coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent))*sign(v) + viscous_friction*v; stribeck_exponent is 2 when absent\n```\n\nThe same twin on MuJoCo's default soft friction (it creeps instead of sticking): the budget's `friction stiffness` ablation, run by run.\n\nWhat this twin runs (`budget_can12.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.00316 kg.m^2 (range 0.00247-0.00342) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the tag hub's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (negative viscous -1.347 (CI excludes zero): Stribeck-like, not a damping a twin can run)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.48 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: 1.347 N.m.s/rad [0.84, 2.13] up to 0.2 rad/s (the plateaus' negative viscous slope)\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"3f6579b5b4 + uncommitted changes (source sha256 d363a3b617b175d8)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"m0044"},{"kind":"model","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","ladder":null,"ladder_step":"5 · M3.capture","headline_mrad":{"value":null,"why":"not run on the Oct 23 held-out tapes"},"headline_runs":[],"headline_x":{"value":null,"why":"not run on the Oct 23 held-out tapes"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":1.227834,"oct25_x":1.915157,"floor_mrad":2.925566,"n_runs":12,"benches":["Floor repeats · Oct 24","Dataset seeds · Oct 25"],"rank":null,"rank_desc":null,"best":false,"best_model":"M3.stribeck.r4","leader":"CAN 12 · M3.stribeck.r4","runner_up_x":3.84636,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.99427911,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.88789456,"high":1.10437502},"viscous":{"value":-1.34664008,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-2.12558041,"high":-0.83995017},"breakaway":{"value":null,"why":"not in M3.capture.r4"},"stribeck_velocity":{"value":null,"why":"not in M3.capture.r4"},"weakening":{"value":1.34664008,"unit":"N·m·s/rad","source":"model card: velocity weakening (Stribeck-like) (minus the plateaus' viscous slope b (tau = Fc*sgn(v) + b*v + tau0), applied up to the fastest plateau speed)","basis":"measured","low":0.83995017,"high":2.12558041},"capture_fraction":{"value":0.55,"unit":"","basis":"measured","source":"round 7 capture fit on the training runs (dataset_twin, Oct 25)"},"capture_speed":{"value":0.05,"unit":"rad/s","basis":"measured","source":"round 7 capture fit on the training runs (dataset_twin, Oct 25)"},"capture_dwell":{"value":0.009375,"unit":"s","basis":"measured","source":"round 7 capture fit on the training runs (dataset_twin, Oct 25)"},"ripple":{"value":null,"why":"not in M3.capture.r4"},"backlash":{"value":null,"why":"not in M3.capture.r4"},"gear_stiffness":{"value":null,"why":"not in M3.capture.r4"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.71350964,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":200.0,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":null,"why":"not measured yet"},"resistance":{"value":null,"why":"not in M3.capture.r4"},"inductance":{"value":null,"why":"not in M3.capture.r4"},"kv":{"value":null,"why":"not in M3.capture.r4"},"winding_rth":{"value":null,"why":"not in M3.capture.r4"},"description":"**M3.capture.r4** on CAN 12 · JMC 60ASM200 + 10:1: the full twin + friction that captures below a speed.\n\nNot a robotparts 2.3 model kind yet: the rack's round-7 study adds friction that **captures** (sticks) below a capture speed after a dwell, on top of the deployed twin. Its fitted levels are the Capture columns.\n\nThe full twin with the moteus-r4.11 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can12.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.00316 kg.m^2 (range 0.00247-0.00342) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the tag hub's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (negative viscous -1.347 (CI excludes zero): Stribeck-like, not a damping a twin can run)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.48 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: 1.347 N.m.s/rad [0.84, 2.13] up to 0.2 rad/s (the plateaus' negative viscous slope)\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"cdd3e58e10 + uncommitted changes (source sha256 cb867c83c13712e6)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"m0045"},{"kind":"model","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M0","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.925566,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M3.stribeck.r4","leader":"CAN 12 · M3.stribeck.r4","runner_up_x":3.84636,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M0.ideal"},"viscous":{"value":null,"why":"not in M0.ideal"},"breakaway":{"value":null,"why":"not in M0.ideal"},"stribeck_velocity":{"value":null,"why":"not in M0.ideal"},"weakening":{"value":null,"why":"not in M0.ideal"},"capture_fraction":{"value":null,"why":"not in M0.ideal"},"capture_speed":{"value":null,"why":"not in M0.ideal"},"capture_dwell":{"value":null,"why":"not in M0.ideal"},"ripple":{"value":null,"why":"not in M0.ideal"},"backlash":{"value":null,"why":"not in M0.ideal"},"gear_stiffness":{"value":null,"why":"not in M0.ideal"},"inertia":{"value":null,"why":"not in M0.ideal"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.71350964,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M0.ideal"},"latency":{"value":null,"why":"not in M0.ideal"},"resistance":{"value":null,"why":"not in M0.ideal"},"inductance":{"value":null,"why":"not in M0.ideal"},"kv":{"value":null,"why":"not in M0.ideal"},"winding_rth":{"value":null,"why":"not in M0.ideal"},"description":"**M0.ideal** on CAN 12 · JMC 60ASM200 + 10:1: no friction, datasheet inertia.\n\nNo friction and the datasheet's inertia: the ablation baseline. Not a contract kind.\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"m0046"},{"kind":"model","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M1","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.925566,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M3.stribeck.r4","leader":"CAN 12 · M3.stribeck.r4","runner_up_x":3.84636,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M1.datasheet"},"viscous":{"value":null,"why":"not in M1.datasheet"},"breakaway":{"value":null,"why":"not in M1.datasheet"},"stribeck_velocity":{"value":null,"why":"not in M1.datasheet"},"weakening":{"value":null,"why":"not in M1.datasheet"},"capture_fraction":{"value":null,"why":"not in M1.datasheet"},"capture_speed":{"value":null,"why":"not in M1.datasheet"},"capture_dwell":{"value":null,"why":"not in M1.datasheet"},"ripple":{"value":null,"why":"not in M1.datasheet"},"backlash":{"value":3.0,"basis":"datasheet","unit":"arcmin","source":"datasheet: JMC 60ASM200 (200 W, 36 V) + StepperOnline AD60-G10-D14 10:1"},"gear_stiffness":{"value":null,"why":"not in M1.datasheet"},"inertia":{"value":null,"why":"not in M1.datasheet"},"torque_scale":{"value":null,"why":"not in M1.datasheet"},"kt":{"value":null,"why":"not in M1.datasheet"},"current_loop":{"value":null,"why":"not in M1.datasheet"},"latency":{"value":null,"why":"not in M1.datasheet"},"resistance":{"value":null,"why":"not published"},"inductance":{"value":null,"why":"not in M1.datasheet"},"kv":{"value":null,"why":"not published"},"winding_rth":{"value":null,"why":"not in M1.datasheet"},"description":"**M1.datasheet** on CAN 12 · JMC 60ASM200 + 10:1: the stated values, nothing fitted.\n\nContract kind `datasheet` (robotparts contract 2.3, not merged): The datasheet's own model: the part's stated values and nothing fitted. Every term is a registry key and equals the part's spec in SI (relative tolerance 1e-6), and fitted_from is []. MJCF joint attributes express it (armature, frictionloss, damping), so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v; armature = output_inertia, or gear_ratio^2*(rotor_inertia + gearbox_input_inertia)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"m0047"},{"kind":"model","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M3.lugre","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.925566,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M3.stribeck.r4","leader":"CAN 12 · M3.stribeck.r4","runner_up_x":3.84636,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.99427911,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.88789456,"high":1.10437502},"viscous":{"value":-1.34664008,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-2.12558041,"high":-0.83995017},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":null,"why":"not in M3.lugre"},"capture_fraction":{"value":null,"why":"not in M3.lugre"},"capture_speed":{"value":null,"why":"not in M3.lugre"},"capture_dwell":{"value":null,"why":"not in M3.lugre"},"ripple":{"value":null,"why":"not in M3.lugre"},"backlash":{"value":null,"why":"not in M3.lugre"},"gear_stiffness":{"value":null,"why":"not in M3.lugre"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":null,"why":"not in M3.lugre"},"kt":{"value":null,"why":"not in M3.lugre"},"current_loop":{"value":null,"why":"not in M3.lugre"},"latency":{"value":null,"why":"not in M3.lugre"},"resistance":{"value":null,"why":"not in M3.lugre"},"inductance":{"value":null,"why":"not in M3.lugre"},"kv":{"value":null,"why":"not in M3.lugre"},"winding_rth":{"value":null,"why":"not in M3.lugre"},"description":"**M3.lugre** on CAN 12 · JMC 60ASM200 + 10:1: LuGre: a bristle state.\n\nContract kind `lugre` (robotparts contract 2.3, not merged): The LuGre dynamic friction model (Canudas de Wit, Olsson, Astrom and Lischinsky, IEEE TAC 1995): bristles of deflection z give pre-sliding displacement, the Stribeck curve and frictional lag.\n\n```\ndz/dt = v - sigma0*|v|*z/g(v), g(v) = coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent); tau_f = sigma0*z + sigma1*dz/dt + sigma2*v; stribeck_exponent is 2 when absent\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"m0048"},{"kind":"model","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M5","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.925566,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M3.stribeck.r4","leader":"CAN 12 · M3.stribeck.r4","runner_up_x":3.84636,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M5.dcmotor"},"viscous":{"value":null,"why":"not in M5.dcmotor"},"breakaway":{"value":null,"why":"not in M5.dcmotor"},"stribeck_velocity":{"value":null,"why":"not in M5.dcmotor"},"weakening":{"value":null,"why":"not in M5.dcmotor"},"capture_fraction":{"value":null,"why":"not in M5.dcmotor"},"capture_speed":{"value":null,"why":"not in M5.dcmotor"},"capture_dwell":{"value":null,"why":"not in M5.dcmotor"},"ripple":{"value":null,"why":"not in M5.dcmotor"},"backlash":{"value":null,"why":"not in M5.dcmotor"},"gear_stiffness":{"value":null,"why":"not in M5.dcmotor"},"inertia":{"value":null,"why":"not in M5.dcmotor"},"torque_scale":{"value":null,"why":"not in M5.dcmotor"},"kt":{"value":0.71350964,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M5.dcmotor"},"latency":{"value":null,"why":"not in M5.dcmotor"},"resistance":{"value":0.209017,"unit":"Ω","source":"model card: phase resistance (phase-neutral), the board's calibration (moteus_tool calibration (conf get motor.resistance_ohm))","basis":"measured"},"inductance":{"value":0.515249,"unit":"mH","source":"model card: q-axis inductance, the board's calibration (conf get motor.inductance_q_H)","basis":"measured"},"kv":{"value":115.905,"unit":"rpm/V","source":"model card: Kv (rotor), the board's calibration (conf get motor.Kv)","basis":"measured"},"winding_rth":{"value":null,"why":"not identified"},"description":"**M5.dcmotor** on CAN 12 · JMC 60ASM200 + 10:1: R, L, motor constant, winding heat.\n\nContract kind `mujoco_dcmotor` (robotparts contract 2.3, not merged): MuJoCo's DC motor actuator (the dcmotor shortcut, mjs_setToDCMotor, MuJoCo 3.16): electrical dynamics, gain and bias (back-EMF, cogging, LuGre friction), with its parameters named and shaped as MuJoCo takes them. The simulator pins the MuJoCo release and the code that sets them.\n\n```\nMuJoCo's own: mjDYN_DCMOTOR (electrical dynamics), mjGAIN_DCMOTOR (K or K/R), mjBIAS_DCMOTOR (back-EMF, cogging, LuGre friction)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"m0049"},{"kind":"model","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","ladder":null,"ladder_step":"1 · M2 identified","headline_mrad":{"value":15.23036,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can11.json)"},"headline_runs":[10.843422,15.23036,15.289503,13.166042,27.505952],"headline_x":{"value":7.492325,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.033 mrad (floors.json, 5 repeats)"},"headline_x_runs":[5.334243,7.492325,7.52142,6.476818,13.531102],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.032795,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":4,"rank_desc":1,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 11 · M2.coulomb_viscous.ideal","runner_up_x":6.498761,"twin_grade":"no","coulomb":{"value":0.83312525,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.76698339,"high":0.92386182},"viscous":{"value":-0.61964171,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.46719312,"high":-0.14499568},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous"},"kt":{"value":null,"why":"not in M2.coulomb_viscous"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous"},"latency":{"value":null,"why":"not in M2.coulomb_viscous"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous"},"kv":{"value":null,"why":"not in M2.coulomb_viscous"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous"},"description":"**M2.coulomb_viscous** on CAN 11 · JMC 60ASM200 + 10:1: Coulomb + viscous, as identified.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe budget's *identified* reference twin: the identified Coulomb friction and inertia on MuJoCo's native joint friction, no driver twin.","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 26bf809e2e63a47a)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"m0050"},{"kind":"model","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","ladder":null,"ladder_step":"4 · full + driver twin","headline_mrad":{"value":13.210646,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can11.json)"},"headline_runs":[10.580625,13.210646,13.600033,10.950746,15.607841],"headline_x":{"value":6.498761,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.033 mrad (floors.json, 5 repeats)"},"headline_x_runs":[5.204964,6.498761,6.690313,5.387039,7.678021],"dataset_x":12.317431,"worst_class_x":16.083068,"worst_class":"sweep","floor_tape_x":8.509437,"oct25_x":null,"floor_mrad":2.032795,"n_runs":22,"benches":["Held-out tapes · Oct 23","Dataset · Oct 24","Floor repeats · Oct 24"],"rank":2,"rank_desc":3,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 11 · M2.coulomb_viscous.ideal","runner_up_x":6.498761,"twin_grade":"no","coulomb":{"value":0.83312525,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.76698339,"high":0.92386182},"viscous":{"value":-0.61964171,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.46719312,"high":-0.14499568},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.73196911,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":200.0,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":null,"why":"not measured yet"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"description":"**M2.coulomb_viscous.r4** on CAN 11 · JMC 60ASM200 + 10:1: Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe full twin with the moteus-r4.11 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can11.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.01313 kg.m^2 (range 0.00347-0.103) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the unweighed link (log-centre of its bound); bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb (plateaus with the identified gravity load taken off)\n- **damping**: none: viscous refused (95% CI [-1.47, -0.145] is wider than +-50% of -0.62)\n- **gravity**: identified G 4.661 N.m [4.04, 5.24], bottom -0.3737 rad [-0.392, -0.352] (output frame): a point mass on the bare hinge (twin.gravity_point_mass); over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.30 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: 95% CI [0.145, 1.47] is wider than +-50% of 0.62\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 26bf809e2e63a47a)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"m0051"},{"kind":"model","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","ladder":null,"ladder_step":"3 · full, ideal driver","headline_mrad":{"value":13.189592,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can11.json)"},"headline_runs":[10.568731,13.189592,13.595088,10.946858,15.611572],"headline_x":{"value":6.488403,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.033 mrad (floors.json, 5 repeats)"},"headline_x_runs":[5.199114,6.488403,6.68788,5.385127,7.679857],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.032795,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":1,"rank_desc":4,"best":true,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 11 · M2.coulomb_viscous.ideal","runner_up_x":6.498761,"twin_grade":"no","coulomb":{"value":0.83312525,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.76698339,"high":0.92386182},"viscous":{"value":-0.61964171,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.46719312,"high":-0.14499568},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.73196911,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"latency":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"description":"**M2.coulomb_viscous.ideal** on CAN 11 · JMC 60ASM200 + 10:1: Coulomb, sticking friction, tuned inertia, ideal driver (current loop off).\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe same twin with the driver's current loop switched off (an ideal driver): the budget's `current loop` ablation, run by run.\n\nWhat this twin runs (`budget_can11.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.01313 kg.m^2 (range 0.00347-0.103) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the unweighed link (log-centre of its bound); bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb (plateaus with the identified gravity load taken off)\n- **damping**: none: viscous refused (95% CI [-1.47, -0.145] is wider than +-50% of -0.62)\n- **gravity**: identified G 4.661 N.m [4.04, 5.24], bottom -0.3737 rad [-0.392, -0.352] (output frame): a point mass on the bare hinge (twin.gravity_point_mass); over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.30 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: 95% CI [0.145, 1.47] is wider than +-50% of 0.62\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 26bf809e2e63a47a)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"m0052"},{"kind":"model","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","ladder":null,"ladder_step":"2 · full, soft friction","headline_mrad":{"value":13.464898,"unit":"mrad","n":5,"basis":"measured","source":"median q RMS over the 5 Oct 23 held-out runs (budget_can11.json)"},"headline_runs":[10.240816,13.507049,13.464898,9.806219,14.805974],"headline_x":{"value":6.623836,"n":5,"basis":"derived","source":"headline / this actuator's floor, 2.033 mrad (floors.json, 5 repeats)"},"headline_x_runs":[5.037801,6.644571,6.623836,4.824008,7.283556],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.032795,"n_runs":5,"benches":["Held-out tapes · Oct 23"],"rank":3,"rank_desc":2,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 11 · M2.coulomb_viscous.ideal","runner_up_x":6.498761,"twin_grade":"no","coulomb":{"value":0.83312525,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.76698339,"high":0.92386182},"viscous":{"value":-0.61964171,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.46719312,"high":-0.14499568},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"kt":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"latency":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"description":"**M2.coulomb_viscous.soft** on CAN 11 · JMC 60ASM200 + 10:1: Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe same twin on MuJoCo's default soft friction (it creeps instead of sticking): the budget's `friction stiffness` ablation, run by run.\n\nWhat this twin runs (`budget_can11.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.01313 kg.m^2 (range 0.00347-0.103) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the unweighed link (log-centre of its bound); bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb (plateaus with the identified gravity load taken off)\n- **damping**: none: viscous refused (95% CI [-1.47, -0.145] is wider than +-50% of -0.62)\n- **gravity**: identified G 4.661 N.m [4.04, 5.24], bottom -0.3737 rad [-0.392, -0.352] (output frame): a point mass on the bare hinge (twin.gravity_point_mass); over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.30 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: 95% CI [0.145, 1.47] is wider than +-50% of 0.62\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"1b87916ba2 + uncommitted changes (source sha256 26bf809e2e63a47a)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"m0053"},{"kind":"model","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","ladder":null,"ladder_step":"5 · M3.capture","headline_mrad":{"value":null,"why":"not run on the Oct 23 held-out tapes"},"headline_runs":[],"headline_x":{"value":null,"why":"not run on the Oct 23 held-out tapes"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":4.832511,"oct25_x":4.114449,"floor_mrad":2.032795,"n_runs":13,"benches":["Floor repeats · Oct 24","Dataset seeds · Oct 25"],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 11 · M2.coulomb_viscous.ideal","runner_up_x":6.498761,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.83312525,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.76698339,"high":0.92386182},"viscous":{"value":-0.61964171,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.46719312,"high":-0.14499568},"breakaway":{"value":null,"why":"not in M3.capture.r4"},"stribeck_velocity":{"value":null,"why":"not in M3.capture.r4"},"weakening":{"value":null,"why":"not in this twin (the weakening ablation changes nothing)"},"capture_fraction":{"value":0.7,"unit":"","basis":"measured","source":"round 7 capture fit on the training runs (dataset_twin, Oct 25)"},"capture_speed":{"value":0.075,"unit":"rad/s","basis":"measured","source":"round 7 capture fit on the training runs (dataset_twin, Oct 25)"},"capture_dwell":{"value":0.02,"unit":"s","basis":"measured","source":"round 7 capture fit on the training runs (dataset_twin, Oct 25)"},"ripple":{"value":null,"why":"not in M3.capture.r4"},"backlash":{"value":null,"why":"not in M3.capture.r4"},"gear_stiffness":{"value":null,"why":"not in M3.capture.r4"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.73196911,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":200.0,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":null,"why":"not measured yet"},"resistance":{"value":null,"why":"not in M3.capture.r4"},"inductance":{"value":null,"why":"not in M3.capture.r4"},"kv":{"value":null,"why":"not in M3.capture.r4"},"winding_rth":{"value":null,"why":"not in M3.capture.r4"},"description":"**M3.capture.r4** on CAN 11 · JMC 60ASM200 + 10:1: the full twin + friction that captures below a speed.\n\nNot a robotparts 2.3 model kind yet: the rack's round-7 study adds friction that **captures** (sticks) below a capture speed after a dwell, on top of the deployed twin. Its fitted levels are the Capture columns.\n\nThe full twin with the moteus-r4.11 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can11.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 0.01313 kg.m^2 (range 0.00347-0.103) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the unweighed link (log-centre of its bound); bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs)\n- **frictionloss**: identified Coulomb (plateaus with the identified gravity load taken off)\n- **damping**: none: viscous refused (95% CI [-1.47, -0.145] is wider than +-50% of -0.62)\n- **gravity**: identified G 4.661 N.m [4.04, 5.24], bottom -0.3737 rad [-0.392, -0.352] (output frame): a point mass on the bare hinge (twin.gravity_point_mass); over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.30 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: 95% CI [0.145, 1.47] is wider than +-50% of 0.62\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"cdd3e58e10 + uncommitted changes (source sha256 cb867c83c13712e6)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"m0054"},{"kind":"model","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M0","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.032795,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 11 · M2.coulomb_viscous.ideal","runner_up_x":6.498761,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M0.ideal"},"viscous":{"value":null,"why":"not in M0.ideal"},"breakaway":{"value":null,"why":"not in M0.ideal"},"stribeck_velocity":{"value":null,"why":"not in M0.ideal"},"weakening":{"value":null,"why":"not in M0.ideal"},"capture_fraction":{"value":null,"why":"not in M0.ideal"},"capture_speed":{"value":null,"why":"not in M0.ideal"},"capture_dwell":{"value":null,"why":"not in M0.ideal"},"ripple":{"value":null,"why":"not in M0.ideal"},"backlash":{"value":null,"why":"not in M0.ideal"},"gear_stiffness":{"value":null,"why":"not in M0.ideal"},"inertia":{"value":null,"why":"not in M0.ideal"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.73196911,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M0.ideal"},"latency":{"value":null,"why":"not in M0.ideal"},"resistance":{"value":null,"why":"not in M0.ideal"},"inductance":{"value":null,"why":"not in M0.ideal"},"kv":{"value":null,"why":"not in M0.ideal"},"winding_rth":{"value":null,"why":"not in M0.ideal"},"description":"**M0.ideal** on CAN 11 · JMC 60ASM200 + 10:1: no friction, datasheet inertia.\n\nNo friction and the datasheet's inertia: the ablation baseline. Not a contract kind.\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"m0055"},{"kind":"model","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M1","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.032795,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 11 · M2.coulomb_viscous.ideal","runner_up_x":6.498761,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M1.datasheet"},"viscous":{"value":null,"why":"not in M1.datasheet"},"breakaway":{"value":null,"why":"not in M1.datasheet"},"stribeck_velocity":{"value":null,"why":"not in M1.datasheet"},"weakening":{"value":null,"why":"not in M1.datasheet"},"capture_fraction":{"value":null,"why":"not in M1.datasheet"},"capture_speed":{"value":null,"why":"not in M1.datasheet"},"capture_dwell":{"value":null,"why":"not in M1.datasheet"},"ripple":{"value":null,"why":"not in M1.datasheet"},"backlash":{"value":3.0,"basis":"datasheet","unit":"arcmin","source":"datasheet: JMC 60ASM200 (200 W, 36 V) + StepperOnline AD60-G10-D14 10:1"},"gear_stiffness":{"value":null,"why":"not in M1.datasheet"},"inertia":{"value":null,"why":"not in M1.datasheet"},"torque_scale":{"value":null,"why":"not in M1.datasheet"},"kt":{"value":null,"why":"not in M1.datasheet"},"current_loop":{"value":null,"why":"not in M1.datasheet"},"latency":{"value":null,"why":"not in M1.datasheet"},"resistance":{"value":null,"why":"not published"},"inductance":{"value":null,"why":"not in M1.datasheet"},"kv":{"value":null,"why":"not published"},"winding_rth":{"value":null,"why":"not in M1.datasheet"},"description":"**M1.datasheet** on CAN 11 · JMC 60ASM200 + 10:1: the stated values, nothing fitted.\n\nContract kind `datasheet` (robotparts contract 2.3, not merged): The datasheet's own model: the part's stated values and nothing fitted. Every term is a registry key and equals the part's spec in SI (relative tolerance 1e-6), and fitted_from is []. MJCF joint attributes express it (armature, frictionloss, damping), so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v; armature = output_inertia, or gear_ratio^2*(rotor_inertia + gearbox_input_inertia)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"m0056"},{"kind":"model","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M3.lugre","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.032795,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 11 · M2.coulomb_viscous.ideal","runner_up_x":6.498761,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.83312525,"unit":"N·m","source":"model card: Coulomb friction (output) (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.76698339,"high":0.92386182},"viscous":{"value":-0.61964171,"unit":"N·m·s/rad","source":"model card: viscous friction (tau - 4.661*sin(q - -0.3737) (the identified gravity load) = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-1.46719312,"high":-0.14499568},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":null,"why":"not in M3.lugre"},"capture_fraction":{"value":null,"why":"not in M3.lugre"},"capture_speed":{"value":null,"why":"not in M3.lugre"},"capture_dwell":{"value":null,"why":"not in M3.lugre"},"ripple":{"value":null,"why":"not in M3.lugre"},"backlash":{"value":null,"why":"not in M3.lugre"},"gear_stiffness":{"value":null,"why":"not in M3.lugre"},"inertia":{"value":null,"why":"not identified"},"torque_scale":{"value":null,"why":"not in M3.lugre"},"kt":{"value":null,"why":"not in M3.lugre"},"current_loop":{"value":null,"why":"not in M3.lugre"},"latency":{"value":null,"why":"not in M3.lugre"},"resistance":{"value":null,"why":"not in M3.lugre"},"inductance":{"value":null,"why":"not in M3.lugre"},"kv":{"value":null,"why":"not in M3.lugre"},"winding_rth":{"value":null,"why":"not in M3.lugre"},"description":"**M3.lugre** on CAN 11 · JMC 60ASM200 + 10:1: LuGre: a bristle state.\n\nContract kind `lugre` (robotparts contract 2.3, not merged): The LuGre dynamic friction model (Canudas de Wit, Olsson, Astrom and Lischinsky, IEEE TAC 1995): bristles of deflection z give pre-sliding displacement, the Stribeck curve and frictional lag.\n\n```\ndz/dt = v - sigma0*|v|*z/g(v), g(v) = coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent); tau_f = sigma0*z + sigma1*dz/dt + sigma2*v; stribeck_exponent is 2 when absent\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"m0057"},{"kind":"model","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M5","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":2.032795,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.ideal","leader":"CAN 11 · M2.coulomb_viscous.ideal","runner_up_x":6.498761,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M5.dcmotor"},"viscous":{"value":null,"why":"not in M5.dcmotor"},"breakaway":{"value":null,"why":"not in M5.dcmotor"},"stribeck_velocity":{"value":null,"why":"not in M5.dcmotor"},"weakening":{"value":null,"why":"not in M5.dcmotor"},"capture_fraction":{"value":null,"why":"not in M5.dcmotor"},"capture_speed":{"value":null,"why":"not in M5.dcmotor"},"capture_dwell":{"value":null,"why":"not in M5.dcmotor"},"ripple":{"value":null,"why":"not in M5.dcmotor"},"backlash":{"value":null,"why":"not in M5.dcmotor"},"gear_stiffness":{"value":null,"why":"not in M5.dcmotor"},"inertia":{"value":null,"why":"not in M5.dcmotor"},"torque_scale":{"value":null,"why":"not in M5.dcmotor"},"kt":{"value":0.73196911,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M5.dcmotor"},"latency":{"value":null,"why":"not in M5.dcmotor"},"resistance":{"value":0.211417,"unit":"Ω","source":"model card: phase resistance (phase-neutral), the board's calibration (moteus_tool calibration (conf get motor.resistance_ohm))","basis":"measured"},"inductance":{"value":0.481286,"unit":"mH","source":"model card: q-axis inductance, the board's calibration (conf get motor.inductance_q_H)","basis":"measured"},"kv":{"value":112.982,"unit":"rpm/V","source":"model card: Kv (rotor), the board's calibration (conf get motor.Kv)","basis":"measured"},"winding_rth":{"value":null,"why":"not measured yet"},"description":"**M5.dcmotor** on CAN 11 · JMC 60ASM200 + 10:1: R, L, motor constant, winding heat.\n\nContract kind `mujoco_dcmotor` (robotparts contract 2.3, not merged): MuJoCo's DC motor actuator (the dcmotor shortcut, mjs_setToDCMotor, MuJoCo 3.16): electrical dynamics, gain and bias (back-EMF, cogging, LuGre friction), with its parameters named and shaped as MuJoCo takes them. The simulator pins the MuJoCo release and the code that sets them.\n\n```\nMuJoCo's own: mjDYN_DCMOTOR (electrical dynamics), mjGAIN_DCMOTOR (K or K/R), mjBIAS_DCMOTOR (back-EMF, cogging, LuGre friction)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"m0058"},{"kind":"model","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","ladder":null,"ladder_step":"1 · M2 identified","headline_mrad":{"value":41.468018,"unit":"mrad","n":10,"basis":"measured","source":"median q RMS over the 10 Oct 23 held-out runs (budget_can4.json)"},"headline_runs":[39.429566,43.506471,60.777133,80.820424,157.023676,530.152721,5.767755,4.588478,6.874207,9.230241],"headline_x":{"value":12.869841,"n":10,"basis":"derived","source":"headline / this actuator's floor, 3.222 mrad (floors.json, 5 repeats)"},"headline_x_runs":[12.237196,13.502487,18.862538,25.08309,48.733214,164.535989,1.790056,1.424061,2.13345,2.864659],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":3.222108,"n_runs":10,"benches":["Held-out tapes · Oct 23"],"rank":3,"rank_desc":2,"best":false,"best_model":"M2.coulomb_viscous.r4","leader":"CAN 4 · M2.coulomb_viscous.r4","runner_up_x":7.591594,"twin_grade":"no","coulomb":{"value":0.03927121,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03784288,"high":0.04079645},"viscous":{"value":0.00068888,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00063175,"high":0.00194105},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous"},"inertia":{"value":-0.00029699,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00043694,"high":-0.00021655},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous"},"kt":{"value":null,"why":"not in M2.coulomb_viscous"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous"},"latency":{"value":null,"why":"not in M2.coulomb_viscous"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous"},"kv":{"value":null,"why":"not in M2.coulomb_viscous"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous"},"description":"**M2.coulomb_viscous** on CAN 4 · JMC 60ASM400 direct: Coulomb + viscous, as identified.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe budget's *identified* reference twin: the identified Coulomb friction and inertia on MuJoCo's native joint friction, no driver twin.","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"3f6579b5b4 + uncommitted changes (source sha256 b08bd5814327dbaf)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"m0059"},{"kind":"model","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","ladder":null,"ladder_step":"4 · full + driver twin","headline_mrad":{"value":24.420611,"unit":"mrad","n":10,"basis":"measured","source":"median q RMS over the 10 Oct 23 held-out runs (budget_can4.json)"},"headline_runs":[23.693976,25.147245,32.311644,41.960808,51.935631,232.723344,2.437682,2.46584,2.146553,1.8848],"headline_x":{"value":7.579079,"n":10,"basis":"derived","source":"headline / this actuator's floor, 3.222 mrad (floors.json, 5 repeats)"},"headline_x_runs":[7.353564,7.804594,10.028107,13.022782,16.118526,72.227047,0.756549,0.765288,0.666195,0.584959],"dataset_x":1.913986,"worst_class_x":3.139991,"worst_class":"cycle","floor_tape_x":1.946393,"oct25_x":null,"floor_mrad":3.222108,"n_runs":27,"benches":["Held-out tapes · Oct 23","Dataset · Oct 24","Floor repeats · Oct 24"],"rank":1,"rank_desc":4,"best":true,"best_model":"M2.coulomb_viscous.r4","leader":"CAN 4 · M2.coulomb_viscous.r4","runner_up_x":7.591594,"twin_grade":"no","coulomb":{"value":0.03927121,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03784288,"high":0.04079645},"viscous":{"value":0.00068888,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00063175,"high":0.00194105},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"inertia":{"value":-0.00029699,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00043694,"high":-0.00021655},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.07395491,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":199.999,"unit":"Hz","basis":"chosen","source":"the full twin's current loop: the board's servo.pid_dq_hz (budget)"},"latency":{"value":35.2448302,"unit":"ms","source":"model card: command -> motion delay (closed loop) (median over runs of the cross-correlation lag qd_target -> qd)","basis":"measured","low":1.17557285,"high":95.41590481},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.r4"},"description":"**M2.coulomb_viscous.r4** on CAN 4 · JMC 60ASM400 direct: Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe full twin with the moteus-r4.11 driver twin (its current loop), as the budget ran it.\n\nWhat this twin runs (`budget_can4.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 6e-05 kg.m^2 (range 2.77e-05-0.000149) declared in the deployment record (datasheet rotor (N = 1, direct drive) + the motor-face disc's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (2026-10-23: its chirps read a negative inertia, friction-dominated)); the regression refused (ill-posed: non-physical inertia -0.000297; torque delay on the +-25 ms bound for ['session_09/runs/s04_can4_chirp']; filter windows (13, 21, 31) move it by 0.00025, more than 25% of it)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (95% CI [-0.000632, 0.00194] includes zero)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.86 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: the plateaus' viscous slope is not negative\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"3f6579b5b4 + uncommitted changes (source sha256 b08bd5814327dbaf)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"m0060"},{"kind":"model","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","ladder":null,"ladder_step":"3 · full, ideal driver","headline_mrad":{"value":24.460936,"unit":"mrad","n":10,"basis":"measured","source":"median q RMS over the 10 Oct 23 held-out runs (budget_can4.json)"},"headline_runs":[23.693789,25.228083,32.310527,41.960044,51.934907,232.662153,2.429953,2.468579,2.146966,1.884833],"headline_x":{"value":7.591594,"n":10,"basis":"derived","source":"headline / this actuator's floor, 3.222 mrad (floors.json, 5 repeats)"},"headline_x_runs":[7.353505,7.829683,10.02776,13.022544,16.118301,72.208056,0.75415,0.766138,0.666323,0.584969],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":3.222108,"n_runs":10,"benches":["Held-out tapes · Oct 23"],"rank":2,"rank_desc":3,"best":false,"best_model":"M2.coulomb_viscous.r4","leader":"CAN 4 · M2.coulomb_viscous.r4","runner_up_x":7.591594,"twin_grade":"no","coulomb":{"value":0.03927121,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03784288,"high":0.04079645},"viscous":{"value":0.00068888,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00063175,"high":0.00194105},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"inertia":{"value":-0.00029699,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00043694,"high":-0.00021655},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.07395491,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"latency":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.ideal"},"description":"**M2.coulomb_viscous.ideal** on CAN 4 · JMC 60ASM400 direct: Coulomb, sticking friction, tuned inertia, ideal driver (current loop off).\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe same twin with the driver's current loop switched off (an ideal driver): the budget's `current loop` ablation, run by run.\n\nWhat this twin runs (`budget_can4.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 6e-05 kg.m^2 (range 2.77e-05-0.000149) declared in the deployment record (datasheet rotor (N = 1, direct drive) + the motor-face disc's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (2026-10-23: its chirps read a negative inertia, friction-dominated)); the regression refused (ill-posed: non-physical inertia -0.000297; torque delay on the +-25 ms bound for ['session_09/runs/s04_can4_chirp']; filter windows (13, 21, 31) move it by 0.00025, more than 25% of it)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (95% CI [-0.000632, 0.00194] includes zero)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.86 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: the plateaus' viscous slope is not negative\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"3f6579b5b4 + uncommitted changes (source sha256 b08bd5814327dbaf)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"m0061"},{"kind":"model","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","ladder":null,"ladder_step":"2 · full, soft friction","headline_mrad":{"value":59.681874,"unit":"mrad","n":10,"basis":"measured","source":"median q RMS over the 10 Oct 23 held-out runs (budget_can4.json)"},"headline_runs":[59.014902,60.348845,95.444887,135.687159,289.967214,574.051942,8.328378,6.891151,8.964392,10.401053],"headline_x":{"value":18.522618,"n":10,"basis":"derived","source":"headline / this actuator's floor, 3.222 mrad (floors.json, 5 repeats)"},"headline_x_runs":[18.315619,18.729616,29.621877,42.111301,89.993016,178.160369,2.584761,2.138709,2.782151,3.228028],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":3.222108,"n_runs":10,"benches":["Held-out tapes · Oct 23"],"rank":4,"rank_desc":1,"best":false,"best_model":"M2.coulomb_viscous.r4","leader":"CAN 4 · M2.coulomb_viscous.r4","runner_up_x":7.591594,"twin_grade":"no","coulomb":{"value":0.03927121,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03784288,"high":0.04079645},"viscous":{"value":0.00068888,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00063175,"high":0.00194105},"breakaway":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"stribeck_velocity":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"weakening":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_fraction":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_speed":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"capture_dwell":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"ripple":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"backlash":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"gear_stiffness":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"inertia":{"value":-0.00029699,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00043694,"high":-0.00021655},"torque_scale":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"kt":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"current_loop":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"latency":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"resistance":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"inductance":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"kv":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"winding_rth":{"value":null,"why":"not in M2.coulomb_viscous.soft"},"description":"**M2.coulomb_viscous.soft** on CAN 4 · JMC 60ASM400 direct: Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction.\n\nContract kind `coulomb_viscous` (robotparts contract 2.3, not merged): Constant (Coulomb) plus viscous friction at the output, fitted from measurements: MuJoCo's frictionloss and damping, so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v\n```\n\nThe same twin on MuJoCo's default soft friction (it creeps instead of sticking): the budget's `friction stiffness` ablation, run by run.\n\nWhat this twin runs (`budget_can4.json`, full_twin.sources):\n\n- **model**: bare single hinge: the station's joint is not in the CAD export\n- **armature**: PRIOR, not identified: 6e-05 kg.m^2 (range 2.77e-05-0.000149) declared in the deployment record (datasheet rotor (N = 1, direct drive) + the motor-face disc's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (2026-10-23: its chirps read a negative inertia, friction-dominated)); the regression refused (ill-posed: non-physical inertia -0.000297; torque delay on the +-25 ms bound for ['session_09/runs/s04_can4_chirp']; filter windows (13, 21, 31) move it by 0.00025, more than 25% of it)\n- **frictionloss**: identified Coulomb\n- **damping**: none: viscous refused (95% CI [-0.000632, 0.00194] includes zero)\n- **gravity**: none (no CAD mass, none identified)\n- **friction_constraint**: solreffriction 0.4 ms / 1, solimpfriction d 0.99: the frictionloss sticks (MuJoCo's soft default creeps at ~0.4 rad/s on a 1e-4 kg.m^2 hinge)\n- **torque_ripple**: none: the plateaus cover 0.86 rotor revolutions (< 1): the map would alias\n- **friction_weakening**: none: the plateaus' viscous slope is not negative\n- **budget**: full twin, board torque units","readme":"# bam_rack_twin\n\nHow far the One Dof Test Rack's digital twin is from the physical rack, station by station, with\nuncertainty. Offline only: it reads recorded evidence and the cad2robot/1 payload, and never opens a\nCAN adapter or a camera.\n\nFor every station (a moteus board bound to a CAD joint in\n`src/dev/bam_rack_twin/records/one-dof-test-rack/deployment.json`) it:\n\n1. scans the evidence directory (`<name>.npz` + `<name>.json`, any number of runs, any depth), judges\n   each run (aborted, watchdog-latched, setpoint not followed, hard fault) and converts the usable\n   ones to runtrace-v1 in the joint output frame;\n2. declares the split **before fitting**: identification runs (`gravity`, `friction`, `chirp`) train,\n   every other replayable run (today the `wiggle`s) is held out;\n3. reads the CAD's numbers from the payload with MuJoCo 3.11 (gravity amplitude and bottom, axis\n   inertia with armature, frictionloss, damping, range, ratio);\n4. identifies gravity, Coulomb + viscous friction and inertia from the training runs, each with a\n   block-bootstrap 95% CI, and **refuses** what the evidence cannot pin (ill-conditioned, one speed,\n   a CI that spans zero or ±50%, a filter-dependent inertia);\n5. replays every replayable run's logged command tape (same times, cap, gains, watchdog, NaN position\n   for velocity mode) through two single-joint MuJoCo twins behind bam_sim's moteus PID twin:\n   `cad` (the payload as exported) and `identified` (armature, frictionloss, damping, a gravity\n   scale, and two round-3 knobs: for a pendulum with an identified G and inertia, ONE equivalent\n   rigid body replaces the moving subtree's inertials (CAD mass kept unless m·r² will not fit, CAD\n   COM direction kept); for a station with a measured stop, the joint limit's solref is calibrated\n   by a static press to the measured stiffness and the unchanged homing is re-run on it);\n6. scores real − twin for q and τ (RMS, max, CI) and writes the scorecard and a traj_compare report.\n\n`--evidence` takes one or more roots; with several, every run name starts with its root's\ndirectory name. A station whose `cad_joint` is null (its joint is not in the CAD export; CAN 14's\nGIM43 plate since the 2026-10-20 camera map) has no CAD twin: its identified twin is a bare hinge\n(identified Coulomb, the identified inertia or its CI upper bound as armature, no gravity), and any\n`superseded_mappings` it carries are still replayed and listed, never in a headline.\n\n**Camera ground truth** (`bam_rack_twin.camera`, the `camera` extra, OpenCV pinned as bam_aruco\npins it): every RealSense recording in the evidence (`frames` + `wall` npz) is matched to the runs it\noverlaps. It produces a mapping matrix of every tag × every run (in-plane angle vs encoder: r, slope),\nand, for a tag that moves with its run, the camera/encoder ratio about the tag's own axis\n(solvePnP IPPE_SQUARE) with a block-bootstrap CI, the residual, and the camera latency by\ncross-correlation. It refuses too few frames, a small tag or a short sweep.\n\nA new station is a new component in the deployment record\n(`records/one-dof-test-rack/deployment.json`); new runs are picked up by scanning. A replayable run\nrecorded on firmware the board no longer runs is **superseded**: replayed and listed, never in the\nheld-out score.\n\nAlso measured, never replayed:\n\n- **Hardstops** (`kind: hardstop`, stop.py): datum repeatability (σ with a chi-square CI, spread, n)\n  and stop stiffness (press-step slope, t-interval) in the board frame and the joint output frame,\n  against bam_homing's 400 N·m/rev floor and 1 mrad repeat. The CAD twin's side runs the UNCHANGED\n  `HomingController` on the payload's stop (`homing_sim.py`, in bam_homing's own uv environment,\n  because the two packages pin bam-robot-descriptions differently). The unloaded stop is the\n  station's frame witness.\n- **Delays**: command → measurement per run (normalised cross-correlation of commanded and measured\n  velocity), and the torque/acceleration alignment the inertia fit estimates per chirp (|d| ≤ 25 ms,\n  re-fitted in every bootstrap resample). Evidence is never shifted.\n\n## Run it\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra camera python -m bam_rack_twin scorecard --evidence /archive/datasets/bam_rig/rack_2026-10-18 /archive/datasets/bam_rig/rack_2026-10-20 --bundle ~/.cache/cad2robot-build/bundles/a7b1095/fixtures/cad2robot/one_dof_test_rack --out ~/.cache/rack-twin-build --report ~/bam_ws/reports/media/rack-twin-2026-10-18/report.html\n```\n\n`--bundle` may come from `$BAM_RACK_PAYLOAD` instead (the payload's 39 MB of STL never enters git).\nOutputs under `--out`:\n\n| path | what |\n|---|---|\n| `split.json` | the declared split, with bam_deployments' split digest |\n| `identified/<station>.json` | every estimate (value, CI, method, refusal reason), the identified twin, the frame map, provenance (runs + sha256, code version) |\n| `scorecard.json` | parameter and trajectory tables per station, the evidence ledger |\n| `runs/one-dof-test-rack__<evidence>/` | real runs, runtrace-v1 (+ mode/fault/voltage) |\n| `runs/one-dof-test-rack__twin-{cad,identified}__<evidence>/` | twin replays, `meta.replay_of` / `twin_version` |\n| `twins/<station>__{cad,identified}.xml` | the exact scenes replayed |\n| `report.html` | traj_compare: one group per station, Summary, Insights |\n\n## Acquisition (moves real motors)\n\n`bam_rack_twin.hardware` is the guarded acquisition the evidence comes from (ported from\n`~/.cache/rack-commissioning`): bus flock, port-holder refusal, preflight, countdown, 0.25 s\nwatchdog, mode-11 abort, abort only on mode 1 or fault codes 32–50 (limiter 96–105 is not a fault),\n10-sample-mean overspeed, GC paused, STOP in `finally`. It needs the `hardware` extra:\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra hardware python -m bam_rack_twin.hardware sine --can-id 15 --cap-nm 1.0 --amplitude-rad 0.05 --freq-hz 0.5 --out /archive/datasets/bam_rig/rack_2026-10-18/round2 --name can15_sine\n```\n\nKinds: `gravity`, `swing`, `friction`, `chirp`, `sine`, `hardstop`, `tape`, `inventory` (read-only),\n`record` (a RealSense colour recording, `--extra record`; it refuses, and never takes the camera,\nwhile another process holds a RealSense node or a realsense-viewer runs).\n\n`tape` plays payload_compare's frozen out-and-back raised cosines (slow/medium/fast legs 4/2/1 s,\n0.5 s hold), one evidence run per speed, from the editable `TAPE_STATIONS` block in\n`bam_rack_twin/hardware/tape.py` (amplitude ceiling, side, cap per board; CAN 1 goes to its free\nside only and aborts if pushed toward its stop). The tapes and their sha256 are written before the\nfirst command. The scorecard grades tape runs as held-out tracking.\n\n## Frames\n\n- Evidence is in the board's frame. `frame.output_per_board` in the record turns it into joint\n  output radians (torque by the inverse, gains by the inverse square). CAN 1 is unconfigured, so\n  its evidence is rotor-frame and × 0.1 is an **assumption**, flagged everywhere.\n- The payload frame is the CAD joint coordinate: `q_payload = q_output + offset`. A gravity station\n  takes the offset from its gravity bottom (the frame witness); a ranged joint without a witness is\n  placed mid-range; a continuous joint without gravity needs none.\n\n## Tests\n\n```bash\ncd ~/bam_ws/src/dev/bam_rack_twin\nenv -u VIRTUAL_ENV uv run --extra test pytest -q -p no:cacheprovider\n```\n\nSynthetic evidence is recorded off a twin with known physics (the cad2robot_payload synthetic\nfixture's pendulum at 0.6 × its CAD gravity, 0.03 N·m Coulomb); identification must recover it inside\nits CI and the identified twin must beat the CAD twin on the held-out run. `tests/fixtures/` holds\nthree real CAN 15 runs (184 KB) for the run-judgement checks.\n","code_commit":"3f6579b5b4 + uncommitted changes (source sha256 b08bd5814327dbaf)","code_path":"~/vt-lanes/rig-bam_ws/src/dev/bam_rack_twin","code_hosted":"local only: the commit is not on GitHub's origin","code_url":null,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"m0062"},{"kind":"model","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M0","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":3.222108,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.r4","leader":"CAN 4 · M2.coulomb_viscous.r4","runner_up_x":7.591594,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M0.ideal"},"viscous":{"value":null,"why":"not in M0.ideal"},"breakaway":{"value":null,"why":"not in M0.ideal"},"stribeck_velocity":{"value":null,"why":"not in M0.ideal"},"weakening":{"value":null,"why":"not in M0.ideal"},"capture_fraction":{"value":null,"why":"not in M0.ideal"},"capture_speed":{"value":null,"why":"not in M0.ideal"},"capture_dwell":{"value":null,"why":"not in M0.ideal"},"ripple":{"value":null,"why":"not in M0.ideal"},"backlash":{"value":null,"why":"not in M0.ideal"},"gear_stiffness":{"value":null,"why":"not in M0.ideal"},"inertia":{"value":null,"why":"not in M0.ideal"},"torque_scale":{"value":1.0,"basis":"chosen","source":"budget: no scale (1.0)"},"kt":{"value":0.07395491,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M0.ideal"},"latency":{"value":null,"why":"not in M0.ideal"},"resistance":{"value":null,"why":"not in M0.ideal"},"inductance":{"value":null,"why":"not in M0.ideal"},"kv":{"value":null,"why":"not in M0.ideal"},"winding_rth":{"value":null,"why":"not in M0.ideal"},"description":"**M0.ideal** on CAN 4 · JMC 60ASM400 direct: no friction, datasheet inertia.\n\nNo friction and the datasheet's inertia: the ablation baseline. Not a contract kind.\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"m0063"},{"kind":"model","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","ladder":null,"ladder_step":"0 · M1","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":3.222108,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.r4","leader":"CAN 4 · M2.coulomb_viscous.r4","runner_up_x":7.591594,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M1.datasheet"},"viscous":{"value":null,"why":"not in M1.datasheet"},"breakaway":{"value":null,"why":"not in M1.datasheet"},"stribeck_velocity":{"value":null,"why":"not in M1.datasheet"},"weakening":{"value":null,"why":"not in M1.datasheet"},"capture_fraction":{"value":null,"why":"not in M1.datasheet"},"capture_speed":{"value":null,"why":"not in M1.datasheet"},"capture_dwell":{"value":null,"why":"not in M1.datasheet"},"ripple":{"value":null,"why":"not in M1.datasheet"},"backlash":{"value":null,"why":"not published"},"gear_stiffness":{"value":null,"why":"not in M1.datasheet"},"inertia":{"value":null,"why":"not in M1.datasheet"},"torque_scale":{"value":null,"why":"not in M1.datasheet"},"kt":{"value":null,"why":"not in M1.datasheet"},"current_loop":{"value":null,"why":"not in M1.datasheet"},"latency":{"value":null,"why":"not in M1.datasheet"},"resistance":{"value":null,"why":"not published"},"inductance":{"value":null,"why":"not in M1.datasheet"},"kv":{"value":null,"why":"not published"},"winding_rth":{"value":null,"why":"not in M1.datasheet"},"description":"**M1.datasheet** on CAN 4 · JMC 60ASM400 direct: the stated values, nothing fitted.\n\nContract kind `datasheet` (robotparts contract 2.3, not merged): The datasheet's own model: the part's stated values and nothing fitted. Every term is a registry key and equals the part's spec in SI (relative tolerance 1e-6), and fitted_from is []. MJCF joint attributes express it (armature, frictionloss, damping), so its simulator is optional.\n\n```\ntau_f = coulomb_friction*sign(v) + viscous_friction*v; armature = output_inertia, or gear_ratio^2*(rotor_inertia + gearbox_input_inertia)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"m0064"},{"kind":"model","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M3.lugre","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":3.222108,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.r4","leader":"CAN 4 · M2.coulomb_viscous.r4","runner_up_x":7.591594,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":0.03927121,"unit":"N·m","source":"model card: Coulomb friction (output) (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"measured","low":0.03784288,"high":0.04079645},"viscous":{"value":0.00068888,"unit":"N·m·s/rad","source":"model card: viscous friction (tau = Fc*sgn(v_cmd) + b*v_cmd + tau0 on plateau rows >= 0.5 s after each speed change, block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00063175,"high":0.00194105},"breakaway":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"stribeck_velocity":{"value":null,"why":"not fitted: the rack fits a weakening slope, not breakaway and Stribeck velocity"},"weakening":{"value":null,"why":"not in M3.lugre"},"capture_fraction":{"value":null,"why":"not in M3.lugre"},"capture_speed":{"value":null,"why":"not in M3.lugre"},"capture_dwell":{"value":null,"why":"not in M3.lugre"},"ripple":{"value":null,"why":"not in M3.lugre"},"backlash":{"value":null,"why":"not in M3.lugre"},"gear_stiffness":{"value":null,"why":"not in M3.lugre"},"inertia":{"value":-0.00029699,"unit":"kg·m²","source":"model card: axis inertia at the output (all moving parts + reflected rotor) (tau_s(t+d) - b*qd_s - G*sin(q_s - bottom) = I*qdd_s + Fc_run*sgn(qd_s) + c_run; d fitted per run in [-25, +25] ms; 5 ms grid, spline derivatives, one Savitzky-Golay cubic smoother (21 samples) on all channels; block bootstrap)","basis":"estimate","note":"fit refused by the model card (its 95 % CI fails the card's test)","low":-0.00043694,"high":-0.00021655},"torque_scale":{"value":null,"why":"not in M3.lugre"},"kt":{"value":null,"why":"not in M3.lugre"},"current_loop":{"value":null,"why":"not in M3.lugre"},"latency":{"value":null,"why":"not in M3.lugre"},"resistance":{"value":null,"why":"not in M3.lugre"},"inductance":{"value":null,"why":"not in M3.lugre"},"kv":{"value":null,"why":"not in M3.lugre"},"winding_rth":{"value":null,"why":"not in M3.lugre"},"description":"**M3.lugre** on CAN 4 · JMC 60ASM400 direct: LuGre: a bristle state.\n\nContract kind `lugre` (robotparts contract 2.3, not merged): The LuGre dynamic friction model (Canudas de Wit, Olsson, Astrom and Lischinsky, IEEE TAC 1995): bristles of deflection z give pre-sliding displacement, the Stribeck curve and frictional lag.\n\n```\ndz/dt = v - sigma0*|v|*z/g(v), g(v) = coulomb_friction + (breakaway_torque - coulomb_friction)*exp(-(|v|/stribeck_velocity)^stribeck_exponent); tau_f = sigma0*z + sigma1*dz/dt + sigma2*v; stribeck_exponent is 2 when absent\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"m0065"},{"kind":"model","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","ladder":null,"ladder_step":"0 · M5","headline_mrad":{"value":null,"why":"not run yet"},"headline_runs":[],"headline_x":{"value":null,"why":"not run yet"},"headline_x_runs":[],"dataset_x":null,"worst_class_x":null,"worst_class":null,"floor_tape_x":null,"oct25_x":null,"floor_mrad":3.222108,"n_runs":0,"benches":[],"rank":null,"rank_desc":null,"best":false,"best_model":"M2.coulomb_viscous.r4","leader":"CAN 4 · M2.coulomb_viscous.r4","runner_up_x":7.591594,"twin_grade":{"value":null,"why":"not run on the Oct 23 tapes"},"coulomb":{"value":null,"why":"not in M5.dcmotor"},"viscous":{"value":null,"why":"not in M5.dcmotor"},"breakaway":{"value":null,"why":"not in M5.dcmotor"},"stribeck_velocity":{"value":null,"why":"not in M5.dcmotor"},"weakening":{"value":null,"why":"not in M5.dcmotor"},"capture_fraction":{"value":null,"why":"not in M5.dcmotor"},"capture_speed":{"value":null,"why":"not in M5.dcmotor"},"capture_dwell":{"value":null,"why":"not in M5.dcmotor"},"ripple":{"value":null,"why":"not in M5.dcmotor"},"backlash":{"value":null,"why":"not in M5.dcmotor"},"gear_stiffness":{"value":null,"why":"not in M5.dcmotor"},"inertia":{"value":null,"why":"not in M5.dcmotor"},"torque_scale":{"value":null,"why":"not in M5.dcmotor"},"kt":{"value":0.07395491,"unit":"N·m/A","source":"model card: Kt the board uses (rotor / output), the board's calibration (moteus: 8.27 / Kv x i_q; output x the gear ratio)","basis":"measured"},"current_loop":{"value":null,"why":"not in M5.dcmotor"},"latency":{"value":null,"why":"not in M5.dcmotor"},"resistance":{"value":0.080294,"unit":"Ω","source":"model card: phase resistance (phase-neutral), the board's calibration (moteus_tool calibration (conf get motor.resistance_ohm))","basis":"measured"},"inductance":{"value":0.116843,"unit":"mH","source":"model card: q-axis inductance, the board's calibration (conf get motor.inductance_q_H)","basis":"measured"},"kv":{"value":111.824,"unit":"rpm/V","source":"model card: Kv (rotor), the board's calibration (conf get motor.Kv)","basis":"measured"},"winding_rth":{"value":null,"why":"not measured yet"},"description":"**M5.dcmotor** on CAN 4 · JMC 60ASM400 direct: R, L, motor constant, winding heat.\n\nContract kind `mujoco_dcmotor` (robotparts contract 2.3, not merged): MuJoCo's DC motor actuator (the dcmotor shortcut, mjs_setToDCMotor, MuJoCo 3.16): electrical dynamics, gain and bias (back-EMF, cogging, LuGre friction), with its parameters named and shaped as MuJoCo takes them. The simulator pins the MuJoCo release and the code that sets them.\n\n```\nMuJoCo's own: mjDYN_DCMOTOR (electrical dynamics), mjGAIN_DCMOTOR (K or K/R), mjBIAS_DCMOTOR (back-EMF, cogging, LuGre friction)\n```\n\n**Not run on the rack yet**: no twin code has scored it, so it has no error, commit or README of its own.","readme":{"value":null,"why":"not run: no twin code has scored this model"},"code_commit":{"value":null,"why":"not run: no twin code has scored this model"},"code_path":{"value":null,"why":"not run: no twin code has scored this model"},"code_hosted":null,"code_url":null,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"m0066"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_01a/runs/s01_can14_staircase","q_rms_mrad":2.904902,"x_floor":2.685243,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0067"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_01a/runs/s03_can14_staircase","q_rms_mrad":2.517507,"x_floor":2.327142,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0068"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_01c/runs/s03_can14_sine","q_rms_mrad":1.356701,"x_floor":1.254112,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0069"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_01c/runs/s05_can14_tape_fast","q_rms_mrad":3.423471,"x_floor":3.1646,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0070"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_01c/runs/s05_can14_tape_medium","q_rms_mrad":3.08045,"x_floor":2.847517,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0071"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_01c/runs/s05_can14_tape_slow","q_rms_mrad":2.681032,"x_floor":2.478302,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0072"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_02/runs/s01_can14_staircase","q_rms_mrad":3.142865,"x_floor":2.905213,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0073"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_03/runs/s01_can14_tape_fast","q_rms_mrad":1.770424,"x_floor":1.63655,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0074"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_03/runs/s01_can14_tape_medium","q_rms_mrad":2.006569,"x_floor":1.854839,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0075"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_03/runs/s01_can14_tape_slow","q_rms_mrad":2.148341,"x_floor":1.985891,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0076"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_03/runs/s05_can14_tape_fast","q_rms_mrad":1.629252,"x_floor":1.506054,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0077"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_03/runs/s05_can14_tape_medium","q_rms_mrad":1.976596,"x_floor":1.827132,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0078"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_03/runs/s05_can14_tape_slow","q_rms_mrad":2.138154,"x_floor":1.976474,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0079"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_04/runs/s03_can14_tape_fast","q_rms_mrad":1.817268,"x_floor":1.679853,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0080"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_04/runs/s03_can14_tape_medium","q_rms_mrad":1.980765,"x_floor":1.830986,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0081"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_04/runs/s03_can14_tape_slow","q_rms_mrad":2.164142,"x_floor":2.000497,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0082"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_04/runs/s07_can14_tape_fast","q_rms_mrad":1.593516,"x_floor":1.47302,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0083"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_04/runs/s07_can14_tape_medium","q_rms_mrad":1.873887,"x_floor":1.73219,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0084"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_04/runs/s07_can14_tape_slow","q_rms_mrad":2.101711,"x_floor":1.942787,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0085"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_01a/runs/s01_can14_staircase","q_rms_mrad":1.268209,"x_floor":1.172311,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0086"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_01a/runs/s03_can14_staircase","q_rms_mrad":1.269012,"x_floor":1.173054,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0087"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_01c/runs/s03_can14_sine","q_rms_mrad":2.044472,"x_floor":1.889876,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0088"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_01c/runs/s05_can14_tape_fast","q_rms_mrad":1.240039,"x_floor":1.146272,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0089"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_01c/runs/s05_can14_tape_medium","q_rms_mrad":1.064797,"x_floor":0.984281,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0090"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_01c/runs/s05_can14_tape_slow","q_rms_mrad":1.178394,"x_floor":1.089288,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0091"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_02/runs/s01_can14_staircase","q_rms_mrad":1.612492,"x_floor":1.490561,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0092"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_03/runs/s01_can14_tape_fast","q_rms_mrad":1.130757,"x_floor":1.045253,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0093"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_03/runs/s01_can14_tape_medium","q_rms_mrad":1.103063,"x_floor":1.019653,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0094"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_03/runs/s01_can14_tape_slow","q_rms_mrad":1.11687,"x_floor":1.032416,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0095"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_03/runs/s05_can14_tape_fast","q_rms_mrad":1.096979,"x_floor":1.014029,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0096"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_03/runs/s05_can14_tape_medium","q_rms_mrad":1.083231,"x_floor":1.001321,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0097"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_03/runs/s05_can14_tape_slow","q_rms_mrad":1.125344,"x_floor":1.040249,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0098"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_04/runs/s03_can14_tape_fast","q_rms_mrad":1.176362,"x_floor":1.08741,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0099"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_04/runs/s03_can14_tape_medium","q_rms_mrad":0.999837,"x_floor":0.924233,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0100"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_04/runs/s03_can14_tape_slow","q_rms_mrad":1.09128,"x_floor":1.008761,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0101"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_04/runs/s07_can14_tape_fast","q_rms_mrad":1.061484,"x_floor":0.981218,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0102"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_04/runs/s07_can14_tape_medium","q_rms_mrad":1.051552,"x_floor":0.972037,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0103"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_04/runs/s07_can14_tape_slow","q_rms_mrad":1.107015,"x_floor":1.023307,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0104"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s01_can14_waypoints","q_rms_mrad":3.960431,"x_floor":3.660957,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0105"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s03_can14_waypoints","q_rms_mrad":9.090289,"x_floor":8.402912,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0106"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s05_can14_waypoints","q_rms_mrad":3.691337,"x_floor":3.412211,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0107"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s07_can14_sine","q_rms_mrad":5.511104,"x_floor":5.094374,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0108"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s09_can14_waypoints","q_rms_mrad":4.085806,"x_floor":3.776851,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0109"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s11_can14_waypoints","q_rms_mrad":8.913365,"x_floor":8.239367,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0110"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s13_can14_waypoints","q_rms_mrad":4.040444,"x_floor":3.73492,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0111"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s15_can14_sine","q_rms_mrad":3.785674,"x_floor":3.499414,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0112"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s17_can14_waypoints","q_rms_mrad":4.73948,"x_floor":4.381097,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0113"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s19_can14_waypoints","q_rms_mrad":8.517949,"x_floor":7.873851,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0114"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s21_can14_waypoints","q_rms_mrad":4.432131,"x_floor":4.096989,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0115"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s23_can14_sine","q_rms_mrad":5.410553,"x_floor":5.001426,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0116"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can14_waypoints","q_rms_mrad":3.837236,"x_floor":3.547077,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0117"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can14_waypoints","q_rms_mrad":3.897175,"x_floor":3.602484,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0118"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can14_waypoints","q_rms_mrad":3.812934,"x_floor":3.524613,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0119"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can14_waypoints","q_rms_mrad":4.033009,"x_floor":3.728046,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0120"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can14_waypoints","q_rms_mrad":4.113314,"x_floor":3.802279,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0121"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_01a/runs/s01_can14_staircase","q_rms_mrad":1.282905,"x_floor":1.185896,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0122"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_01a/runs/s03_can14_staircase","q_rms_mrad":1.284585,"x_floor":1.187449,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0123"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_01c/runs/s03_can14_sine","q_rms_mrad":1.809055,"x_floor":1.672261,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0124"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_01c/runs/s05_can14_tape_fast","q_rms_mrad":1.115638,"x_floor":1.031277,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0125"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_01c/runs/s05_can14_tape_medium","q_rms_mrad":1.021629,"x_floor":0.944377,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0126"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_01c/runs/s05_can14_tape_slow","q_rms_mrad":1.182252,"x_floor":1.092854,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0127"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_02/runs/s01_can14_staircase","q_rms_mrad":1.620853,"x_floor":1.49829,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0128"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_03/runs/s01_can14_tape_fast","q_rms_mrad":1.03897,"x_floor":0.960407,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0129"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_03/runs/s01_can14_tape_medium","q_rms_mrad":1.065223,"x_floor":0.984674,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0130"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_03/runs/s01_can14_tape_slow","q_rms_mrad":1.129556,"x_floor":1.044143,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0131"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_03/runs/s05_can14_tape_fast","q_rms_mrad":1.002165,"x_floor":0.926385,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0132"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_03/runs/s05_can14_tape_medium","q_rms_mrad":1.041609,"x_floor":0.962846,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0133"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_03/runs/s05_can14_tape_slow","q_rms_mrad":1.137089,"x_floor":1.051106,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0134"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_04/runs/s03_can14_tape_fast","q_rms_mrad":1.066692,"x_floor":0.986033,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0135"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_04/runs/s03_can14_tape_medium","q_rms_mrad":0.970864,"x_floor":0.897451,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0136"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_04/runs/s03_can14_tape_slow","q_rms_mrad":1.101199,"x_floor":1.01793,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0137"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_04/runs/s07_can14_tape_fast","q_rms_mrad":0.957311,"x_floor":0.884923,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0138"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_04/runs/s07_can14_tape_medium","q_rms_mrad":1.021648,"x_floor":0.944395,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0139"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_04/runs/s07_can14_tape_slow","q_rms_mrad":1.113429,"x_floor":1.029236,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0140"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_01a/runs/s01_can14_staircase","q_rms_mrad":2.953585,"x_floor":2.730245,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0141"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_01a/runs/s03_can14_staircase","q_rms_mrad":2.621389,"x_floor":2.423169,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0142"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_01c/runs/s03_can14_sine","q_rms_mrad":1.558833,"x_floor":1.440959,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0143"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_01c/runs/s05_can14_tape_fast","q_rms_mrad":2.802335,"x_floor":2.590432,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0144"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_01c/runs/s05_can14_tape_medium","q_rms_mrad":2.46431,"x_floor":2.277967,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0145"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_01c/runs/s05_can14_tape_slow","q_rms_mrad":2.718809,"x_floor":2.513222,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0146"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_02/runs/s01_can14_staircase","q_rms_mrad":2.872169,"x_floor":2.654985,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0147"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_03/runs/s01_can14_tape_fast","q_rms_mrad":1.389605,"x_floor":1.284527,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0148"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_03/runs/s01_can14_tape_medium","q_rms_mrad":1.674405,"x_floor":1.547792,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0149"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_03/runs/s01_can14_tape_slow","q_rms_mrad":2.183293,"x_floor":2.018199,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0150"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_03/runs/s05_can14_tape_fast","q_rms_mrad":1.323258,"x_floor":1.223198,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0151"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_03/runs/s05_can14_tape_medium","q_rms_mrad":1.646812,"x_floor":1.522286,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0152"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_03/runs/s05_can14_tape_slow","q_rms_mrad":2.238328,"x_floor":2.069073,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0153"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_04/runs/s03_can14_tape_fast","q_rms_mrad":1.408964,"x_floor":1.302423,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0154"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_04/runs/s03_can14_tape_medium","q_rms_mrad":1.597504,"x_floor":1.476706,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0155"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_04/runs/s03_can14_tape_slow","q_rms_mrad":2.21051,"x_floor":2.043359,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0156"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_04/runs/s07_can14_tape_fast","q_rms_mrad":1.352213,"x_floor":1.249963,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0157"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_04/runs/s07_can14_tape_medium","q_rms_mrad":1.659053,"x_floor":1.533601,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0158"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_04/runs/s07_can14_tape_slow","q_rms_mrad":2.255747,"x_floor":2.085175,"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0159"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"r0160"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"r0161"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"r0162"},{"kind":"run","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":1.081802,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"r0163"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s09_can21_sine","q_rms_mrad":5.479771,"x_floor":2.581526,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0164"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s32_can21_sine","q_rms_mrad":3.89604,"x_floor":1.835428,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0165"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s33_can21_tape_fast","q_rms_mrad":3.850121,"x_floor":1.813796,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0166"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s33_can21_tape_medium","q_rms_mrad":3.577858,"x_floor":1.685533,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0167"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s33_can21_tape_slow","q_rms_mrad":3.707092,"x_floor":1.746415,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0168"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s09_can21_sine","q_rms_mrad":5.37579,"x_floor":2.53254,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0169"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s32_can21_sine","q_rms_mrad":3.616973,"x_floor":1.70396,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0170"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s33_can21_tape_fast","q_rms_mrad":4.578859,"x_floor":2.157105,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0171"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s33_can21_tape_medium","q_rms_mrad":3.561037,"x_floor":1.677608,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0172"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s33_can21_tape_slow","q_rms_mrad":3.481399,"x_floor":1.640091,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0173"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s01_can21_waypoints","q_rms_mrad":39.763937,"x_floor":18.732832,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0174"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s03_can21_waypoints","q_rms_mrad":76.087531,"x_floor":35.844914,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0175"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s05_can21_waypoints","q_rms_mrad":37.18409,"x_floor":17.517463,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0176"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s07_can21_sine","q_rms_mrad":75.395468,"x_floor":35.518882,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0177"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s09_can21_waypoints","q_rms_mrad":29.03731,"x_floor":13.679507,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0178"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s11_can21_waypoints","q_rms_mrad":78.945454,"x_floor":37.191284,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0179"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s13_can21_waypoints","q_rms_mrad":51.389772,"x_floor":24.209774,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0180"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s15_can21_sine","q_rms_mrad":6.601624,"x_floor":3.110032,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0181"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s17_can21_waypoints","q_rms_mrad":35.530329,"x_floor":16.738374,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0182"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s19_can21_waypoints","q_rms_mrad":86.498289,"x_floor":40.749433,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0183"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s21_can21_waypoints","q_rms_mrad":42.674981,"x_floor":20.104227,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0184"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s23_can21_sine","q_rms_mrad":54.834392,"x_floor":25.832538,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0185"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can21_waypoints","q_rms_mrad":31.041212,"x_floor":14.623547,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0186"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can21_waypoints","q_rms_mrad":31.388444,"x_floor":14.787128,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0187"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can21_waypoints","q_rms_mrad":31.07009,"x_floor":14.637151,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0188"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can21_waypoints","q_rms_mrad":30.962355,"x_floor":14.586397,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0189"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can21_waypoints","q_rms_mrad":31.1269,"x_floor":14.663915,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0190"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s09_can21_sine","q_rms_mrad":5.382008,"x_floor":2.53547,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"r0191"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s32_can21_sine","q_rms_mrad":3.615944,"x_floor":1.703475,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"r0192"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s33_can21_tape_fast","q_rms_mrad":4.575105,"x_floor":2.155336,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"r0193"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s33_can21_tape_medium","q_rms_mrad":3.557022,"x_floor":1.675717,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"r0194"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s33_can21_tape_slow","q_rms_mrad":3.479208,"x_floor":1.639058,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"r0195"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s09_can21_sine","q_rms_mrad":5.799221,"x_floor":2.732019,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"r0196"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s32_can21_sine","q_rms_mrad":4.170634,"x_floor":1.96479,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"r0197"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s33_can21_tape_fast","q_rms_mrad":4.659385,"x_floor":2.195041,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"r0198"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s33_can21_tape_medium","q_rms_mrad":4.049042,"x_floor":1.907508,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"r0199"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s33_can21_tape_slow","q_rms_mrad":4.019563,"x_floor":1.89362,"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"r0200"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"r0201"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"r0202"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"r0203"},{"kind":"run","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.122687,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"r0204"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_02/runs/s01_can15_sine","q_rms_mrad":0.630949,"x_floor":0.675795,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0205"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_03/runs/s01_can15_sine","q_rms_mrad":0.477987,"x_floor":0.511961,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0206"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_04/runs/s01_can15_sine","q_rms_mrad":4.238137,"x_floor":4.539371,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0207"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_04/runs/s03_can15_sine","q_rms_mrad":1.971064,"x_floor":2.111161,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0208"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_05/runs/s01_can15_staircase","q_rms_mrad":4.745507,"x_floor":5.082802,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0209"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_05/runs/s03_can15_staircase","q_rms_mrad":3.292329,"x_floor":3.526337,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0210"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_07/runs/s03_can15_sine","q_rms_mrad":1.46565,"x_floor":1.569824,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0211"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_07/runs/s05_can15_tape_fast","q_rms_mrad":1.233514,"x_floor":1.321189,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0212"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_07/runs/s05_can15_tape_medium","q_rms_mrad":1.29505,"x_floor":1.387099,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0213"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_07/runs/s05_can15_tape_slow","q_rms_mrad":1.457062,"x_floor":1.560625,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0214"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s03_can15_sine","q_rms_mrad":1.805257,"x_floor":1.933569,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0215"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_08/runs/s05_can15_tape_fast","q_rms_mrad":2.710832,"x_floor":2.90351,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0216"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_08/runs/s05_can15_tape_medium","q_rms_mrad":2.388489,"x_floor":2.558255,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0217"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_08/runs/s05_can15_tape_slow","q_rms_mrad":2.197834,"x_floor":2.354049,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0218"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_02/runs/s01_can15_sine","q_rms_mrad":0.485378,"x_floor":0.519877,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0219"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_03/runs/s01_can15_sine","q_rms_mrad":0.419674,"x_floor":0.449503,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0220"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_04/runs/s01_can15_sine","q_rms_mrad":3.45499,"x_floor":3.700559,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0221"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_04/runs/s03_can15_sine","q_rms_mrad":1.849871,"x_floor":1.981354,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0222"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_05/runs/s01_can15_staircase","q_rms_mrad":2.148937,"x_floor":2.301677,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0223"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_05/runs/s03_can15_staircase","q_rms_mrad":1.759124,"x_floor":1.884157,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0224"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_07/runs/s03_can15_sine","q_rms_mrad":1.482433,"x_floor":1.5878,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0225"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_07/runs/s05_can15_tape_fast","q_rms_mrad":1.685827,"x_floor":1.805651,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0226"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_07/runs/s05_can15_tape_medium","q_rms_mrad":1.508841,"x_floor":1.616085,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0227"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_07/runs/s05_can15_tape_slow","q_rms_mrad":1.547068,"x_floor":1.657028,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0228"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s03_can15_sine","q_rms_mrad":1.761633,"x_floor":1.886844,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0229"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_08/runs/s05_can15_tape_fast","q_rms_mrad":1.659818,"x_floor":1.777793,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0230"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_08/runs/s05_can15_tape_medium","q_rms_mrad":1.574178,"x_floor":1.686065,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0231"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_08/runs/s05_can15_tape_slow","q_rms_mrad":1.489957,"x_floor":1.595859,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0232"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s01_can15_waypoints","q_rms_mrad":6.514315,"x_floor":6.977331,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0233"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s03_can15_waypoints","q_rms_mrad":13.617666,"x_floor":14.585566,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0234"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s05_can15_waypoints","q_rms_mrad":9.032584,"x_floor":9.674591,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0235"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s07_can15_sine","q_rms_mrad":10.692214,"x_floor":11.452183,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0236"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s09_can15_waypoints","q_rms_mrad":7.629147,"x_floor":8.171402,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0237"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s11_can15_waypoints","q_rms_mrad":13.927529,"x_floor":14.917453,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0238"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s13_can15_waypoints","q_rms_mrad":8.429191,"x_floor":9.028311,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0239"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s15_can15_sine","q_rms_mrad":6.963443,"x_floor":7.458383,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0240"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s17_can15_waypoints","q_rms_mrad":6.026968,"x_floor":6.455346,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0241"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s19_can15_waypoints","q_rms_mrad":13.143375,"x_floor":14.077565,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0242"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s21_can15_waypoints","q_rms_mrad":7.566695,"x_floor":8.104512,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0243"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s23_can15_sine","q_rms_mrad":14.220925,"x_floor":15.231703,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0244"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can15_waypoints","q_rms_mrad":6.164565,"x_floor":6.602723,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0245"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can15_waypoints","q_rms_mrad":6.1555,"x_floor":6.593014,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0246"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can15_waypoints","q_rms_mrad":6.318654,"x_floor":6.767763,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0247"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can15_waypoints","q_rms_mrad":6.090143,"x_floor":6.523011,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0248"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.c1","about":"Coulomb, sticking friction, tuned inertia, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can15_waypoints","q_rms_mrad":6.09766,"x_floor":6.531062,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","id":"r0249"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_02/runs/s01_can15_sine","q_rms_mrad":0.484202,"x_floor":0.518618,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0250"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_03/runs/s01_can15_sine","q_rms_mrad":0.418564,"x_floor":0.448314,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0251"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_04/runs/s01_can15_sine","q_rms_mrad":3.455724,"x_floor":3.701346,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0252"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_04/runs/s03_can15_sine","q_rms_mrad":1.850426,"x_floor":1.981948,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0253"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_05/runs/s01_can15_staircase","q_rms_mrad":2.147928,"x_floor":2.300596,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0254"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_05/runs/s03_can15_staircase","q_rms_mrad":1.763504,"x_floor":1.888848,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0255"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_07/runs/s03_can15_sine","q_rms_mrad":1.467877,"x_floor":1.572209,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0256"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_07/runs/s05_can15_tape_fast","q_rms_mrad":1.685084,"x_floor":1.804854,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0257"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_07/runs/s05_can15_tape_medium","q_rms_mrad":1.50802,"x_floor":1.615205,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0258"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_07/runs/s05_can15_tape_slow","q_rms_mrad":1.546823,"x_floor":1.656766,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0259"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s03_can15_sine","q_rms_mrad":1.726016,"x_floor":1.848696,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0260"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_08/runs/s05_can15_tape_fast","q_rms_mrad":1.658021,"x_floor":1.775868,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0261"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_08/runs/s05_can15_tape_medium","q_rms_mrad":1.573408,"x_floor":1.68524,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0262"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_08/runs/s05_can15_tape_slow","q_rms_mrad":1.489659,"x_floor":1.59554,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0263"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_02/runs/s01_can15_sine","q_rms_mrad":0.631797,"x_floor":0.676703,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0264"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_03/runs/s01_can15_sine","q_rms_mrad":0.478341,"x_floor":0.512339,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0265"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_04/runs/s01_can15_sine","q_rms_mrad":4.241945,"x_floor":4.543449,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0266"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_04/runs/s03_can15_sine","q_rms_mrad":1.973709,"x_floor":2.113994,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0267"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_05/runs/s01_can15_staircase","q_rms_mrad":4.746717,"x_floor":5.084098,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0268"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_05/runs/s03_can15_staircase","q_rms_mrad":3.29389,"x_floor":3.528009,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0269"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_07/runs/s03_can15_sine","q_rms_mrad":1.468132,"x_floor":1.572482,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0270"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_07/runs/s05_can15_tape_fast","q_rms_mrad":1.237321,"x_floor":1.325266,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0271"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_07/runs/s05_can15_tape_medium","q_rms_mrad":1.297308,"x_floor":1.389517,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0272"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_07/runs/s05_can15_tape_slow","q_rms_mrad":1.458291,"x_floor":1.561942,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0273"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s03_can15_sine","q_rms_mrad":1.810951,"x_floor":1.939668,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0274"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_08/runs/s05_can15_tape_fast","q_rms_mrad":2.71504,"x_floor":2.908016,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0275"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_08/runs/s05_can15_tape_medium","q_rms_mrad":2.391602,"x_floor":2.56159,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0276"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_08/runs/s05_can15_tape_slow","q_rms_mrad":2.199951,"x_floor":2.356317,"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0277"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"r0278"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"r0279"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"r0280"},{"kind":"run","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":0.93364,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"r0281"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_16/runs/s02_can1_staircase","q_rms_mrad":4.062527,"x_floor":4.529901,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0282"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_17/runs/s04_can1_sine","q_rms_mrad":2.315369,"x_floor":2.581741,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0283"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_17/runs/s05_can1_tape_fast","q_rms_mrad":1.971861,"x_floor":2.198714,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0284"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_17/runs/s05_can1_tape_medium","q_rms_mrad":2.27476,"x_floor":2.53646,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0285"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_17/runs/s05_can1_tape_slow","q_rms_mrad":3.132695,"x_floor":3.493096,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0286"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_16/runs/s02_can1_staircase","q_rms_mrad":2.183303,"x_floor":2.434481,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0287"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_17/runs/s04_can1_sine","q_rms_mrad":2.31846,"x_floor":2.585188,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0288"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_17/runs/s05_can1_tape_fast","q_rms_mrad":2.586643,"x_floor":2.884224,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0289"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_17/runs/s05_can1_tape_medium","q_rms_mrad":2.761126,"x_floor":3.078781,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0290"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_17/runs/s05_can1_tape_slow","q_rms_mrad":2.872179,"x_floor":3.202609,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0291"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s01_can1_waypoints","q_rms_mrad":2.740671,"x_floor":3.055972,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0292"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s03_can1_waypoints","q_rms_mrad":4.487925,"x_floor":5.004239,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0293"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s05_can1_waypoints","q_rms_mrad":3.863381,"x_floor":4.307844,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0294"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s07_can1_sine","q_rms_mrad":3.524145,"x_floor":3.92958,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0295"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s09_can1_waypoints","q_rms_mrad":3.543973,"x_floor":3.95169,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0296"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s11_can1_waypoints","q_rms_mrad":3.670937,"x_floor":4.093261,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0297"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s13_can1_waypoints","q_rms_mrad":2.177385,"x_floor":2.427882,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0298"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s15_can1_sine","q_rms_mrad":1.562949,"x_floor":1.742759,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0299"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s17_can1_waypoints","q_rms_mrad":2.758796,"x_floor":3.076183,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0300"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s19_can1_waypoints","q_rms_mrad":4.287788,"x_floor":4.781077,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0301"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s21_can1_waypoints","q_rms_mrad":2.964304,"x_floor":3.305333,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0302"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s23_can1_sine","q_rms_mrad":1.480296,"x_floor":1.650597,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0303"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can1_waypoints","q_rms_mrad":2.952012,"x_floor":3.291627,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0304"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can1_waypoints","q_rms_mrad":3.407789,"x_floor":3.799839,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0305"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can1_waypoints","q_rms_mrad":3.427923,"x_floor":3.822289,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0306"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can1_waypoints","q_rms_mrad":3.44665,"x_floor":3.843171,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0307"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.c1","about":"Coulomb + weakening + cogging map + backlash, with the moteus-c1 driver twin","backend":"MuJoCo + plugin + moteus-c1 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can1_waypoints","q_rms_mrad":3.43423,"x_floor":3.829322,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.c1","id":"r0308"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_16/runs/s02_can1_staircase","q_rms_mrad":2.185058,"x_floor":2.436439,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0309"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_17/runs/s04_can1_sine","q_rms_mrad":2.308983,"x_floor":2.57462,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0310"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_17/runs/s05_can1_tape_fast","q_rms_mrad":2.588004,"x_floor":2.885741,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0311"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_17/runs/s05_can1_tape_medium","q_rms_mrad":2.773697,"x_floor":3.092797,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0312"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.ideal","about":"Coulomb + weakening + cogging map + backlash, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_17/runs/s05_can1_tape_slow","q_rms_mrad":2.880965,"x_floor":3.212406,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.ideal","id":"r0313"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_16/runs/s02_can1_staircase","q_rms_mrad":3.647386,"x_floor":4.067,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0314"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_17/runs/s04_can1_sine","q_rms_mrad":2.177052,"x_floor":2.427512,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0315"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_17/runs/s05_can1_tape_fast","q_rms_mrad":2.161579,"x_floor":2.410258,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0316"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_17/runs/s05_can1_tape_medium","q_rms_mrad":2.061147,"x_floor":2.298272,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0317"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","model":"M4.ripple","variant":"M4.ripple.soft","about":"Coulomb + weakening + cogging map + backlash, MuJoCo's soft friction","backend":"MuJoCo + plugin + c1, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_17/runs/s05_can1_tape_slow","q_rms_mrad":2.148931,"x_floor":2.396155,"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M4.ripple.soft","id":"r0318"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"r0319"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"r0320"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"r0321"},{"kind":"run","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":0.896825,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"r0322"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s26_can13_sine","q_rms_mrad":30.555832,"x_floor":10.573348,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0323"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s27_can13_tape_fast","q_rms_mrad":23.394971,"x_floor":8.095449,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0324"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s27_can13_tape_medium","q_rms_mrad":29.151032,"x_floor":10.08724,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0325"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s27_can13_tape_slow","q_rms_mrad":35.465037,"x_floor":12.272099,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0326"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_11/runs/s01_can13_staircase","q_rms_mrad":70.017767,"x_floor":24.228509,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0327"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s26_can13_sine","q_rms_mrad":17.447097,"x_floor":6.037284,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0328"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s27_can13_tape_fast","q_rms_mrad":5.576086,"x_floor":1.929514,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0329"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s27_can13_tape_medium","q_rms_mrad":6.883072,"x_floor":2.381775,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0330"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s27_can13_tape_slow","q_rms_mrad":7.932732,"x_floor":2.744993,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0331"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_11/runs/s01_can13_staircase","q_rms_mrad":55.484927,"x_floor":19.199656,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0332"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s01_can13_waypoints","q_rms_mrad":10.170504,"x_floor":3.519337,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0333"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s03_can13_waypoints","q_rms_mrad":9.87256,"x_floor":3.416239,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0334"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s05_can13_waypoints","q_rms_mrad":6.655307,"x_floor":2.302961,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0335"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s07_can13_sine","q_rms_mrad":5.900731,"x_floor":2.041852,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0336"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s09_can13_waypoints","q_rms_mrad":10.998581,"x_floor":3.80588,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0337"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s11_can13_waypoints","q_rms_mrad":10.966025,"x_floor":3.794614,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0338"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s13_can13_waypoints","q_rms_mrad":6.793011,"x_floor":2.350611,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0339"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s15_can13_sine","q_rms_mrad":9.577239,"x_floor":3.314048,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0340"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s17_can13_waypoints","q_rms_mrad":12.473234,"x_floor":4.31616,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0341"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s19_can13_waypoints","q_rms_mrad":15.890429,"x_floor":5.498624,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0342"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s21_can13_waypoints","q_rms_mrad":9.61413,"x_floor":3.326813,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0343"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s23_can13_sine","q_rms_mrad":11.067608,"x_floor":3.829766,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0344"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can13_waypoints","q_rms_mrad":7.504543,"x_floor":2.596825,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0345"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can13_waypoints","q_rms_mrad":8.605292,"x_floor":2.977721,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0346"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can13_waypoints","q_rms_mrad":10.541439,"x_floor":3.647693,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0347"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can13_waypoints","q_rms_mrad":9.390371,"x_floor":3.249385,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0348"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can13_waypoints","q_rms_mrad":8.21193,"x_floor":2.841605,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0349"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"pickplace","test_order":5,"run":"s09_can13_waypoints","q_rms_mrad":10.620073,"x_floor":3.674903,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0350"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"cycle","test_order":6,"run":"s11_can13_waypoints","q_rms_mrad":10.06195,"x_floor":3.481774,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0351"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"jog","test_order":7,"run":"s13_can13_waypoints","q_rms_mrad":8.298159,"x_floor":2.871443,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0352"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"sweep","test_order":8,"run":"s15_can13_sine","q_rms_mrad":9.388598,"x_floor":3.248772,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0353"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"pickplace","test_order":5,"run":"s17_can13_waypoints","q_rms_mrad":12.711932,"x_floor":4.398757,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0354"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"cycle","test_order":6,"run":"s01_can13_waypoints","q_rms_mrad":12.381658,"x_floor":4.284471,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0355"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"jog","test_order":7,"run":"s03_can13_waypoints","q_rms_mrad":8.30608,"x_floor":2.874184,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0356"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"sweep","test_order":8,"run":"s05_can13_sine","q_rms_mrad":9.765297,"x_floor":3.379122,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0357"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s26_can13_sine","q_rms_mrad":17.446265,"x_floor":6.036996,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0358"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s27_can13_tape_fast","q_rms_mrad":5.580634,"x_floor":1.931088,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0359"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s27_can13_tape_medium","q_rms_mrad":6.884427,"x_floor":2.382244,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0360"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s27_can13_tape_slow","q_rms_mrad":7.932644,"x_floor":2.744962,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0361"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_11/runs/s01_can13_staircase","q_rms_mrad":55.483081,"x_floor":19.199017,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0362"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s26_can13_sine","q_rms_mrad":29.874189,"x_floor":10.337477,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0363"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s27_can13_tape_fast","q_rms_mrad":22.544421,"x_floor":7.80113,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0364"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s27_can13_tape_medium","q_rms_mrad":28.00078,"x_floor":9.689214,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0365"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s27_can13_tape_slow","q_rms_mrad":34.497222,"x_floor":11.937202,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0366"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_11/runs/s01_can13_staircase","q_rms_mrad":69.919946,"x_floor":24.194659,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0367"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can13_waypoints","q_rms_mrad":3.231397,"x_floor":1.118172,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0368"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can13_waypoints","q_rms_mrad":4.080312,"x_floor":1.411926,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0369"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can13_waypoints","q_rms_mrad":6.190179,"x_floor":2.142011,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0370"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can13_waypoints","q_rms_mrad":4.793376,"x_floor":1.65867,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0371"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can13_waypoints","q_rms_mrad":3.778742,"x_floor":1.307572,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0372"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"pickplace","test_order":5,"run":"s09_can13_waypoints","q_rms_mrad":5.422715,"x_floor":1.876442,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0373"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"cycle","test_order":6,"run":"s11_can13_waypoints","q_rms_mrad":5.266067,"x_floor":1.822237,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0374"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"jog","test_order":7,"run":"s13_can13_waypoints","q_rms_mrad":7.130912,"x_floor":2.467536,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0375"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"sweep","test_order":8,"run":"s15_can13_sine","q_rms_mrad":5.579709,"x_floor":1.930767,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0376"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"pickplace","test_order":5,"run":"s17_can13_waypoints","q_rms_mrad":6.505037,"x_floor":2.250962,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0377"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"cycle","test_order":6,"run":"s01_can13_waypoints","q_rms_mrad":7.724404,"x_floor":2.672904,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0378"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"jog","test_order":7,"run":"s03_can13_waypoints","q_rms_mrad":7.143578,"x_floor":2.471919,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0379"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"sweep","test_order":8,"run":"s05_can13_sine","q_rms_mrad":4.655462,"x_floor":1.610947,"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0380"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"r0381"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"r0382"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"r0383"},{"kind":"run","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.889892,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"r0384"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s19_can12_sine","q_rms_mrad":13.697228,"x_floor":4.681907,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0385"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s20_can12_tape_fast","q_rms_mrad":20.260073,"x_floor":6.925181,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0386"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s20_can12_tape_medium","q_rms_mrad":23.416455,"x_floor":8.004077,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0387"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s20_can12_tape_slow","q_rms_mrad":31.76174,"x_floor":10.856613,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0388"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s19_can12_sine","q_rms_mrad":13.783102,"x_floor":4.71126,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0389"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s20_can12_tape_fast","q_rms_mrad":10.462676,"x_floor":3.576291,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0390"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s20_can12_tape_medium","q_rms_mrad":7.380618,"x_floor":2.5228,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0391"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s20_can12_tape_slow","q_rms_mrad":9.022045,"x_floor":3.083863,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0392"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s01_can12_waypoints","q_rms_mrad":7.83694,"x_floor":2.678777,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0393"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s03_can12_waypoints","q_rms_mrad":30.740686,"x_floor":10.507603,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0394"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s05_can12_waypoints","q_rms_mrad":16.645555,"x_floor":5.689687,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0395"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s07_can12_sine","q_rms_mrad":11.115795,"x_floor":3.799536,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0396"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s09_can12_waypoints","q_rms_mrad":14.626465,"x_floor":4.999533,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0397"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s11_can12_waypoints","q_rms_mrad":31.572883,"x_floor":10.792059,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0398"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s13_can12_waypoints","q_rms_mrad":14.480412,"x_floor":4.94961,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0399"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s15_can12_sine","q_rms_mrad":23.295535,"x_floor":7.962744,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0400"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s17_can12_waypoints","q_rms_mrad":11.651852,"x_floor":3.982769,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0401"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s19_can12_waypoints","q_rms_mrad":32.471965,"x_floor":11.099379,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0402"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s21_can12_waypoints","q_rms_mrad":16.961608,"x_floor":5.797718,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0403"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s23_can12_sine","q_rms_mrad":9.50747,"x_floor":3.249788,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0404"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can12_waypoints","q_rms_mrad":9.02259,"x_floor":3.084049,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0405"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can12_waypoints","q_rms_mrad":8.451885,"x_floor":2.888974,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0406"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can12_waypoints","q_rms_mrad":8.658561,"x_floor":2.959619,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0407"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can12_waypoints","q_rms_mrad":8.226604,"x_floor":2.81197,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0408"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can12_waypoints","q_rms_mrad":8.253378,"x_floor":2.821122,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0409"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"pickplace","test_order":5,"run":"s09_can12_waypoints","q_rms_mrad":16.058279,"x_floor":5.488948,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0410"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"cycle","test_order":6,"run":"s11_can12_waypoints","q_rms_mrad":28.581095,"x_floor":9.769424,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0411"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"jog","test_order":7,"run":"s01_can12_waypoints","q_rms_mrad":14.766475,"x_floor":5.047391,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0412"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"sweep","test_order":8,"run":"s03_can12_sine","q_rms_mrad":21.696757,"x_floor":7.416259,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0413"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"pickplace","test_order":5,"run":"s05_can12_waypoints","q_rms_mrad":10.334595,"x_floor":3.532511,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0414"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"jog","test_order":7,"run":"s01_can12_waypoints","q_rms_mrad":16.263981,"x_floor":5.55926,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0415"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.r4","about":"Coulomb + velocity weakening, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"sweep","test_order":8,"run":"s03_can12_sine","q_rms_mrad":9.085186,"x_floor":3.105445,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","id":"r0416"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s19_can12_sine","q_rms_mrad":13.752174,"x_floor":4.700688,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"r0417"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s20_can12_tape_fast","q_rms_mrad":10.407709,"x_floor":3.557503,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"r0418"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s20_can12_tape_medium","q_rms_mrad":7.425882,"x_floor":2.538272,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"r0419"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.ideal","about":"Coulomb + velocity weakening, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s20_can12_tape_slow","q_rms_mrad":12.097853,"x_floor":4.135218,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.ideal","id":"r0420"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s19_can12_sine","q_rms_mrad":21.432965,"x_floor":7.326092,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"r0421"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s20_can12_tape_fast","q_rms_mrad":23.810134,"x_floor":8.138642,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"r0422"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s20_can12_tape_medium","q_rms_mrad":31.326178,"x_floor":10.707732,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"r0423"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.stribeck","variant":"M3.stribeck.soft","about":"Coulomb + velocity weakening, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s20_can12_tape_slow","q_rms_mrad":37.362885,"x_floor":12.771165,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.stribeck.soft","id":"r0424"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can12_waypoints","q_rms_mrad":5.123038,"x_floor":1.751127,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0425"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can12_waypoints","q_rms_mrad":3.544977,"x_floor":1.211723,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0426"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can12_waypoints","q_rms_mrad":3.637018,"x_floor":1.243184,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0427"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can12_waypoints","q_rms_mrad":3.200232,"x_floor":1.093885,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0428"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can12_waypoints","q_rms_mrad":3.592108,"x_floor":1.227834,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0429"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"pickplace","test_order":5,"run":"s09_can12_waypoints","q_rms_mrad":11.616156,"x_floor":3.970567,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0430"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"cycle","test_order":6,"run":"s11_can12_waypoints","q_rms_mrad":7.907102,"x_floor":2.70276,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0431"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"jog","test_order":7,"run":"s01_can12_waypoints","q_rms_mrad":5.427807,"x_floor":1.855302,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0432"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"sweep","test_order":8,"run":"s03_can12_sine","q_rms_mrad":5.602918,"x_floor":1.915157,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0433"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"pickplace","test_order":5,"run":"s05_can12_waypoints","q_rms_mrad":4.869036,"x_floor":1.664305,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0434"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"jog","test_order":7,"run":"s01_can12_waypoints","q_rms_mrad":4.92984,"x_floor":1.685089,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0435"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"sweep","test_order":8,"run":"s03_can12_sine","q_rms_mrad":6.386062,"x_floor":2.182847,"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0436"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"r0437"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"r0438"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"r0439"},{"kind":"run","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.925566,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"r0440"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s12_can11_sine","q_rms_mrad":10.843422,"x_floor":5.334243,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0441"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s13_can11_tape_fast","q_rms_mrad":15.23036,"x_floor":7.492325,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0442"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s13_can11_tape_medium","q_rms_mrad":15.289503,"x_floor":7.52142,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0443"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s13_can11_tape_slow","q_rms_mrad":13.166042,"x_floor":6.476818,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0444"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_12/runs/s01_can11_staircase","q_rms_mrad":27.505952,"x_floor":13.531102,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0445"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s12_can11_sine","q_rms_mrad":10.580625,"x_floor":5.204964,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0446"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s13_can11_tape_fast","q_rms_mrad":13.210646,"x_floor":6.498761,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0447"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s13_can11_tape_medium","q_rms_mrad":13.600033,"x_floor":6.690313,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0448"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s13_can11_tape_slow","q_rms_mrad":10.950746,"x_floor":5.387039,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0449"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_12/runs/s01_can11_staircase","q_rms_mrad":15.607841,"x_floor":7.678021,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0450"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s01_can11_waypoints","q_rms_mrad":8.280957,"x_floor":4.073681,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0451"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s03_can11_waypoints","q_rms_mrad":31.831723,"x_floor":15.659093,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0452"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s05_can11_waypoints","q_rms_mrad":16.085268,"x_floor":7.912884,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0453"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s07_can11_sine","q_rms_mrad":17.254291,"x_floor":8.487965,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0454"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s09_can11_waypoints","q_rms_mrad":27.458593,"x_floor":13.507804,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0455"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s11_can11_waypoints","q_rms_mrad":29.361277,"x_floor":14.443798,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0456"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s13_can11_waypoints","q_rms_mrad":22.619024,"x_floor":11.127057,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0457"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s15_can11_sine","q_rms_mrad":32.693577,"x_floor":16.083068,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0458"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s17_can11_waypoints","q_rms_mrad":17.675102,"x_floor":8.694976,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0459"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s19_can11_waypoints","q_rms_mrad":32.470624,"x_floor":15.97339,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0460"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s21_can11_waypoints","q_rms_mrad":15.307768,"x_floor":7.530405,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0461"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s23_can11_sine","q_rms_mrad":34.147364,"x_floor":16.798235,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0462"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can11_waypoints","q_rms_mrad":17.885346,"x_floor":8.798402,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0463"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can11_waypoints","q_rms_mrad":17.386968,"x_floor":8.553233,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0464"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can11_waypoints","q_rms_mrad":16.916647,"x_floor":8.321867,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0465"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can11_waypoints","q_rms_mrad":17.297939,"x_floor":8.509437,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0466"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can11_waypoints","q_rms_mrad":16.9706,"x_floor":8.348408,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0467"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s12_can11_sine","q_rms_mrad":10.568731,"x_floor":5.199114,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0468"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s13_can11_tape_fast","q_rms_mrad":13.189592,"x_floor":6.488403,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0469"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s13_can11_tape_medium","q_rms_mrad":13.595088,"x_floor":6.68788,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0470"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s13_can11_tape_slow","q_rms_mrad":10.946858,"x_floor":5.385127,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0471"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_12/runs/s01_can11_staircase","q_rms_mrad":15.611572,"x_floor":7.679857,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0472"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s12_can11_sine","q_rms_mrad":10.240816,"x_floor":5.037801,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0473"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s13_can11_tape_fast","q_rms_mrad":13.507049,"x_floor":6.644571,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0474"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s13_can11_tape_medium","q_rms_mrad":13.464898,"x_floor":6.623836,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0475"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s13_can11_tape_slow","q_rms_mrad":9.806219,"x_floor":4.824008,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0476"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_12/runs/s01_can11_staircase","q_rms_mrad":14.805974,"x_floor":7.283556,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0477"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can11_waypoints","q_rms_mrad":10.796463,"x_floor":5.311143,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0478"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can11_waypoints","q_rms_mrad":9.954118,"x_floor":4.896765,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0479"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can11_waypoints","q_rms_mrad":9.823504,"x_floor":4.832511,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0480"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can11_waypoints","q_rms_mrad":9.723561,"x_floor":4.783346,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0481"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can11_waypoints","q_rms_mrad":9.691052,"x_floor":4.767354,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0482"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"pickplace","test_order":5,"run":"s09_can11_waypoints","q_rms_mrad":7.904749,"x_floor":3.888611,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0483"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"cycle","test_order":6,"run":"s11_can11_waypoints","q_rms_mrad":9.557937,"x_floor":4.70187,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0484"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"jog","test_order":7,"run":"s13_can11_waypoints","q_rms_mrad":11.048998,"x_floor":5.435373,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0485"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"sweep","test_order":8,"run":"s15_can11_sine","q_rms_mrad":7.910652,"x_floor":3.891515,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0486"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"pickplace","test_order":5,"run":"s17_can11_waypoints","q_rms_mrad":14.391839,"x_floor":7.079829,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0487"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"cycle","test_order":6,"run":"s19_can11_waypoints","q_rms_mrad":8.81701,"x_floor":4.337383,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0488"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"jog","test_order":7,"run":"s21_can11_waypoints","q_rms_mrad":6.057237,"x_floor":2.979758,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0489"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","model":"M3.capture","variant":"M3.capture.r4","about":"the full twin + friction that captures below a speed","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset seeds · Oct 25","benches":["Dataset seeds · Oct 25"],"bench_order":3,"test":"sweep","test_order":8,"run":"s23_can11_sine","q_rms_mrad":6.38501,"x_floor":3.141001,"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.capture.r4","id":"r0490"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"r0491"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"r0492"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"r0493"},{"kind":"run","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":2.032795,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"r0494"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s01_can4_sine","q_rms_mrad":39.429566,"x_floor":12.237196,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0495"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s05_can4_sine","q_rms_mrad":43.506471,"x_floor":13.502487,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0496"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s06_can4_tape_fast","q_rms_mrad":60.777133,"x_floor":18.862538,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0497"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s06_can4_tape_medium","q_rms_mrad":80.820424,"x_floor":25.08309,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0498"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s06_can4_tape_slow","q_rms_mrad":157.023676,"x_floor":48.733214,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0499"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_10/runs/s01_can4_staircase","q_rms_mrad":530.152721,"x_floor":164.535989,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0500"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_13/runs/s01_can4_sine","q_rms_mrad":5.767755,"x_floor":1.790056,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0501"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_13/runs/s05_can4_tape_fast","q_rms_mrad":4.588478,"x_floor":1.424061,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0502"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_13/runs/s05_can4_tape_medium","q_rms_mrad":6.874207,"x_floor":2.13345,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0503"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous","about":"Coulomb + viscous, as identified","backend":"MuJoCo native, soft friction, no driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_13/runs/s05_can4_tape_slow","q_rms_mrad":9.230241,"x_floor":2.864659,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous","id":"r0504"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s01_can4_sine","q_rms_mrad":23.693976,"x_floor":7.353564,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0505"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s05_can4_sine","q_rms_mrad":25.147245,"x_floor":7.804594,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0506"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s06_can4_tape_fast","q_rms_mrad":32.311644,"x_floor":10.028107,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0507"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s06_can4_tape_medium","q_rms_mrad":41.960808,"x_floor":13.022782,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0508"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s06_can4_tape_slow","q_rms_mrad":51.935631,"x_floor":16.118526,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0509"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_10/runs/s01_can4_staircase","q_rms_mrad":232.723344,"x_floor":72.227047,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0510"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_13/runs/s01_can4_sine","q_rms_mrad":2.437682,"x_floor":0.756549,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0511"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_13/runs/s05_can4_tape_fast","q_rms_mrad":2.46584,"x_floor":0.765288,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0512"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_13/runs/s05_can4_tape_medium","q_rms_mrad":2.146553,"x_floor":0.666195,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0513"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_13/runs/s05_can4_tape_slow","q_rms_mrad":1.8848,"x_floor":0.584959,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0514"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s01_can4_waypoints","q_rms_mrad":6.67112,"x_floor":2.070421,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0515"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s03_can4_waypoints","q_rms_mrad":10.768019,"x_floor":3.341918,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0516"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s05_can4_waypoints","q_rms_mrad":6.946792,"x_floor":2.155977,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0517"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s07_can4_sine","q_rms_mrad":3.600252,"x_floor":1.117359,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0518"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s09_can4_waypoints","q_rms_mrad":4.415058,"x_floor":1.370239,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0519"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s11_can4_waypoints","q_rms_mrad":10.11739,"x_floor":3.139991,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0520"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s13_can4_waypoints","q_rms_mrad":5.377559,"x_floor":1.668957,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0521"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s15_can4_sine","q_rms_mrad":6.366884,"x_floor":1.976,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0522"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"pickplace","test_order":5,"run":"s17_can4_waypoints","q_rms_mrad":4.322885,"x_floor":1.341633,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0523"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"cycle","test_order":6,"run":"s19_can4_waypoints","q_rms_mrad":8.671865,"x_floor":2.691364,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0524"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"jog","test_order":7,"run":"s21_can4_waypoints","q_rms_mrad":5.811916,"x_floor":1.803762,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0525"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Dataset · Oct 24","benches":["Dataset · Oct 24"],"bench_order":1,"test":"sweep","test_order":8,"run":"s23_can4_sine","q_rms_mrad":5.967253,"x_floor":1.851972,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0526"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s01_can4_waypoints","q_rms_mrad":7.165847,"x_floor":2.223962,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0527"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s03_can4_waypoints","q_rms_mrad":7.430851,"x_floor":2.306208,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0528"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s05_can4_waypoints","q_rms_mrad":6.238658,"x_floor":1.936204,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0529"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s07_can4_waypoints","q_rms_mrad":6.271488,"x_floor":1.946393,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0530"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.r4","about":"Coulomb, sticking friction, tuned inertia, with the moteus-r4.11 driver twin","backend":"MuJoCo + plugin + moteus-r4.11 driver twin","bench":"Floor repeats · Oct 24","benches":["Floor repeats · Oct 24"],"bench_order":2,"test":"floor tape","test_order":9,"run":"s09_can4_waypoints","q_rms_mrad":5.44262,"x_floor":1.689149,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","id":"r0531"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s01_can4_sine","q_rms_mrad":23.693789,"x_floor":7.353505,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0532"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s05_can4_sine","q_rms_mrad":25.228083,"x_floor":7.829683,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0533"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s06_can4_tape_fast","q_rms_mrad":32.310527,"x_floor":10.02776,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0534"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s06_can4_tape_medium","q_rms_mrad":41.960044,"x_floor":13.022544,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0535"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s06_can4_tape_slow","q_rms_mrad":51.934907,"x_floor":16.118301,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0536"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_10/runs/s01_can4_staircase","q_rms_mrad":232.662153,"x_floor":72.208056,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0537"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_13/runs/s01_can4_sine","q_rms_mrad":2.429953,"x_floor":0.75415,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0538"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_13/runs/s05_can4_tape_fast","q_rms_mrad":2.468579,"x_floor":0.766138,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0539"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_13/runs/s05_can4_tape_medium","q_rms_mrad":2.146966,"x_floor":0.666323,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0540"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.ideal","about":"Coulomb, sticking friction, tuned inertia, ideal driver (current loop off)","backend":"MuJoCo + plugin, ideal driver","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_13/runs/s05_can4_tape_slow","q_rms_mrad":1.884833,"x_floor":0.584969,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.ideal","id":"r0541"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_08/runs/s01_can4_sine","q_rms_mrad":59.014902,"x_floor":18.315619,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0542"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_09/runs/s05_can4_sine","q_rms_mrad":60.348845,"x_floor":18.729616,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0543"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_09/runs/s06_can4_tape_fast","q_rms_mrad":95.444887,"x_floor":29.621877,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0544"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_09/runs/s06_can4_tape_medium","q_rms_mrad":135.687159,"x_floor":42.111301,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0545"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_09/runs/s06_can4_tape_slow","q_rms_mrad":289.967214,"x_floor":89.993016,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0546"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"staircase","test_order":0,"run":"session_10/runs/s01_can4_staircase","q_rms_mrad":574.051942,"x_floor":178.160369,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0547"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"sine","test_order":1,"run":"session_13/runs/s01_can4_sine","q_rms_mrad":8.328378,"x_floor":2.584761,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0548"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape fast","test_order":4,"run":"session_13/runs/s05_can4_tape_fast","q_rms_mrad":6.891151,"x_floor":2.138709,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0549"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape medium","test_order":3,"run":"session_13/runs/s05_can4_tape_medium","q_rms_mrad":8.964392,"x_floor":2.782151,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0550"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","model":"M2.coulomb_viscous","variant":"M2.coulomb_viscous.soft","about":"Coulomb, sticking friction, tuned inertia, MuJoCo's soft friction","backend":"MuJoCo + plugin + r4, soft friction","bench":"Held-out tapes · Oct 23","benches":["Held-out tapes · Oct 23"],"bench_order":0,"test":"tape slow","test_order":2,"run":"session_13/runs/s05_can4_tape_slow","q_rms_mrad":10.401053,"x_floor":3.228028,"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.soft","id":"r0551"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M0","family":"M0 · ideal","model":"M0.ideal","variant":"M0.ideal","about":"no friction, datasheet inertia","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M0.ideal","id":"r0552"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M1","family":"M1 · datasheet","model":"M1.datasheet","variant":"M1.datasheet","about":"the stated values, nothing fitted","backend":"MuJoCo native","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M1.datasheet","id":"r0553"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · dynamic friction","model":"M3.lugre","variant":"M3.lugre","about":"LuGre: a bristle state","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M3.lugre","id":"r0554"},{"kind":"run","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M5","family":"M5 · motor R, L and heat","model":"M5.dcmotor","variant":"M5.dcmotor","about":"R, L, motor constant, winding heat","backend":"MuJoCo native (dcmotor)","bench":null,"benches":[],"bench_order":null,"test":null,"test_order":null,"run":null,"q_rms_mrad":{"value":null,"why":"not run yet"},"x_floor":{"value":null,"why":"not run yet"},"floor_mrad":3.222108,"page":"../robotparts-model/index.html?variant=M5.dcmotor","id":"r0555"},{"kind":"term","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","variant":"M4.ripple.c1","model":"M4.ripple","term":"friction stiffness","term_note":"off = MuJoCo's soft friction default, which creeps (a damper below ~0.4 rad/s on this light hinge) instead of sticking","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":1.066423,"unit":"mrad","n":19,"basis":"measured","source":"budget_can14.json: the error with 'friction stiffness' off minus the full twin's, over 19 held-out runs"},"delta_runs":[1.685376,1.352377,-0.485639,1.562296,1.399513,1.540415,1.259676,0.258848,0.571342,1.066423,0.226279,0.563581,1.112984,0.232602,0.597667,1.119231,0.290729,0.607501,1.148732],"delta_x":0.985784,"floor_mrad":1.081802,"id":"t0556"},{"kind":"term","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M4.ripple.c1","model":"M4.ripple","term":"torque ripple","term_note":"the plateaus' rotor-angle map (cogging + commutation ripple), acting on the motor side","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":0.935337,"unit":"mrad","n":19,"basis":"measured","source":"budget_can14.json: the error with 'torque ripple' off minus the full twin's, over 19 held-out runs"},"delta_runs":[0.277105,0.24194,-0.447255,1.128861,1.333927,1.016169,0.555416,0.991536,1.046533,0.859186,0.935337,1.048673,0.83515,1.010512,1.124179,0.917402,0.926831,0.981194,0.82472],"delta_x":0.86461,"floor_mrad":1.081802,"id":"t0557"},{"kind":"term","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M3","family":"M3 · static friction","variant":"M4.ripple.c1","model":"M4.ripple","term":"friction weakening","term_note":"Coulomb falling with speed (the plateaus' negative viscous slope), bounded at the fastest plateau","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":0.029147,"unit":"mrad","n":19,"basis":"measured","source":"budget_can14.json: the error with 'friction weakening' off minus the full twin's, over 19 held-out runs"},"delta_runs":[0.009259,0.01415,-0.053115,0.031488,0.037812,0.025756,0.004867,0.008022,0.035925,0.033129,0.041112,0.040039,0.030691,-0.002418,0.048113,0.029147,0.027108,0.040892,0.026067],"delta_x":0.026943,"floor_mrad":1.081802,"id":"t0558"},{"kind":"term","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","variant":"M4.ripple.c1","model":"M4.ripple","term":"inertia","term_note":"off = the identified twin's axis inertia (0.000301 kg.m^2 board units, the refused regression's CI upper bound, what identified and identified+ run); the full twin's is tuned on the training runs -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":19,"basis":"measured","source":"budget_can14.json: the error with 'inertia' off minus the full twin's, over 19 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":1.081802,"id":"t0559"},{"kind":"term","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"driver","family":"driver twin (not a rung)","variant":"M4.ripple.c1","model":"M4.ripple","term":"current loop","term_note":"first-order lag firmware torque -> plant torque at servo.pid_dq_hz; off = the torque applies instantly","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":-0.029904,"unit":"mrad","n":19,"basis":"measured","source":"budget_can14.json: the error with 'current loop' off minus the full twin's, over 19 held-out runs"},"delta_runs":[0.014696,0.015574,-0.235416,-0.124401,-0.043168,0.003858,0.008361,-0.091787,-0.03784,0.012687,-0.094814,-0.041622,0.011745,-0.10967,-0.028973,0.009919,-0.104173,-0.029904,0.006414],"delta_x":-0.027643,"floor_mrad":1.081802,"id":"t0560"},{"kind":"term","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"driver","family":"driver twin (not a rung)","variant":"M4.ripple.c1","model":"M4.ripple","term":"command delay","term_note":"transport delay from a logged command to its latch; off = latched at the row time -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":19,"basis":"measured","source":"budget_can14.json: the error with 'command delay' off minus the full twin's, over 19 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":1.081802,"id":"t0561"},{"kind":"term","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M4.ripple.c1","model":"M4.ripple","term":"backlash","term_note":"the gear gap (gear_backlash passive gap hinge): off = one rigid hinge carrying all inertia and all friction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":0.011966,"unit":"mrad","n":19,"basis":"measured","source":"budget_can14.json: the error with 'backlash' off minus the full twin's, over 19 held-out runs"},"delta_runs":[0.158636,0.056949,0.329546,0.008827,0.006801,-0.002946,0.303824,-0.003804,0.01044,0.007513,0.005812,0.013024,0.016942,0.003783,0.01418,0.015795,0.000574,0.011966,0.012229],"delta_x":0.011062,"floor_mrad":1.081802,"id":"t0562"},{"kind":"term","actuator":"CAN 14 · GIM4305-10","can":14,"part":"GIM4305-10","board":"moteus-c1","rung":"driver","family":"driver twin (not a rung)","variant":"M4.ripple.c1","model":"M4.ripple","term":"torque scale","term_note":"off = no scale and every fit back in the board's torque units. On q tracking it scales out: friction, ripple, weakening and inertia were fitted in the board's torque units, so scaling the plant torque and all of them together leaves the equation of motion unchanged; it exists for absolute-torque predictions","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":-0.0,"unit":"mrad","n":19,"basis":"measured","source":"budget_can14.json: the error with 'torque scale' off minus the full twin's, over 19 held-out runs"},"delta_runs":[-1e-06,-0.0,-0.0,0.0,-0.0,-0.0,-1e-06,1e-06,-0.0,-1e-06,0.0,-0.0,-0.0,0.0,-0.0,-0.0,0.0,-0.0,-0.0],"delta_x":-0.0,"floor_mrad":1.081802,"id":"t0563"},{"kind":"term","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"friction stiffness","term_note":"off = MuJoCo's soft friction default, which creeps (a damper below ~0.4 rad/s on this light hinge) instead of sticking","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.488005,"unit":"mrad","n":5,"basis":"measured","source":"budget_can21.json: the error with 'friction stiffness' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.423431,0.553661,0.080526,0.488005,0.538164],"delta_x":0.2299,"floor_mrad":2.122687,"id":"t0564"},{"kind":"term","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"torque ripple","term_note":"the plateaus' rotor-angle map (cogging + commutation ripple), acting on the motor side -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can21.json: the error with 'torque ripple' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.122687,"id":"t0565"},{"kind":"term","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"friction weakening","term_note":"Coulomb falling with speed (the plateaus' negative viscous slope), bounded at the fastest plateau","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.151711,"unit":"mrad","n":5,"basis":"measured","source":"budget_can21.json: the error with 'friction weakening' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.151711,-0.15002,-0.236126,0.217119,0.270061],"delta_x":0.071471,"floor_mrad":2.122687,"id":"t0566"},{"kind":"term","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"inertia","term_note":"off = the identified twin's axis inertia (0.00153 kg.m^2 board units: identified axis inertia 0.001533 kg.m^2; what identified and identified+ run); the full twin's is tuned on the training runs","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.002516,"unit":"mrad","n":5,"basis":"measured","source":"budget_can21.json: the error with 'inertia' off minus the full twin's, over 5 held-out runs"},"delta_runs":[-0.110545,0.672875,-0.082181,0.037588,0.002516],"delta_x":0.001185,"floor_mrad":2.122687,"id":"t0567"},{"kind":"term","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"current loop","term_note":"first-order lag firmware torque -> plant torque at servo.pid_dq_hz; off = the torque applies instantly","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":-0.002191,"unit":"mrad","n":5,"basis":"measured","source":"budget_can21.json: the error with 'current loop' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.006218,-0.001029,-0.003754,-0.004015,-0.002191],"delta_x":-0.001032,"floor_mrad":2.122687,"id":"t0568"},{"kind":"term","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"command delay","term_note":"transport delay from a logged command to its latch; off = latched at the row time -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can21.json: the error with 'command delay' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.122687,"id":"t0569"},{"kind":"term","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"backlash","term_note":"the gear gap (gear_backlash passive gap hinge): off = one rigid hinge carrying all inertia and all friction -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can21.json: the error with 'backlash' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.122687,"id":"t0570"},{"kind":"term","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"torque scale","term_note":"off = no scale and every fit back in the board's torque units. On q tracking it scales out: friction, ripple, weakening and inertia were fitted in the board's torque units, so scaling the plant torque and all of them together leaves the equation of motion unchanged; it exists for absolute-torque predictions","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can21.json: the error with 'torque scale' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.122687,"id":"t0571"},{"kind":"term","actuator":"CAN 21 · JMC 60ASM400 direct","can":21,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"gravity","term_note":"the identified load G sin(q - bottom) on the bare hinge (twin.gravity_point_mass); off = no load. Over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":4.731099,"unit":"mrad","n":5,"basis":"measured","source":"budget_can21.json: the error with 'gravity' off minus the full twin's, over 5 held-out runs"},"delta_runs":[-1.414575,2.59706,4.731099,5.66527,5.948863],"delta_x":2.228826,"floor_mrad":2.122687,"id":"t0572"},{"kind":"term","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","variant":"M2.coulomb_viscous.c1","model":"M2.coulomb_viscous","term":"friction stiffness","term_note":"off = MuJoCo's soft friction default, which creeps (a damper below ~0.4 rad/s on this light hinge) instead of sticking","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","delta_mrad":{"value":0.135129,"unit":"mrad","n":14,"basis":"measured","source":"budget_can15.json: the error with 'friction stiffness' off minus the full twin's, over 14 held-out runs"},"delta_runs":[0.146419,0.058667,0.786955,0.123838,2.59778,1.534766,-0.014302,-0.448506,-0.211533,-0.088776,0.049318,1.055222,0.817425,0.709994],"delta_x":0.144733,"floor_mrad":0.93364,"id":"t0573"},{"kind":"term","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M2.coulomb_viscous.c1","model":"M2.coulomb_viscous","term":"torque ripple","term_note":"the plateaus' rotor-angle map (cogging + commutation ripple), acting on the motor side -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":14,"basis":"measured","source":"budget_can15.json: the error with 'torque ripple' off minus the full twin's, over 14 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":0.93364,"id":"t0574"},{"kind":"term","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M3","family":"M3 · static friction","variant":"M2.coulomb_viscous.c1","model":"M2.coulomb_viscous","term":"friction weakening","term_note":"Coulomb falling with speed (the plateaus' negative viscous slope), bounded at the fastest plateau -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":14,"basis":"measured","source":"budget_can15.json: the error with 'friction weakening' off minus the full twin's, over 14 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":0.93364,"id":"t0575"},{"kind":"term","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","variant":"M2.coulomb_viscous.c1","model":"M2.coulomb_viscous","term":"inertia","term_note":"off = the identified twin's axis inertia (0.00213 kg.m^2 board units: identified axis inertia 0.00213 kg.m^2; what identified and identified+ run); the full twin's is tuned on the training runs","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","delta_mrad":{"value":1e-06,"unit":"mrad","n":14,"basis":"measured","source":"budget_can15.json: the error with 'inertia' off minus the full twin's, over 14 held-out runs"},"delta_runs":[1e-06,0.0,1e-06,0.0,5e-06,-1.2e-05,-5.2e-05,-3.6e-05,-5e-06,-1e-06,5.8e-05,3e-05,5e-06,1e-06],"delta_x":1e-06,"floor_mrad":0.93364,"id":"t0576"},{"kind":"term","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.c1","model":"M2.coulomb_viscous","term":"current loop","term_note":"first-order lag firmware torque -> plant torque at servo.pid_dq_hz; off = the torque applies instantly","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","delta_mrad":{"value":-0.000796,"unit":"mrad","n":14,"basis":"measured","source":"budget_can15.json: the error with 'current loop' off minus the full twin's, over 14 held-out runs"},"delta_runs":[-0.001176,-0.00111,0.000735,0.000555,-0.001009,0.00438,-0.014556,-0.000743,-0.000821,-0.000245,-0.035617,-0.001797,-0.00077,-0.000298],"delta_x":-0.000852,"floor_mrad":0.93364,"id":"t0577"},{"kind":"term","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.c1","model":"M2.coulomb_viscous","term":"command delay","term_note":"transport delay from a logged command to its latch; off = latched at the row time -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":14,"basis":"measured","source":"budget_can15.json: the error with 'command delay' off minus the full twin's, over 14 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":0.93364,"id":"t0578"},{"kind":"term","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M2.coulomb_viscous.c1","model":"M2.coulomb_viscous","term":"backlash","term_note":"the gear gap (gear_backlash passive gap hinge): off = one rigid hinge carrying all inertia and all friction -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":14,"basis":"measured","source":"budget_can15.json: the error with 'backlash' off minus the full twin's, over 14 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":0.93364,"id":"t0579"},{"kind":"term","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.c1","model":"M2.coulomb_viscous","term":"torque scale","term_note":"off = no scale and every fit back in the board's torque units. On q tracking it scales out: friction, ripple, weakening and inertia were fitted in the board's torque units, so scaling the plant torque and all of them together leaves the equation of motion unchanged; it exists for absolute-torque predictions","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":14,"basis":"measured","source":"budget_can15.json: the error with 'torque scale' off minus the full twin's, over 14 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":0.93364,"id":"t0580"},{"kind":"term","actuator":"CAN 15 · small arm, 28-pole + 10:1","can":15,"part":"small arm, 28-pole + 10:1","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","variant":"M2.coulomb_viscous.c1","model":"M2.coulomb_viscous","term":"gravity","term_note":"the identified load G sin(q - bottom) on the bare hinge (twin.gravity_point_mass); off = no load. Over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.c1","delta_mrad":{"value":1.060722,"unit":"mrad","n":14,"basis":"measured","source":"budget_can15.json: the error with 'gravity' off minus the full twin's, over 14 held-out runs"},"delta_runs":[0.237657,0.285076,1.568901,1.482078,0.992297,1.303321,1.35923,0.053801,0.416474,0.464039,1.457327,1.29878,1.129146,0.974818],"delta_x":1.136114,"floor_mrad":0.93364,"id":"t0581"},{"kind":"term","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","variant":"M4.ripple.c1","model":"M4.ripple","term":"friction stiffness","term_note":"off = MuJoCo's soft friction default, which creeps (a damper below ~0.4 rad/s on this light hinge) instead of sticking","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":-0.425064,"unit":"mrad","n":5,"basis":"measured","source":"budget_can1.json: the error with 'friction stiffness' off minus the full twin's, over 5 held-out runs"},"delta_runs":[1.464083,-0.141408,-0.425064,-0.699979,-0.723248],"delta_x":-0.473966,"floor_mrad":0.896825,"id":"t0582"},{"kind":"term","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M4.ripple.c1","model":"M4.ripple","term":"torque ripple","term_note":"the plateaus' rotor-angle map (cogging + commutation ripple), acting on the motor side","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":-0.083627,"unit":"mrad","n":5,"basis":"measured","source":"budget_can1.json: the error with 'torque ripple' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.32771,0.012194,-0.083627,-0.348729,-0.540543],"delta_x":-0.093248,"floor_mrad":0.896825,"id":"t0583"},{"kind":"term","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M3","family":"M3 · static friction","variant":"M4.ripple.c1","model":"M4.ripple","term":"friction weakening","term_note":"Coulomb falling with speed (the plateaus' negative viscous slope), bounded at the fastest plateau -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can1.json: the error with 'friction weakening' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":0.896825,"id":"t0584"},{"kind":"term","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M2","family":"M2 · fitted constant friction","variant":"M4.ripple.c1","model":"M4.ripple","term":"inertia","term_note":"off = the identified twin's axis inertia (0.000596 kg.m^2 board units: identified axis inertia 0.0005961 kg.m^2; what identified and identified+ run); the full twin's is tuned on the training runs","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":-0.027812,"unit":"mrad","n":5,"basis":"measured","source":"budget_can1.json: the error with 'inertia' off minus the full twin's, over 5 held-out runs"},"delta_runs":[-0.037143,0.001324,-0.028756,-0.027812,-0.015419],"delta_x":-0.031011,"floor_mrad":0.896825,"id":"t0585"},{"kind":"term","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"driver","family":"driver twin (not a rung)","variant":"M4.ripple.c1","model":"M4.ripple","term":"current loop","term_note":"first-order lag firmware torque -> plant torque at servo.pid_dq_hz; off = the torque applies instantly","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":0.001755,"unit":"mrad","n":5,"basis":"measured","source":"budget_can1.json: the error with 'current loop' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.001755,-0.009478,0.00136,0.01257,0.008786],"delta_x":0.001957,"floor_mrad":0.896825,"id":"t0586"},{"kind":"term","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"driver","family":"driver twin (not a rung)","variant":"M4.ripple.c1","model":"M4.ripple","term":"command delay","term_note":"transport delay from a logged command to its latch; off = latched at the row time -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can1.json: the error with 'command delay' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":0.896825,"id":"t0587"},{"kind":"term","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M4.ripple.c1","model":"M4.ripple","term":"backlash","term_note":"the gear gap (gear_backlash passive gap hinge): off = one rigid hinge carrying all inertia and all friction -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can1.json: the error with 'backlash' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":0.896825,"id":"t0588"},{"kind":"term","actuator":"CAN 1 · GIM4305-10","can":1,"part":"GIM4305-10","board":"moteus-c1","rung":"driver","family":"driver twin (not a rung)","variant":"M4.ripple.c1","model":"M4.ripple","term":"torque scale","term_note":"off = no scale and every fit back in the board's torque units. On q tracking it scales out: friction, ripple, weakening and inertia were fitted in the board's torque units, so scaling the plant torque and all of them together leaves the equation of motion unchanged; it exists for absolute-torque predictions","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M4.ripple.c1","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can1.json: the error with 'torque scale' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":0.896825,"id":"t0589"},{"kind":"term","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"friction stiffness","term_note":"off = MuJoCo's soft friction default, which creeps (a damper below ~0.4 rad/s on this light hinge) instead of sticking","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":16.968335,"unit":"mrad","n":5,"basis":"measured","source":"budget_can13.json: the error with 'friction stiffness' off minus the full twin's, over 5 held-out runs"},"delta_runs":[12.427092,16.968335,21.117708,26.564489,14.435019],"delta_x":5.871616,"floor_mrad":2.889892,"id":"t0590"},{"kind":"term","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"torque ripple","term_note":"the plateaus' rotor-angle map (cogging + commutation ripple), acting on the motor side -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can13.json: the error with 'torque ripple' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.889892,"id":"t0591"},{"kind":"term","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"friction weakening","term_note":"Coulomb falling with speed (the plateaus' negative viscous slope), bounded at the fastest plateau -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can13.json: the error with 'friction weakening' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.889892,"id":"t0592"},{"kind":"term","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"inertia","term_note":"off = the identified twin's axis inertia (0.00316 kg.m^2 board units: PRIOR, not identified: 0.00316 kg.m^2 (range 0.00247-0.00342) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the tag hub's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs); what identified and identified+ run); the full twin's is tuned on the training runs","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":-0.006221,"unit":"mrad","n":5,"basis":"measured","source":"budget_can13.json: the error with 'inertia' off minus the full twin's, over 5 held-out runs"},"delta_runs":[-0.018156,-0.01859,-0.006221,0.002961,0.010487],"delta_x":-0.002153,"floor_mrad":2.889892,"id":"t0593"},{"kind":"term","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"current loop","term_note":"first-order lag firmware torque -> plant torque at servo.pid_dq_hz; off = the torque applies instantly","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":-8.9e-05,"unit":"mrad","n":5,"basis":"measured","source":"budget_can13.json: the error with 'current loop' off minus the full twin's, over 5 held-out runs"},"delta_runs":[-0.000832,0.004548,0.001355,-8.9e-05,-0.001846],"delta_x":-3.1e-05,"floor_mrad":2.889892,"id":"t0594"},{"kind":"term","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"command delay","term_note":"transport delay from a logged command to its latch; off = latched at the row time","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":-0.081713,"unit":"mrad","n":5,"basis":"measured","source":"budget_can13.json: the error with 'command delay' off minus the full twin's, over 5 held-out runs"},"delta_runs":[-0.05156,-0.104756,-0.12254,-0.081713,-4.7e-05],"delta_x":-0.028275,"floor_mrad":2.889892,"id":"t0595"},{"kind":"term","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"backlash","term_note":"the gear gap (gear_backlash passive gap hinge): off = one rigid hinge carrying all inertia and all friction -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can13.json: the error with 'backlash' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.889892,"id":"t0596"},{"kind":"term","actuator":"CAN 13 · JMC 60ASM200 + 10:1","can":13,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"torque scale","term_note":"off = no scale and every fit back in the board's torque units. On q tracking it scales out: friction, ripple, weakening and inertia were fitted in the board's torque units, so scaling the plant torque and all of them together leaves the equation of motion unchanged; it exists for absolute-torque predictions","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can13.json: the error with 'torque scale' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.889892,"id":"t0597"},{"kind":"term","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"friction stiffness","term_note":"off = MuJoCo's soft friction default, which creeps (a damper below ~0.4 rad/s on this light hinge) instead of sticking","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":18.646509,"unit":"mrad","n":4,"basis":"measured","source":"budget_can12.json: the error with 'friction stiffness' off minus the full twin's, over 4 held-out runs"},"delta_runs":[7.649863,13.347459,23.94556,28.34084],"delta_x":6.373642,"floor_mrad":2.925566,"id":"t0598"},{"kind":"term","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"torque ripple","term_note":"the plateaus' rotor-angle map (cogging + commutation ripple), acting on the motor side -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":4,"basis":"measured","source":"budget_can12.json: the error with 'torque ripple' off minus the full twin's, over 4 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.925566,"id":"t0599"},{"kind":"term","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"friction weakening","term_note":"Coulomb falling with speed (the plateaus' negative viscous slope), bounded at the fastest plateau","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":6.019572,"unit":"mrad","n":4,"basis":"measured","source":"budget_can12.json: the error with 'friction weakening' off minus the full twin's, over 4 held-out runs"},"delta_runs":[1.409028,5.822359,8.559945,6.216785],"delta_x":2.057575,"floor_mrad":2.925566,"id":"t0600"},{"kind":"term","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"inertia","term_note":"off = the identified twin's axis inertia (0.00316 kg.m^2 board units: PRIOR, not identified: 0.00316 kg.m^2 (range 0.00247-0.00342) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the tag hub's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs); what identified and identified+ run); the full twin's is tuned on the training runs","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.001598,"unit":"mrad","n":4,"basis":"measured","source":"budget_can12.json: the error with 'inertia' off minus the full twin's, over 4 held-out runs"},"delta_runs":[-0.013574,-0.020223,0.016771,3.03456],"delta_x":0.000546,"floor_mrad":2.925566,"id":"t0601"},{"kind":"term","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"current loop","term_note":"first-order lag firmware torque -> plant torque at servo.pid_dq_hz; off = the torque applies instantly","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.007169,"unit":"mrad","n":4,"basis":"measured","source":"budget_can12.json: the error with 'current loop' off minus the full twin's, over 4 held-out runs"},"delta_runs":[-0.030927,-0.054967,0.045264,3.075808],"delta_x":0.00245,"floor_mrad":2.925566,"id":"t0602"},{"kind":"term","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"command delay","term_note":"transport delay from a logged command to its latch; off = latched at the row time -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":4,"basis":"measured","source":"budget_can12.json: the error with 'command delay' off minus the full twin's, over 4 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.925566,"id":"t0603"},{"kind":"term","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"backlash","term_note":"the gear gap (gear_backlash passive gap hinge): off = one rigid hinge carrying all inertia and all friction -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":4,"basis":"measured","source":"budget_can12.json: the error with 'backlash' off minus the full twin's, over 4 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.925566,"id":"t0604"},{"kind":"term","actuator":"CAN 12 · JMC 60ASM200 + 10:1","can":12,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M3.stribeck.r4","model":"M3.stribeck","term":"torque scale","term_note":"off = no scale and every fit back in the board's torque units. On q tracking it scales out: friction, ripple, weakening and inertia were fitted in the board's torque units, so scaling the plant torque and all of them together leaves the equation of motion unchanged; it exists for absolute-torque predictions","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M3.stribeck.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":4,"basis":"measured","source":"budget_can12.json: the error with 'torque scale' off minus the full twin's, over 4 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.925566,"id":"t0605"},{"kind":"term","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"friction stiffness","term_note":"off = MuJoCo's soft friction default, which creeps (a damper below ~0.4 rad/s on this light hinge) instead of sticking","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":-0.339809,"unit":"mrad","n":5,"basis":"measured","source":"budget_can11.json: the error with 'friction stiffness' off minus the full twin's, over 5 held-out runs"},"delta_runs":[-0.339809,0.296402,-0.135134,-1.144527,-0.801867],"delta_x":-0.167163,"floor_mrad":2.032795,"id":"t0606"},{"kind":"term","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"torque ripple","term_note":"the plateaus' rotor-angle map (cogging + commutation ripple), acting on the motor side -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can11.json: the error with 'torque ripple' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.032795,"id":"t0607"},{"kind":"term","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"friction weakening","term_note":"Coulomb falling with speed (the plateaus' negative viscous slope), bounded at the fastest plateau -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can11.json: the error with 'friction weakening' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.032795,"id":"t0608"},{"kind":"term","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"inertia","term_note":"off = the identified twin's axis inertia (0.0131 kg.m^2 board units: PRIOR, not identified: 0.01313 kg.m^2 (range 0.00347-0.103) declared in the deployment record (datasheet rotor x N^2 + the 60 mm 10:1 planetary's input-side band x N^2 + the unweighed link (log-centre of its bound); bam_rack_twin uses it only when the torque regression gives no usable inertia (no chirp moved this joint on 2026-10-23)); the regression refused (no chirp among the training runs); what identified and identified+ run); the full twin's is tuned on the training runs","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.297293,"unit":"mrad","n":5,"basis":"measured","source":"budget_can11.json: the error with 'inertia' off minus the full twin's, over 5 held-out runs"},"delta_runs":[2.723617,1.047453,0.153211,0.033298,0.297293],"delta_x":0.146249,"floor_mrad":2.032795,"id":"t0609"},{"kind":"term","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"current loop","term_note":"first-order lag firmware torque -> plant torque at servo.pid_dq_hz; off = the torque applies instantly","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":-0.004945,"unit":"mrad","n":5,"basis":"measured","source":"budget_can11.json: the error with 'current loop' off minus the full twin's, over 5 held-out runs"},"delta_runs":[-0.011894,-0.021054,-0.004945,-0.003888,0.003731],"delta_x":-0.002432,"floor_mrad":2.032795,"id":"t0610"},{"kind":"term","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"command delay","term_note":"transport delay from a logged command to its latch; off = latched at the row time -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can11.json: the error with 'command delay' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.032795,"id":"t0611"},{"kind":"term","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"backlash","term_note":"the gear gap (gear_backlash passive gap hinge): off = one rigid hinge carrying all inertia and all friction -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can11.json: the error with 'backlash' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.032795,"id":"t0612"},{"kind":"term","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"torque scale","term_note":"off = no scale and every fit back in the board's torque units. On q tracking it scales out: friction, ripple, weakening and inertia were fitted in the board's torque units, so scaling the plant torque and all of them together leaves the equation of motion unchanged; it exists for absolute-torque predictions","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":5,"basis":"measured","source":"budget_can11.json: the error with 'torque scale' off minus the full twin's, over 5 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":2.032795,"id":"t0613"},{"kind":"term","actuator":"CAN 11 · JMC 60ASM200 + 10:1","can":11,"part":"JMC 60ASM200 + 10:1","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"gravity","term_note":"the identified load G sin(q - bottom) on the bare hinge (twin.gravity_point_mass); off = no load. Over the swept +-0.2 rad a pendulum and a torsion spring of G N.m/rad are the same torque","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":22.197031,"unit":"mrad","n":5,"basis":"measured","source":"budget_can11.json: the error with 'gravity' off minus the full twin's, over 5 held-out runs"},"delta_runs":[13.134517,22.197031,23.360866,26.798207,17.743861],"delta_x":10.919465,"floor_mrad":2.032795,"id":"t0614"},{"kind":"term","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"friction stiffness","term_note":"off = MuJoCo's soft friction default, which creeps (a damper below ~0.4 rad/s on this light hinge) instead of sticking","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":35.261263,"unit":"mrad","n":10,"basis":"measured","source":"budget_can4.json: the error with 'friction stiffness' off minus the full twin's, over 10 held-out runs"},"delta_runs":[35.320926,35.2016,63.133243,93.726351,238.031583,341.328598,5.890696,4.425311,6.817839,8.516253],"delta_x":10.943539,"floor_mrad":3.222108,"id":"t0615"},{"kind":"term","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"torque ripple","term_note":"the plateaus' rotor-angle map (cogging + commutation ripple), acting on the motor side -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":10,"basis":"measured","source":"budget_can4.json: the error with 'torque ripple' off minus the full twin's, over 10 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":3.222108,"id":"t0616"},{"kind":"term","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M3","family":"M3 · static friction","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"friction weakening","term_note":"Coulomb falling with speed (the plateaus' negative viscous slope), bounded at the fastest plateau -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":10,"basis":"measured","source":"budget_can4.json: the error with 'friction weakening' off minus the full twin's, over 10 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":3.222108,"id":"t0617"},{"kind":"term","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M2","family":"M2 · fitted constant friction","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"inertia","term_note":"off = the identified twin's axis inertia (6e-05 kg.m^2 board units: PRIOR, not identified: 6e-05 kg.m^2 (range 2.77e-05-0.000149) declared in the deployment record (datasheet rotor (N = 1, direct drive) + the motor-face disc's bound; bam_rack_twin uses it only when the torque regression gives no usable inertia (2026-10-23: its chirps read a negative inertia, friction-dominated)); the regression refused (ill-posed: non-physical inertia -0.000297; torque delay on the +-25 ms bound for ['session_09/runs/s04_can4_chirp']; filter windows (13, 21, 31) move it by 0.00025, more than 25% of it); what identified and identified+ run); the full twin's is tuned on the training runs","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.089943,"unit":"mrad","n":10,"basis":"measured","source":"budget_can4.json: the error with 'inertia' off minus the full twin's, over 10 held-out runs"},"delta_runs":[-0.020847,2.953296,0.993538,0.329198,0.11233,-1.041811,0.009485,0.105634,0.074251,0.06053],"delta_x":0.027914,"floor_mrad":3.222108,"id":"t0618"},{"kind":"term","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"current loop","term_note":"first-order lag firmware torque -> plant torque at servo.pid_dq_hz; off = the torque applies instantly","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":-0.000455,"unit":"mrad","n":10,"basis":"measured","source":"budget_can4.json: the error with 'current loop' off minus the full twin's, over 10 held-out runs"},"delta_runs":[-0.000187,0.080838,-0.001117,-0.000765,-0.000724,-0.061191,-0.007729,0.002739,0.000413,3.2e-05],"delta_x":-0.000141,"floor_mrad":3.222108,"id":"t0619"},{"kind":"term","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"command delay","term_note":"transport delay from a logged command to its latch; off = latched at the row time -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":10,"basis":"measured","source":"budget_can4.json: the error with 'command delay' off minus the full twin's, over 10 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":3.222108,"id":"t0620"},{"kind":"term","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"M4","family":"M4 · grey-box drivetrain","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"backlash","term_note":"the gear gap (gear_backlash passive gap hinge): off = one rigid hinge carrying all inertia and all friction -- the full twin already runs the off value (measured or tuned as such), so this term is 0 by construction","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":10,"basis":"measured","source":"budget_can4.json: the error with 'backlash' off minus the full twin's, over 10 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":3.222108,"id":"t0621"},{"kind":"term","actuator":"CAN 4 · JMC 60ASM400 direct","can":4,"part":"JMC 60ASM400 direct","board":"moteus-r4.11","rung":"driver","family":"driver twin (not a rung)","variant":"M2.coulomb_viscous.r4","model":"M2.coulomb_viscous","term":"torque scale","term_note":"off = no scale and every fit back in the board's torque units. On q tracking it scales out: friction, ripple, weakening and inertia were fitted in the board's torque units, so scaling the plant torque and all of them together leaves the equation of motion unchanged; it exists for absolute-torque predictions","benches":["Held-out tapes · Oct 23"],"page":"../robotparts-model/index.html?variant=M2.coulomb_viscous.r4","delta_mrad":{"value":0.0,"unit":"mrad","n":10,"basis":"measured","source":"budget_can4.json: the error with 'torque scale' off minus the full twin's, over 10 held-out runs"},"delta_runs":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"delta_x":0.0,"floor_mrad":3.222108,"id":"t0622"}]}
