G1 Dex1 · IKEA table assembly · 260819 + 260823–25
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.
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.
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.
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.
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.
| segment | session | insert len | hand opens | hold after release | peak |Rarm_3| | grip force drop |
|---|
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 for | 260819 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 joint | AUC 260819 | AUC 260823–25 | AUC all | std (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.
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.