| 1.0 | How stiff the left arm is, from 0 (soft, hand-guidable) to 1 (the tuned gains). Lower values only add compliance — the arm tracks a little less tightly but yields more to obstacles. One number applies to every joint; a 7-element list sets each joint in the order shoulder_1, shoulder_2, shoulder_3, elbow, wrist_1, wrist_2, wrist_3. | | |
| 1.0 | Same, for the right arm. | | |
| true | Set false on the gripperless model. The gripper motors are never enabled and datasets record 7 channels per arm instead of 8. | | |
| parallel | Which gripper is fitted: parallel (the stock two-finger gripper) or parcel (the hinged-plate parcel gripper). Sets which way each jaw closes for the bring-up calibration, which refuses a gripper whose measured stroke is the other type’s. Box mode exists only with parcel. | | |
| 0.5 | Largest joint move (rad) allowed between two consecutive commands. Bigger moves are dropped with a warning. inf disables. | | |
| impedance | Which control law the realtime core runs the arms on. impedance is the production MIT frame at 240 Hz: host gravity / friction / inertia feed-forward and host damping around the firmware PD, compliant. position hands every joint to its motor’s own position loop at 400 Hz — 0xA4 on the MyActuator joints, position-velocity on the Damiao wrists, the firmware.* gains below (written to ROM at enable) — where the position loop’s target staircase (audible at 200 Hz) is gone. It is stiff: no compliance, no host feed-forward, and the contact watchdog is blind on the MyActuator joints (their torque telemetry reads NaN). At 400 Hz the bus cannot carry every motor every tick, so the core thins its schedule: every MyActuator command still goes out every tick, the two wrists are commanded on alternate ticks (200 Hz each), and one 0.01° a4 position read per tick rotates through the a4 joints and the gripper (~67 Hz each; between reads a joint’s position is carried on the speed its command echo reports every tick). The choice is baked into each joint’s wire_mode when the robot is constructed; under impedance a per-joint wire_mode set explicitly is kept. Impedance joints are commanded at 240 Hz only: an arm that mixes them with firmware-loop joints (a per-joint wire_mode a4 under impedance, or tune.motion --a4) runs its core at 480 Hz, the firmware-loop joints every tick and each impedance joint on alternate ticks — exactly 240 Hz, with its host feed-forward and damping stepped at that rate — and any other rate with an impedance joint on the arm is refused. Recorded-motion replays take --controller (tune.motion); teleop takes --axol.controller position. | | |
| 240.0 | Command rate of the MyActuator impedance joints: 240.0 (the verified rate) or 480.0 — every tick of a 480 Hz core loop, their host feed-forward, damping and tracker stepped at 480, while the Damiao wrists stay at 240 Hz on alternate ticks (the gripper and any a4 position reads take one tick in eight). An experiment, never the default: the impedance gains, host damping and feed-forward were tuned at 240. With it set, any arm with an impedance joint runs its core at 480 Hz only. tune.motion --impedance-hz 480 sets it for a run. | | |
| 0.5 | Grip force — peak gripper torque (Nm). | | |
| 10.0 | Maximum gripper speed (rad/s). | | |
| per joint | Position stiffness of one joint, in [0, 500]. This is the stiffness-1 value. | | |
| per joint | Velocity damping in the motor firmware, in [0, 5]. | | |
| per joint | Extra damping (Nm·s/rad) applied by the host, for the slow shoulder resonance the firmware can’t damp. Scaled down automatically in poses where the joint carries less inertia. 0 on joints whose firmware damping is enough. | | |
| null | Centre frequency (Hz) of the band the host damping acts in. null tracks the arm’s pose automatically. | | |
| null | Width of that band (bandwidth = centre ÷ q). null uses 0.8. | | |
| per joint | Effective inertia (kg·m²) used for acceleration feed-forward. | | |
| 0.0 | Error-sign Coulomb compensation as a fraction of friction.fc: pushes up to gain × fc toward the target while the joint is stuck and the velocity feed-forward is off, fading out once the joint slides. The lever for slow-motion stick-slip stairs on the high-ratio X8 shoulders; keep it below the breakaway/fc ratio tune.breakaway measures. 0 is the production law. | | |
| 0.0 | Load-proportional part of that push, in Nm per Nm of the joint’s gravity feed-forward (peak push = `stiction_gain × fc + stiction_load_gain × | gravity | `). Gear friction follows the transmitted torque — right shoulder_1 breaks away at 0.66 Nm at rest but at 2–3 Nm with the arm extended — so a constant push either hunts at rest or does nothing under load. |
| 0.1 | Position error (degrees) at which that term saturates. The push fades on measured velocity (gone above ~0.05 rad/s), so it never drives the slip. | | |
| 0.0 | Peak amplitude (Nm) of a sinusoidal torque dither on the feed-forward, 0 off. Keeps a geared joint’s meshes sliding so its velocity-weakening friction (the X8-P20 shoulders: 2.1 Nm sliding at 0.05 rad/s, 0.7 Nm at 0.2 rad/s) cannot re-stick between cycles. Start at 1–2 Nm on a shoulder; it is audible. | | |
| 60.0 | Dither frequency: above the arm’s structural modes (~35 Hz), below the core’s 120 Hz Nyquist. | | |
| 0.0 | Friction cancellation on measured velocity, as a fraction of the measured static-minus-sliding excess: `gain × (stribeck_dfs + stribeck_load_gain × | gravity | ) × exp(−(v/stribeck_vs)²) × tanh(v/0.02)`. The one feed-forward that acts on the velocity-weakening slope behind the X8 shoulders’ 2 Hz stick-slip (a command-driven term cannot). Zero at rest. Sweep 0.5 → 0.9 and stop when the arm’s 3 Hz mode grows. |
| 0.3 | Static-minus-sliding friction excess (Nm) at zero gravity load. | | |
| 0.1 | Growth of that excess per Nm of gravity feed-forward (right shoulder_1: ~1.5 Nm under 12 Nm). | | |
| 0.1 | Speed (rad/s) at which the excess has fallen to 1/e. | | |
| 20.0 | Low-pass pole (rad/s) of the measured velocity the term follows. 20 is smooth but ~40° behind a 2.6 Hz surge; 40–80 follows it at the cost of encoder-step noise in the torque. | | |
| mit | Frame the realtime core commands the joint with while tracking. mit is the impedance frame (production). a4 hands a MyActuator joint to the firmware’s own position loop (0xA4, speed-capped at the tracker limit) with a paired 0x92 read for 0.01° position — the candidate for creeping through X8-P20 stick-slip. The joint is on 0xA4 from its first frame, holds included: the X6-P20’s 2025-07 firmware ignores 0xA4 after an MIT frame until the motor is reset (the 2026 X8-P20 firmware switches freely). pv is the same for a Damiao wrist: its position-velocity mode (0x100+ID; the core sets control-mode register 2 at bring-up and switches it back to MIT for limp / gravity comp), gains in the KP_APR/KP_ASR registers, ramps in ACC/DEC. Costs of either: no compliance, no host feed-forward, and on a4 NaN torque telemetry (the contact watchdog is blind on that joint; a pv wrist keeps its torque channel). The gripper, gravity comp and the limp fallback always use MIT — so on the older firmware an a4 joint that has been hand-guided needs a re-enable before it tracks again. An a4 joint’s stored planner acceleration must be 0 or 60000 (see tune.a4); loop gains come from firmware.* below. controller position (above) sets every joint’s position wire mode at once; this field is the per-joint override. | | |
| per joint | Mass (kg) of the link, used for gravity compensation. Tune if an arm sags or pushes back in gravity comp. | | |
| per joint | Centre of mass [x, y, z] (m) of the link. | | |
| per motor | Coulomb friction (Nm). Measured per motor with tune.friction. | | |
| per motor | Friction curve sharpness. | | |
| per motor | Viscous friction (Nm·s/rad). | | |
| per motor | Constant torque offset (Nm). | | |
| 0.0 | Load-proportional Coulomb friction, Nm per Nm of gravity feed-forward: the effective fc is `fc + fl × | gravity | . Planetary gear friction grows with the torque it carries (right shoulder_1: ~0.6 Nm sliding at rest, ~1.5 Nm under 12 Nm), so a constant fcover-compensates at rest and under-compensates at reach.0` keeps the constant model. |
| null | Firmware position-loop proportional gain (MyActuator 0x30 index 0x07, Damiao register KP_APR), written to the motor’s ROM at enable when set (null leaves the motor’s stored value). Every joint defaults to null on every firmware.* field: the arms run impedance, where these loops are inert, so bring-up leaves the motors’ own loops as shipped. These five gains are the motor’s own position PI → speed PI controller and only act under wire_mode a4; identify them with tune.a4. Stock 0.008 on the X8-P20 shoulders stick-slips at creep speed; the stairs are gone by 0.2 and, with the 400 Hz stream the core runs, tracking keeps improving to 1.0 (0.17° / 12 ms at 12 deg/s) with 1.4 still clean. | | |
| null | Firmware position-loop integral gain. Leave at the stock 0: on top of the speed integrator it hunts around the target. | | |
| null | Firmware position-loop derivative gain (protocol V4.2+). The motor stores it, but the 0xA4 loop on the X8-P20 measured inert to it. | | |
| null | Firmware speed-loop proportional gain. Not a damper in practice — it did nothing for the loop’s 5 Hz reversal mode — but the knob on the speed loop’s own resonance (~100 Hz on the X8-P20, ~135 Hz on the X6-P20): the current tone grows with it until the loop goes unstable (0.2 on the shoulder, 0.1 at position_kp 1.5 on the elbow). Lower is quieter at no tracking cost. | | |
| null | Damiao wrists only: the position-velocity profiler’s ramp (rad/s²), written to ACC and, negated, DEC at enable. Every streamed target is approached along a trapezoid under this acceleration, so it caps how fast the wrist follows: the stock 2 (115 deg/s²) cannot keep up with the 200 Hz stream — the loop hunts at ~5 Hz — and would take half a second to reach teleop speed. 50 sits above the core tracker’s 33 rad/s² limit while still rounding each 5 ms step; 50 and 200 scored alike in tune.a4. | | |
| null | Firmware speed-loop integral gain. Lower than the stock 1e-4 is smoother on a geared joint: the integrator winds up while the joint is stuck and dumps it at release. | | |
| null | MyActuator only: the 0xA4 position planner’s acceleration and deceleration (dps/s), written at enable to a joint on wire_mode a4. Only 0 (direct PI tracking of each target) and 60000 (the planner finishing each step within the tick) follow a stream; anything between re-plans every target and the joint barely moves, and is refused. On the X6-P20 elbow tune.a4 tracked a 3 deg/s triangle to 0.02° RMS with 4 ms lag at 60000, against 0.23° / 74 ms direct. 60000 wants cap_track. | | |
| null | 0xA4 joints with the planner on: each tick’s speed cap as this multiple of the commanded speed (floor 1 dps, ceiling the tracker limit) instead of the fixed tracker limit — at a fixed cap the planner bursts through each step and idles the rest of the tick (4× the current spread on the elbow); 1.1–1.2 moved it continuously. Leave unset under direct tracking, where the cap is a hard limit on the PI output. Carried to the realtime core, not written to the motor. | | |
| null | MyActuator a4 joints: the motor’s rated current (A — datasheet, or tune.a4 --tf-probe). Set, the realtime core sends the joint’s position command as 0x73 (protocol V4.4 position control with torque feed-forward) carrying gravity and inertia, scaled by the joint’s torque constant into the firmware’s int8 1%-of-rated-current unit and faded in over a second. Only on firmware that implements 0x73 (VersionDate 2026042402 or later — the X8-P20 shoulders, not the X6-P20 elbow’s 2025070202; elsewhere the joint stays on plain 0xA4 and the core logs why), and only in direct tracking (planner_accel 0). Not written to the motor. | | |
| null | This joint’s impedance command rate: 480.0 commands it every tick of a 480 Hz core loop (its host feed-forward, damping and tracker stepped at 480), 240.0 keeps it on the verified 240 Hz lane, null follows impedance_hz above. Any joint at 480 runs the core at 480 Hz, the other impedance joints on alternate ticks. tune.motion --fast-impedance right.shoulder_1 sets it for a run. | | |