Model reporta1-dreamwaq2026-08-20

Twelve motors, thirty-six numbers, and a sign error only an idle log could find

A first-order thermal model per joint, fitted to this A1 rather than borrowed. It predicts the temperature the robot actually reports to within 0.39 °C on a sensor that resolves whole degrees — and the second log, 784 seconds of the robot doing nothing, is what makes it right.

01

The model

One lumped node per motor. Three parameters each.

dT_j/dt = −a_j · (T_j − T_env,j) + b_j · τ_j²
symbolmeaningunits
a_jinverse thermal time constant, 1/(R·C)1/s
b_johmic gain, k/C — τ² stands in for I²·R_dK/(s·(N·m)²)
T_env,jidle equilibrium — where this joint settles doing nothing°C

τ² substitutes for I² because motor torque is very nearly proportional to current. That is the same substitution arXiv 2603.01631 makes, and our own hardware agrees: against the temperature each joint actually recorded, τ² correlates at r = +0.990 on the calves, while |τ·ω| — the quantity the locomotion reward actually penalises — correlates at r = −0.954.

T_env is not ambient air. A pure I²R model says a motor at zero torque decays to air temperature. The idle log shows every joint slowly warming, because the driver boards dissipate with the motor energised and nothing commanded. Fold that quiescent term q in and −a(T − T_air) + q + b·τ² is identical to −a(T − T_env) + b·τ² with T_env := T_air + q/a. The form never changed; only the interpretation did. T_env is the idle equilibrium of a powered, stationary robot, and it measures 35–42 °C — hips hottest, since they sit against the body.
02

How it was fitted

Two logs, jointly. Neither one is enough alone.

logwhat it iswhat it constrains
run0050818 s walking outdoors, calves 37 → 67 °Cb, and a through curvature
run0047784 s at phase 0, rms |τ| = 0.05 N·mT_env

run0050 never goes quiet, so it cannot see where an idle robot settles. Fitted on its own it put T_env at a single 36.29 °C and then got the idle regime wrong in sign — predicting cooling where the robot warms. run0047 has no torque, so it says nothing about b. Together they are well posed.

By shooting, not by finite differences

The SDK reports temperature as an integer, so a 1 °C quantum across a 0.02 s step is a 50 °C/s derivative — differentiating the signal produces noise, not data. Instead the model is forward-integrated through the entire torque trace and the trajectory residual is minimised, multi-start over decades of a and b so a local optimum cannot pass for the answer.

One instinct worth naming and discarding: that an active session is a poor place to fit a thermal model. It is the opposite. A varying load is persistent excitation, and it is precisely what separates the input-driven term from the decay term. Section 04 shows it works.

03

How good it is

Sensor resolution is 1 °C. RMSE is at or below the quantum on every joint, on both logs.

Two panels. Left: run0050, 818 s of walking, measured temperature curves for hips, thighs and calves with the fitted model overlaid; calves climb from 37 to 62 degrees. Right: run0047, 784 s idle, plotted as change from the start; all three groups warm by 1 to 1.8 degrees while the walking-only fit predicts cooling.
Left, the walking log that pins b. Right, the idle log that pins T_env, plotted as change from the start because the whole point is a sign: with no torque the motors warm, and the dotted walking-only fit can only decay. Regenerate with ./python.sh tools/plot_thermal_fit.py.
jointRMSE walkvs 1 °C quantumRMSE idle a [1/s]time const.bT_env
FL_hip0.270.281.83e−39.1 min2.15e−341.7
FR_hip0.340.361.96e−38.5 min2.74e−341.2
RL_hip0.240.226.46e−425.8 min9.68e−438.3
RR_hip0.330.212.12e−37.9 min1.92e−337.4
FL_thigh0.330.261.86e−39.0 min2.07e−337.4
FR_thigh0.290.281.21e−313.8 min1.70e−339.6
RL_thigh0.330.261.46e−311.4 min1.80e−336.5
RR_thigh0.330.261.35e−312.4 min1.73e−337.2
FL_calf0.420.173.12e−35.3 min1.61e−337.3
FR_calf0.480.312.94e−35.7 min1.52e−336.6
RL_calf0.610.332.78e−36.0 min1.45e−336.6
RR_calf0.690.342.96e−35.6 min1.43e−335.5

The vertical rule at the end of each bar is the sensor's own 1 °C quantum. Mean 0.39 °C walking, 0.27 °C idle, across a signal that moves 30 °C. The calves are the worst-fitted and are also the ones that matter — 0.69 °C on a 30 °C excursion is 2.3%.

04

Is a real?

The obvious worry with a curve that never plateaus.

If the heating curve never levels off, does a trade off freely against b? Tested directly — force a away from its optimum, refit b freely, measure the damage:

jointfitted aRMSE ×0.25×0.5×2×4×10
FL_calf3.16e−30.421.190.811.021.993.35
RL_calf2.82e−30.601.501.051.332.674.69

A factor of two is clearly distinguishable; a factor of ten is excluded outright. The calves' cooling rate is real information in this data, not an artefact of the parameterisation — and that is what lets section 05 rule something out rather than merely disagree with it.

The hips are not identified this way. They barely heat, so there is no curvature to fit, and RL_hip's 25.8-minute time constant should be read as "unconstrained" rather than measured. Harmless: the calves are the binding constraint, and the hips' steady state (b/a), which is what every projection uses, is well determined even where a alone is not.

05

Against the paper

Theirs is the richer model. Ours is the right one for this signal.

arXiv 2603.01631 uses a 14-node coupled whole-body network — a node per motor plus the onboard computer, with conduction resistances between neighbours, parameterised from Lin et al., ROBOT 2025. As physics that is a better model than twelve independent first-order nodes, and nothing here claims otherwise.

The claim is narrower: ours is right for this robot and this signal, on three counts.

  1. It is fitted to the number the robot actually reports. At deploy we feed motorState.temperature straight into the policy observation. Their parameters describe their model's nodes; ours describe the sensor we deploy against. Training on one node and feeding another at runtime is a sim-to-real mismatch on the single input the whole method rests on.
  2. Their constants are excluded by our data, for our node. Their γ_T = 0.35 is derived from their thermal model. Run the derivation backwards and it implies a thermal time constant of 17–37 s. We measure 5–6 minutes, and section 04 excludes a factor of ten at 3.3–4.7 °C RMSE against a 1 °C sensor. The likely reconciliation: they model a winding node — small thermal mass, genuinely fast — while the A1 reports a board or housing sensor. Corroborating, their threshold is 60 °C and ours trips at 66–67.
  3. It knows something theirs assumes away. T_env here is measured, per joint, and it is 35–42 °C: a powered A1 standing still does not cool to air temperature. Their randomisation treats environment temperature as free over [0, 35] °C — for our machine, below the whole range it actually occupies.
06

What it cannot do

Four limits, one of them with a free fix.

  1. Forced convection is baked into a. run0050 is a walking robot; a stationary one cools more slowly than these constants say. run0047 cannot separate the two because it never gets hot enough to show a decay. The missing measurement is a hot cooldown: run the robot warm, then leave it powered and sitting while the log keeps writing. That sends no motor commands at all, so it is read-only under the standing robot rule.
  2. Per-joint independence is least valid exactly where the reward operates. The simulation draws each joint's initial temperature separately over [25, 70] °C, so it routinely presents one calf at 68 °C with its neighbour at 30 — a 38 °C gradient between adjacent joints that neither log contains, and which this model assumes drives zero heat flow. The rule a policy learns from it ("unload the hot joint") stays right; what is calibrated on impossible states is the magnitude of the incentive. This is the one place the paper's coupled model is straightforwardly better.
  3. Two logs, one robot, one era, no held-out third. A later outdoor run also recorded temperature and is still on the robot; predicting it with no refitting would be a genuine out-of-sample test.
  4. Steady-state projections are optimistic. Fed run0050's own average τ², the "minutes to 66 °C" projection reports never trips for a run whose rear calves did trip — a run average folds in every easy stretch, and what cooks a motor is the hard part. Those numbers are a comparison instrument between arms measured the same way, not a wall-clock prediction.