Documentation
This page collects the platform, dataset, policy, protocol, and result details behind the project site, and identifies the retained artefacts and commands behind every number. It documents completed work and does not authorise new training runs or robot trials.
Thesis
Learning Contact Representations from Zero-Cost Proprioceptive Effort Signals for Contact-Rich Visuomotor Imitation Learning. Jaydeepkumar Ranpariya, master's thesis, Friedrich-Alexander-Universität Erlangen-Nürnberg, hosted by the Fraunhofer Institute for Integrated Circuits (IIS), 2026. Supervised by Prof. Michael Philippsen and Dr. Tobias Feigl (FAU) and Alexander Mattick (Fraunhofer IIS).
Overarching question
Can weak, uncalibrated motor-current signals already available on a low-cost robot provide a useful learned contact representation for contact-rich visuomotor imitation learning?
Contributions
- A reproducible characterisation of all six STS3215 current channels as candidate learning inputs: acquisition, distribution, pose dependence, contact discrimination, and temporal behaviour.
- An extended LeRobot-compatible schema and a synchronised 100-episode multimodal peg-in-hole dataset with human-reviewed phase annotations for the analysed subset.
- Controlled ACT implementations for direct current concatenation, training-derived preprocessing, and a learned joint-selective temporal representation.
- A Diffusion Policy vision-and-position system and a learned-current counterpart evaluated under a shared dataset and execution timebase.
- A model-agnostic counterfactual diagnostic that measures how predicted actions change when one modality is replaced while the rest are held fixed.
- A software and verification framework that reproduces the analyses, plots, observation transformations, and evaluated policy settings.
Platform
SO-101 leader and follower arms with six STS3215 bus servos each. Teleoperation runs at 30 Hz with one-to-one joint mapping; the follower wrist roll is limited to 80 encoder counts per step to avoid a firmware overflow. The one-way mapping does not reflect follower current back to the operator, and the operator has no live camera feed.
Effort register
- Datasheet scale 6.5 mA per count; pipelines keep raw counts. Observed task range 0–77 counts, about 0–500 mA.
- Diagnostic read loop over six registers on six joints: 55.3 Hz (±0.1 Hz across poses), 18.1 ms cycle, against the camera-paced 33.3 ms policy period. Policy-rate Nyquist limit 15 Hz.
- Static noise: per-pose standard deviation between 0.02 and 0.49 counts, so variation at rest is mostly integer quantisation.
- Pose dependence: shoulder-lift current 0.1 counts folded to 25.8 counts extended over 20 poses × 3 repetitions.
- Contact rises last roughly 100–300 ms, three to nine samples at 30 Hz. Firmware stall protection pulls current toward 20 counts after about 2 s of sustained stall.
Task geometry
- Final peg: 16.45 mm measured diameter, 70 mm height, 3D-printed PLA, grasped directly by the gripper.
- Hole: IndustRealKit-based block, measured bore 16.8 mm (nominal 16 mm), no chamfer.
- Diametral clearance 0.35 mm, clearance-to-diameter ratio 0.021, four times tighter than the pilot fixture (15.4 mm chamfered peg, 1.4 mm clearance).
- Peg start position fixed and marked about 7 cm from the hole. Vertical peg, grasped from the side.
Channel selection
The gripper load register discriminates contact strongly (d = 1.27 to 19.52) but is coarsely quantised, saturates at 500 counts, and correlates with current at ρ = 0.88 over 51,474 samples, so it was excluded as redundant. Speed, voltage, and temperature are diagnostic only. The selected observation is the six joint positions and six currents; camera input is unchanged. The operating point stays at raw counts with no dynamics model, torque calibration, or force reconstruction.
Dataset
Schema
| Key | Content | Used by |
|---|---|---|
observation.state[0:6] | follower joint positions | ACT-V, ACT-M, DP-V, DP-M |
observation.state[6:12] | follower motor current, raw counts | ACT-M, DP-M only |
observation.state[12:18] | servo temperatures | diagnostics only |
observation.images.top | wrist RGB, 480 × 640 × 3 | all policies |
observation.images.side | side RGB, 480 × 640 × 3 | inspection and annotation |
action | leader joint positions (6) | all policies |
All recorded datasets
| Dataset | Episodes | Frames | Clearance | Notes |
|---|---|---|---|---|
peg-insertion-flat | 50 | 50,263 | 1.40 mm | easy, chamfered, 15.4 mm pilot peg |
peg-tight-flat | 50 | 47,159 | 0.35 mm | hard, no chamfer |
peg-tight-vertical | 50 | 51,057 | 0.35 mm | hard, no chamfer, vertical |
peg-tight-vertical-ext | 50 | 48,774 | 0.35 mm | extension batch |
peg-tight-vertical-100 | 100 | 99,831 | 0.35 mm | merged primary + extension; training set |
Total unique: 200 episodes and 197,253 frames (the 100-episode set re-uses the two vertical batches). The training set for every matched comparison is peg-tight-vertical-100: 100 episodes, 99,831 frames, 30 Hz, mean duration 33.3 s, four sessions, two cameras, all successful insertions.
Current distribution and normalisation
- 44.9 % of all current samples are exactly zero; per channel 35–54 %. Up to 94 % of wrist-roll samples are at most one count.
- Shoulder-pan skewness 11.3 with excess kurtosis near 400 (median 0, q99 = 3, maximum 52 counts).
- Plain mean–std maps free-space zeros to an offset of −0.5 to −0.9 and maxima to +6 to +55 standard deviations. The selected transform winsorises each channel at the per-joint training q99.5 before mean–std scaling; caps and statistics are fitted on training demonstrations only.
- Four training views:
act-v(6-dim state),act-m(12),act-m-norm(12, winsorised),merged(18, diagnostics only). Episodes, frame indices, images, timestamps, and action targets are identical across views.
Recording protocol
episode_time_s = 45, reset_time_s = 15, fps = 30, video = true. Temperature checked every ten episodes with a pause if any joint exceeds 60 °C. One operator. Phase annotations: 32 human-reviewed rows considered, one non-monotonic row excluded, 31 valid rows retained as calibration metadata, never as training labels. LeRobot fork JDRanpariya/lerobot, branch feat/proprio-logging.
Policies
ACT-V and DP-V receive the six joint positions; ACT-M and DP-M receive positions and currents (12 dimensions). ACT runs at 30 Hz. The recovered Diffusion Policy runs at a native 10 Hz with stride-3 data. ACT uses mean–std normalisation for state and action; DP uses mean–std for images and min–max for state and action.
ACT configuration
| Image input | wrist RGB 640 × 480 at 30 Hz, ResNet-18 ImageNet init |
| Chunk / executed | 50 / 50 (about 1.67 s open loop) |
| Transformer | d_model 256, 8 heads, 4 encoder / 1 decoder layers |
| CVAE | latent 32, 4 layers, KL weight 10, dropout 0.1 |
| Optimiser | AdamW, lr 1e-5, weight decay 1e-4 |
| Schedule | batch 16, 100,000 steps, seed 1000, checkpoint every 20,000 |
| Temporal encoder (jointCNN) | per-joint current history through a shared 1D CNN into six joint tokens; mean, max, latest pooling |
Diffusion Policy configuration
| Observation / horizon | 2 observation steps, horizon 16, 8 executed actions |
| U-Net | widths 512 / 1024 / 2048, kernel 5, GroupNorm 8, diffusion embedding 128 |
| Training | DDPM 100 steps; recovery 200,000 updates, batch 16, 10 Hz, image 144 × 192, stride 3 |
| Final warm start | 40,000 updates; Adam lr 1e-4, betas (0.95, 0.999), wd 1e-6, cosine, 500 warmup, EMA |
| Inference | DDIM, 10 or 16 reverse steps gated at p95 ≤ 80 ms and p99 ≤ 100 ms |
| Current route (DP-M) | present + 8 preceding samples per joint (0.8 s), shared two-layer 1D CNN, 48 features per observation, identity-initialised residual FiLM into every conditional block; scale bounded ±0.5 |
All variants
| Policy | Learned observation | Current path | Evidence role |
|---|---|---|---|
| ACT-V | image + position | none | ACT baseline |
| ACT-M | image + position + current | direct state concat | primary ACT test |
| ACT-M-norm | image + position + winsorised current | direct state concat | completed: 30 trials |
| ACT-M-norm-CNN | image + position + winsorised current history | 1D-CNN token | trained; exploratory screening |
| ACT-M-norm-jointtokens | image + position + six joint-current pairs | learned J1–J6 tokens | trained; exploratory screening |
| ACT-M-norm-jointCNN | image + position + six per-joint histories | learned J1–J6 temporal tokens | trained; hardware not selected |
| ACT-M-norm-jointCNN-contact | image + position + six per-joint histories | mean/max/latest J1–J6 temporal tokens | completed: 30 trials per policy |
| ACT-M-norm-jointCNN-FiLM | same histories and joint representations | identity-initialised bounded feature FiLM | five-trial pilot; not promoted |
| ACT-M-CNN (historical) | image + position + unwinsorised current history | 1D-CNN token | implementation-limited encoder ablation |
| ACT-M-FiLM (historical) | image + position + explicit effort | visual FiLM | implementation-limited exploratory ablation |
| DP-V 40k warm-start control | image + position | native global condition | matched control: 9/30 |
| DP-M jointCNN dual-FiLM | image + position + per-joint current history | bounded residual condition | matched current arm: 12/30 |
The historical ACT-M-CNN artefact was most likely trained on raw-count history windows but deployed on already-normalised windows; this is recorded as a provenance-supported implementation limitation. Implementation-stage extensions (residual refiners, auxiliary future-current and contact-state objectives, visual curriculum) are unevaluated and contribute no result rows.
Evaluation protocol
- All fixed-task policies train on the same 100 demonstrations with seed 1000. Hardware performance never selects among seeds, so repeated trials estimate deployment and session variability, not training variance.
- Success: the policy autonomously grasps, transports, and seats the peg flush before the limit. Partial insertion is a failure. Failure categories: wrong_approach, no_grasp, dropped, missed, partial, timeout, other.
- Interleaving: alternating blocks of six trials, five blocks per policy, 30 trials per variant and 60 per pair. Rollout timeout 45 s, inter-trial reset 15 s.
- Thermal gating: every servo at or below 50 °C before a block starts; a sustained 65 °C over five samples forces a pause until all joints cool to 50 °C.
- Statistics: success proportion with a Wilson 95 % interval; two-sided Fisher exact test per pair; Holm correction when more than one pairwise p-value is reported; predeclared 10-point practical threshold.
- Sessions are reported separately and never pooled.
Results
Matched comparisons
| Session | Baseline | Current-aware | Fisher p | Newcombe 95 % difference |
|---|---|---|---|---|
Raw direct ACTactv-vs-actm-c50-640 | ACT-V 19/30 | ACT-M direct 8/30 | 0.0089 | [−56.0, −11.5] pp |
Normalised direct ACTact-test-actv-actmnorm-30-trials | ACT-V 17/30 | ACT-M-norm 15/30 | 0.796 | [−29.9, 17.6] pp |
Learned temporal ACTact-actv-vs-jointcnn-contact-30-trials | ACT-V 7/30 | ACT-M-norm-jointCNN-contact 12/30 | 0.267 | [−6.7, 37.8] pp |
Diffusion Policydp-final-matched-30each-20260821 | DP-V 9/30 | DP-M jointCNN dual-FiLM 12/30 | 0.589 | [−13.6, 32.1] pp |
Block successes in the final DP session: DP-V 3, 4, 2, 0, 0; DP-M 5, 2, 2, 2, 1. The unchanged ACT-V checkpoint scored 17/30 in the normalised session and 7/30 in the temporal session, which prohibits ranking ACT-M-norm (15/30) against the learned encoder (12/30) across sessions.
Task-difficulty ablation (ACT-V)
| Condition | Successes | Rate | Δ vs original | Fisher p | Primary failure |
|---|---|---|---|---|---|
| Original (1.4 mm + chamfer) | 25/30 | 83 % | — | — | mixed |
| Tight (0.55 mm + chamfer) | 23/30 | 77 % | −7 pp | 0.748 | no_grasp |
| Tight (0.55 mm, no chamfer) | 14/30 | 47 % | −37 pp | 0.006 | missed / dropped |
| Retrained (0.35 mm, no chamfer) | 19/30 | 63 % | −20 pp | 0.143 | dropped |
| Vertical (0.35 mm, no chamfer), 50 demos | 5/30 | 17 % | −67 pp | < 0.001 | dropped / no_grasp |
| Vertical + side camera, 50 demos | 0/30 | 0 % | −83 pp | < 0.001 | no_grasp / dropped |
| Vertical, 100 demos, 1 camera | 15/30 | 50 % | — | — | missed / dropped |
| Vertical, 100 demos, 2 cameras | 14/30 | 47 % | −3 pp | 1.00 | missed / wrong_approach |
Removing the chamfer, not the clearance reduction alone, produced the first significant drop. The vertical grasp and the side camera each change geometry and visibility at once, so the decreases cannot be assigned to a single factor. With 100 demonstrations the second camera introduces wrong-approach failures that are absent from the one-camera condition.
Historical ACT fusion ablation (30 trials each)
| Policy | Successes | Rate | Wilson 95 % | z_curr |
|---|---|---|---|---|
| ACT-V | 19/30 | 63.3 % | [45.5, 78.1] | — |
| ACT-M concat | 8/30 | 26.7 % | [14.2, 44.4] | 0.080 |
| ACT-M-CNN | 6/30 | 20.0 % | [9.5, 37.3] | 0.079 |
| ACT-M-FiLM | 0/30 | 0.0 % | [0.0, 11.4] | 0.324 |
All 30 FiLM failures occur before insertion (18 wrong_approach, 12 no_grasp). Both the CNN and FiLM rows are implementation-limited: valid for the deployed artefacts, but they cannot cleanly reject either architecture.
Screens and pilots (not confirmatory)
- Bounded ACT feature-conditioning screen, one block of five trials per policy: ACT-V control 3/5; warm-start concat 2/5; bounded FiLM from scratch 1/5; bounded FiLM warm start 1/5; hard-latched FiLM warm start 3/5. No checkpoint promoted.
- Behaviour-preserving DP screen, five trials per model: DP-V control 4/5; DP-M concat 0/5; instantaneous dual-FiLM 3/5; jointCNN K8 dual-FiLM 4/5; hard-latched 1/5. Model identity is confounded with run order.
- Recovered DP-V confirmatory session: 17/30 (Wilson [39.2, 72.6]). Direct DP-M-norm and K3/K8 encoders: 0/5 each, descriptive only.
- One-step DP replanning: neither arm begins purposeful motion; rejected as a controller failure, not current-modality evidence.
Reproduction record
Values derived from data are recomputed from retained CSV, Parquet, JSON, and annotation files. Configuration values are checked against policy code, resolved commands, checkpoint configuration, and evaluation manifests. Literature claims are checked against same-key source files in the reference archive.
| Component | Authoritative record | Verified property |
|---|---|---|
| Peg-in-hole dataset | experiments/datasets/peg-tight-vertical-100/ | episode count, frame count, timestamps, camera keys, states, actions |
| Controlled views | act-v/meta/ and act-m/meta/ | identical episode and frame identities with only the state view changed |
| Leader calibration | calibration/so101_leader.json | joint order, servo identifiers, ranges, homing offsets, digest |
| Follower calibration | calibration/so101_follower.json | the same fields and digest, fixed from collection through evaluation |
| Resolved training commands | per-run command records | dataset view, seed, update budget, policy family, resolution, chunk or horizon |
| Evaluation manifests | per-session manifests | deployed labels bound to checkpoint hashes and policy-code revisions |
| Trial rows | per-session results.csv | order, outcome, failure phase, block, and session context |
Deterministic checks
python3 experiments/phase-1-characterisation/scripts/reproduce_chapter4_numbers.py
python3 research/writing/verify_chapter5_dataset.py
python3 research/writing/verify_chapter6_method.py
python3 research/writing/verify_chapter7_evaluation.py
python3 research/writing/audit_final_manuscript.pyWilson and Newcombe intervals shown on the site are recomputed at build time from the success counts in src/data/results.json and match the manuscript values. The dataset, checkpoints, trial records, and scripts accompany the thesis in the project archive; public release is not assumed. Large recordings and checkpoint tensors are not embedded in this website.
Media provenance
The four clips are derived from retained thesis recordings. MP4 derivatives use H.264, yuv420p, and a fast-start index; source frame rates are kept and no audio exists. The full record with source paths, SHA-256 digests, trial UUIDs, and the exact FFmpeg commands is kept in website/media-provenance.md.
| Clip | Source trial | Output | Selection |
|---|---|---|---|
task-overview.mp4 | peg-tight-vertical-100 phase-annotation clip, episode 35 | 960 × 360, 30 fps, 29.4 s | complete clip; scaled from 1280 × 480 |
act-vision-missed-insertion.mp4 | act-actv-vs-jointcnn-contact-30-trials · ACT-V · block 3 · global trial 13 · success 0, failure phase insertion, mode missed | 640 × 480, 30 fps, 30.1 s | source 3.0–33.1 s, idle lead-in removed |
act-current-success.mp4 | same session · actm-norm-jointcnn-contact · block 3 · global trial 13 · success 1 | 640 × 480, 30 fps, 30.4 s | source 3.0–33.4 s, idle lead-in removed |
diffusion-current-success.mp4 | dp-final-matched-30each-20260821 · dpm-norm-dpvinit-jointcnn-k8-dualfilm · block 1 · global trial 2 · success 1 | 640 × 480, 10 fps, 36.0 s | source 28.4–64.4 s; crop 576 × 432 at (48, 24) then scale |
The ACT-V and ACT-M clips occupy the same rotated block and trial slot but are separate physical rollouts; they illustrate the aggregate result and are not synchronised paired evidence. The demonstration clip's original annotation label reads "zero-shot (direct)", which describes a direct-entry teleoperated demonstration, not a learned zero-shot policy.
Limitations
Internal validity
- One training seed, one operator, 30 hardware trials per confirmatory row; wide intervals.
- Live categorical failure labels may contain evaluator judgement.
- The historical CNN window-scale mismatch and the FiLM checkpoint defect confound the intended fusion comparison.
- Interleaved blocks reduce thermal and order effects but do not eliminate them. The five-trial screens ran each model consecutively and are not used for between-model inference.
Construct validity
- Binary seating success does not measure insertion quality or contact force.
- z_curr measures counterfactual action sensitivity, not causal task importance; mean-imputed inputs may lie off the training manifold.
- Phase-specific claims need verified recording-based phase boundaries, which remain incomplete.
External validity and sensing
- One peg-in-hole setup, one SO-101, one STS3215 firmware, one teleoperator. Findings are stated as "on STS3215 in this setup".
- Motor current does not directly identify object slip; a 30 Hz effort stream may not distinguish slip from free motion.
- Demonstrations are success-only and modest in count; a larger multi-operator collection is future work.
Future work
- Verify phase boundaries in the completed evaluation recordings and preserve annotation hashes.
- Run a same-session encoder-versus-concatenation comparison.
- Test shorter execution horizons or asynchronous 100–200 Hz current histories against feedback latency.
- Repeat across seeds, tasks, and servo families; add a slip-suited modality such as acoustic or tactile sensing.