G1 Dex1 · IKEA table assembly · 260819 + 260823–25

What the joint torque actually shows when the leg goes in

Play the clip and watch the trace. The question is whether measured torque can tell you the leg is seated — before the operator decides it is and opens the hand. The first pass said barely. Three later sessions say otherwise, and the split is the finding.

insert segments, all browsable episodes / frames 30 Hz samplingtorque = tau_est from rt/lowstate
What the new recordings changed

The first pass had the 53 clean insert segments of 260819 and ended at AUC 0.654 — a real but weak edge. Adding the 39 segments of 260823–25, scored by exactly the same procedure, gives 0.798 on the new sessions alone and 0.824 pooled. It is not a sample-size effect: a random 53 of the pooled 92 scores . Torque calls the insertion about as well as the insertion is performed — and 260819 was performed differently.

One insertion, frame by frame

Left view is the head camera, right is the right wrist. All seven DOF of the arm holding the leg are plotted, in joint order. Click a legend entry to isolate a trace, scrub the chart to move the video, pick any of the segments below.

head camera · right wrist0.00 s

Every insertion, aligned on the moment the hand opens

Median and interquartile band across the segments in the selected set, with time zero at the release. The shaded strip is the window used for scoring — 1.0 s to 0.2 s before release, where the operator has not acted yet. Switch between the sessions: the run-up in elbow and wrist pitch that the score lives on is visibly steeper in 260823–25. wrist roll is the flat one either way — this phase pushes the leg down its own axis, so the roll axis carries almost nothing until the next subtask starts turning it.

Every insert segment, side by side

Click a row to load it above. hold is how long the leg stays in the hand after the arm reaches the base — the window where contact, if it registers anywhere, has to register. The later sessions insert for longer and let go sooner.

segmentsessioninsert lenhand opens hold after releasepeak |Rarm_3| grip force drop

How much survives each control

AUC for "is the leg about to be seated?", scored on the pre-release window only. Positives are the frames 1.0 s to 0.2 s before the hand opens; negatives are every frame of the same segment more than 2 s before it. Nothing after the release is scored. Folds are split by segment, and each control is re-fitted inside the fold. 0.50 is a coin flip.

Controlled for260819
53 seg
260823–25
39 seg
all
92 seg
distance from chance, all 92

The gap is not an artefact of pooling two sessions into one ranking. Removing every per-segment offset first — centring each channel within its own segment, so only within-segment structure can score — leaves for 260819, for 260823–25, pooled. Same ordering, same conclusion.

Per joint, each one on its own, residualised the same way:

right-arm jointAUC 260819AUC 260823–25 AUC allstd (Nm)reading

The legs and waist are not in this list on purpose: they have the largest raw torque swing in the whole robot and almost none of it is about the task.

Correction, kept from the first pass

That pass reported the right gripper's own torque as the strongest signal (AUC 0.841). That was leakage. The hand opens before the segment ends, so the window being scored sat entirely after the release — it was detecting that the operator had let go, not that the leg was seated. Every number on this page is measured strictly before the hand moves, and the gripper channels appear only as a control to be removed.

Measured torque is tau_est per motor from rt/lowstate. The action-side tauff is not shown: it is pin.rnea(model, data, sol_q, 0, 0) — gravity at the commanded pose, a deterministic function of the commanded joint angles, carrying no measurement and no contact. Frequency content is another dead end: of torque power sits below 1 Hz and of consecutive samples repeat exactly, so a spectrogram has nothing to resolve at 30 Hz. Temporal context is what pays — a 0.5–1.5 s difference feature lifted every model tested.

A segment enters this page when one leg was picked, inserted in a single labelled segment, and tightened: legs were attempted, qualify. Clips are cut from cam_left_high and cam_right_wrist, frame 0 of the clip being frame 0 of the insert segment, running 2 s past the subtask boundary. One caveat for anyone else reading the source dataset: its aggregated meta/episodes stamps every episode of an input with the last video file written for that input, so the head-camera file_index is wrong wherever an input spilled into two video files. build/make_clips.py recovers the true index from the from_timestamp restarts.

Everything here is rebuilt by build/analysis.py and build/make_clips.py in this repository from URL-RFM/IKEA_pickuptheleg.