soft-arm-trace
Soft continuum arm · solvedexploration 9 of 9 agent attempts pass
Exploration task. Built after the paper's sweep to test whether a task can force a mechanism outside the catalogue (docs/exploration_new_mechanisms.md, docs/soft_arm_spec.md). Not part of the benchmark tiers or of the paper's main counts; the soft arm is reported in the paper as a plant outside the sweep, the other tasks are not; all sessions ran under the paper's protocol.
more
The rungs are the RMS tip error over the moving part: coarse 20 mm, fine 10 mm, fast 5 mm. The gate is coarse, which the oracle (a static-map feedforward with preview plus a Jacobian PI-D) clears at 15 mm RMS; fine and fast need a design that accounts for the arm dynamics and the pressure lag, and are open.
Gate. per-seed success is the `coarse` rung of this benchmark's ladder ['safe', 'coarse', 'fine', 'fast'] (`--success-mode coarse`), not the evaluator's default flag; the task is solved when the success rate over the grader's held-out seeds is `>= 0.9`
Axes: plant:soft_arm, scenario:circle_v1, gate:coarse_20mm_rms, exploration:soft-arm, material:unknown-per-seed, tracking
Each video re-runs the attempt's final controller through the task's own evaluator on a public seed (never the grader's held-out ones). The table under each video is the official grade on the held-out seeds.
circle_v1| criterion | graded | needed |
|---|---|---|
| base:coarse | 1.000 | ≥ 0.900 |
The agent's final message
The controller at `/app/work/controller.py` is final and passes the gate with wide margin. **Result on the circle scenario** (the graded task, `coarse` = RMS tip error ≤ 20 mm after 10 s): | Check | Seeds | Pass at 20 mm | Pass at 10 mm | Mean RMS | Worst RMS | |---|---|---|---|---|---| | Official verifier | 0–4 | 5/5 | 5/5 | 5.1 mm | – | | Batch rollouts | 0–99 | 100/100 | 100/100 | 5.2 mm | 9.0 mm | | Batch rollouts, fresh | 100–199 | 100/100 | 100/100 | 5.3 mm | 9.1 mm | The sequence-mode siblings also pass the coarse gate on their visible seeds: payload, hook, warm-up and weak-chamber at 5/5, nominal at 9/10. **Control law** (documented in the file's docstring): - Feed-forward: the target, led ahead along its velocity by 0.35 s, goes through a Newton inverse of the nominal static tip map to give the two differential commands. - Feedback on each camera frame: the tip error is notch-filtered at the arm's 1.25 Hz bending mode, saturated at 3 cm, mapped through a damped pseudo-inverse of the map Jacobian at the applied command, and drives a PI correction. The integrator is gated quadratically outside a 4 cm error radius, frozen against saturated chambers and clamped. - Output: feed-forward plus feedback, clipped, converted to four chamber commands with a co-contraction bias of 0.08. **What the iterations fixed:** the first version's loop gain was dimensionless and set far too high, which saturated every seed. Low-damping seeds then oscillated at the bending mode until th…
The controller leads the moving target, inverts the nominal static tip map via Newton iterations for feedforward pressure commands, and adds a notch-filtered, saturated PI correction mapped through a damped Jacobian inverse on each camera frame, then converts to chamber commands with a co-contraction bias.
Shown: public seed 0 (circle_v1); this episode passes the coarse rung. This episode: hold_error_max 0.00519, targets_held_fine 1, targets_held_coarse 1, settle_time_max 10, final_error_max 0.000926, track_rms 0.00519, saturation_ratio 0, max_speed 0.913, stiffness_scale 1.08, payload_mass 0, total_reward -15.
controller.py · agent transcript · trial soft-arm-trace__BTda9MW
circle_v1| criterion | graded | needed |
|---|---|---|
| base:coarse | 0.975 | ≥ 0.900 |
The agent's final message
`/app/work/controller.py` passes the coarse rung on every scenario I ran except `hook_v1`, which fails 1 of 20 seeds. It was within 20 mm on all six targets, or the circle's RMS bound, on 100% of seeds on the first set below. **What it does.** It inverts the nominal static tip map to get a feedforward command for the current target. On each camera frame it adds an integral correction through a damped Jacobian inverse, which absorbs the seed's material, hysteresis, creep and payload. A small velocity term damps the 1.25 Hz bending mode. The docstring in the file explains each gain. **Results** (coarse success rate; the controller was developed against seeds 0–9 of the first two scenarios): | Scenario | Seeds | Coarse | Fine | Fast | |---|---|---|---|---| | `nominal_v0` | 0–9 | 100% | 100% | 90% | | `circle_v1` | 0–9 | 100% | 100% | 10% | | `nominal_v0` | 10–29 | 100% | 100% | 90% | | `circle_v1` | 10–29 | 100% | 65% | 0% | | `payload_v1` | 10–29 | 100% | 100% | 70% | | `hook_v1` | 10–29 | 95% | 90% | 55% | | `warmup_v1` | 10–29 | 100% | 100% | 90% | | `weak_chamber_v1` | 10–29 | 100% | 100% | 50% | | `marker_v1` | 10–29 | 100% | 100% | 90% | **Failure.** The one failure is `hook_v1` seed 24, where the 10 g hook leaves a 41 mm worst hold error on one target. Raising the integral gain to 1.0 did not fix it. At 1.5 it fixed that seed but broke `nominal_v0` and `circle_v1` seeds, so I kept the gain at 0.8. The grader's gate is coarse success of at least 0.9 over its held-out …
The controller inverts the nominal tip map to get a feedforward differential pressure command for the target, adds a clamped integral correction driven by filtered camera tip error through a regularized Jacobian pseudo-inverse plus a velocity damping term, and converts the result to four chamber commands with a co-contraction bias.
Shown: public seed 0 (circle_v1); this episode passes the coarse rung. This episode: hold_error_max 0.00492, targets_held_fine 1, targets_held_coarse 1, settle_time_max 10, final_error_max 0.00243, track_rms 0.00492, saturation_ratio 0, max_speed 0.901, stiffness_scale 1.08, payload_mass 0, total_reward -15.
controller.py · agent transcript · trial soft-arm-trace__w7WsMAy