Skip to content

Fly against AWETrim's new LEI-V3 ROM: depower offset, KCU steering limits, seed band, high-wind figure, startup wind ramp, high-wind start length - #26

Open
ocayon wants to merge 3 commits into
mainfrom
awetrim-rom-2026-11-05
Open

ocayon wants to merge 3 commits into
mainfrom
awetrim-rom-2026-11-05

Conversation

@ocayon

@ocayon ocayon commented Nov 10, 2026 •

Copy link
Copy Markdown
Member

awetrim-rom-2026-11-05 → main. Needs the AWETrim server from develop, which now includes the companion PR (awegroup/AWETrim#31, merged). Older servers fail it, for two reasons:

  • The server takes the reel-out angle-of-attack box from the ROM's identified range. Without it, the 10 m/s cases fail with the angle of attack on the old 0° floor.
  • The server accepts the steering_limits this branch sends.

The ROM it flies is AWETrim develop's default: the turn-rate steering law, depower box 1.7–2.6 m.

Why

With the new ROM, the 2026-11-07 run at Cabauw 10 m/s reached a power ratio of 0.31, and the 4 m/s cases flew about half the predicted force. The ROM is not the cause.

V3Kite and the ROM do not pull the same at the same power tape. Uwe's validate_lift_drag.jl (V3Kite parked at six tapes, 1.5–2.45 m, v_a 15.3 m/s) against AWETrim's /aero_forces gives the ROM 1.3–1.5 times V3Kite's lift at every tape. Matched by lift + drag resultant instead (AWETrim's examples/server/identify_depower_offset.py), the map is a pure offset:

V3Kite tape ROM tape at the same resultant offset L/D V3Kite / ROM
1.50 m 1.856 m −0.356 5.95 / 5.71
1.70 m 2.078 m −0.378 5.08 / 4.77
1.90 m 2.284 m −0.384 4.26 / 3.96
2.10 m 2.469 m −0.369 3.61 / 3.36

The offset is −0.372 m with a std of 0.010 m (unchanged with the turn-rate ROM: its lift and drag are the same identification); a linear fit gives a gain of 0.977, so no gain is needed. depower_offset = −0.372 m / 5 m = −0.074. V3Kite's 6 % higher L/D at matched force is why the ratios end up slightly above 1. One tape map cannot close that gap.

The remaining changes get the optimizer to a startup path in strong wind, where the new ROM has to depower far (to about 2.4 m at 10 m/s against a 7.2 kN winch cap).

Changes

  • depower_offset −0.074 (traj_opt.yaml), with the derivation in the comment.
  • KCU steering limits sent with every /init (steering_limits_from(fcs, set)): the course controller's max_steering and the tape's v_steering, 0.32 and 0.20 1/s, against the optimizer's own 0.357 and 0.29 1/s. V3Kite's rel_steering and the ROM's u_s are the same unit (tape half-difference over 1.4 m). The request key leaves the field out while it is unset, so cached entries stay valid.
  • Depower seed bounds 1.7–2.6 m (DEPOWER_SEED_BOUNDS, was 1.1–2.3; the ROM's validity band. AWETrim's ROM starts at 1.7 m because the 2025 flights already stall there) and input_depower_seed_max 2.45 m (was 1.85). At 10 m/s the optimum is near 2.4 m, and the seed march cannot start from 1.85 m.
  • Larger high-wind figure: pattern_elevation_amplitude_max_high 17° (was 13°), from 12.5 m/s at 100 m (was 13.2, so Maasvlakte 10 m/s at 12.9 gets it too), and guess_el_center_high 33° (was 30°). With 13° the laps outran the optimizer's steering slew (0.29 1/s).
  • Startup wind ramp (guess.startup_wind_ramp_start 7 m/s, startup_wind_ramp_step 1 m/s, 0.0 = off). Above the start wind, the startup solve runs at the start wind and then steps the wind up warm through /step (chain_step with inflow_conditions) to the run's wind. Only the final reply is flown. Cabauw 10 m/s failed cold from every seed; through the ramp it solves on the first seed.
  • High-wind start length next to the low-wind schedule (low_wind: section of fc_settings_reelout.yaml, high_wind_speed 16 m/s at 100 m, high_wind_l_tether 180 m, high_wind_l_tether()). At 150 m, Cabauw 10 m/s (19.3 m/s at 100 m) has no feasible startup path: a figure big enough for the steering slew dips under the 50 m height floor. Cabauw 7 and Maasvlakte 10 keep 150 m.

Results (2026-11-10, the AWETrim code now on develop, default turbulence)

Case Power ratio before → after Success criteria
Cabauw 4 m/s 0.52 → 1.06 all 10 passed
Cabauw 7 m/s rejected (turn margin 0.74) → 0.95 all 10 passed
Cabauw 10 m/s no startup path → 0.88 (from 180 m) all 10 passed
Maasvlakte 4 m/s 0.58 → 1.02 min elevation, phase 5 not reached, see below
Maasvlakte 7 m/s → 1.03 all 10 passed
Maasvlakte 10 m/s no startup path → 0.93 all 10 passed

These runs include the steering limits. The planned steering rate reaches the 0.20 1/s limit, and every case remained feasible. With the previous (roll-gain) ROM and without the limits, the ratios were 1.11, 0.99, 0.89, 1.21, 1.07 and 0.96.

Open (not in this PR)

  • Maasvlakte 4 m/s fails the phase-5 transition. It reels out well: d < 1°, 3 laps, the planned force. At the maximum length the state stays 4, steering saturates at +32 %, and the kite sinks to −2° elevation.
  • The turn-rate table should be extended at the depowered end. With the 1.7 m floor the kite flies rel_depower 0.226–0.38. At 10 m/s that is past the table's identified range (0.20–0.375), so phase 5 and the re-optimization curvature checks read "margin Inf" there. Re-identifying the table up to about 0.40 is the fix.

Tests

  • New: startup_wind_ramp (fake server: init at 7 m/s, warm steps to 9 m/s), the high_wind_l_tether checks, and steering_limits in the request key and JSON.
  • Re-run on the last commit: test_awetrim_client, test_opt_request, test_reopt_chain and test_startup_pipeline pass, apart from the write_run_done failure below. The full count of 1588 is from the commit before.
  • Updated: the shipped-value pins of the high-wind box. seeding_solve runs with the ramp off.
  • 1588 passed. The three failures (script_inputs, write_run_done, ensure_gui_state_file) also fail on a clean main and look Windows-specific (path separators, file mode). The runs were made on Windows.

After merging

Delete the optimizer caches (output/opt_failure_cache.yaml, output/opt_chain_cache/): their keys cannot see the server's ROM. Then pull AWETrim develop and restart the server from it (python examples/server/run_reelout_server.py). Redo the offset whenever the ROM or V3Kite changes: run validate_lift_drag.jl, then python examples/server/identify_depower_offset.py output/lift_drag_validation.json in AWETrim.

Written by Claude, reviewed by Oriol Cayon

🤖 Generated with Claude Code

…d, startup wind ramp

At the same power tape V3Kite and the new ROM do not pull the same: at
matched lift + drag resultant V3Kite's tape is the ROM's minus 0.372 m
(std 0.010 m; validate_lift_drag.jl + AWETrim's
examples/server/identify_depower_offset.py), so depower_offset is -0.074.
Power ratio Cabauw 4 m/s 0.52 -> 1.11, Maasvlakte 4 m/s 0.58 -> 1.21;
Cabauw 7 0.99, Cabauw 10 0.89 (from 180 m), Maasvlakte 7 1.07,
Maasvlakte 10 0.96.

The depower seed bounds are the ROM's band, 1.5-2.6 m, and the seed cap
2.45 m: at 10 m/s the optimum is near 2.4 m. The high-wind figure is 17°
tall (was 13°) from 12.5 m/s at 100 m (was 13.2), guess centre 33°: at
13° the laps outran the 0.29 1/s steering slew. A startup wind ramp
(guess.startup_wind_ramp_start / _step, 7 and 1 m/s, 0 = off) solves at
the start wind and steps up warm to the run's: Cabauw 10 m/s failed cold
from every seed.

Needs AWETrim with the ROM's angle-of-attack range as the reel-out box
(feat/server-aero-forces). Open: Cabauw 10 from 150 m; the Maasvlakte
4 m/s phase-5 transition with the kite flying below the turn-rate
table's 0.20.

Generated with Claude Code
Next to the low-wind schedule (low_wind: section of
fc_settings_reelout.yaml), high_wind_speed / high_wind_l_tether start the
reel-out at a longer tether in strong wind (high_wind_l_tether(),
applied by apply_low_wind_schedule!, an l_tether override still wins).
On AWETrim's 2026-11-05 ROM Cabauw 10 m/s (19.3 m/s at 100 m) has no
feasible startup path at 150 m: the figure big enough for the 0.29 1/s
steering slew dips under the 50 m height floor. From 180 m it flies at a
power ratio of 0.89. Cabauw 7 (13.5) and Maasvlakte 10 (12.9) keep 150 m.

Generated with Claude Code
…om 1.7 m

Every /init now carries steering_limits {max, rate}: the course controller's
max_steering and the steering tape's v_steering of the run's settings (0.32 and
0.2 1/s on the V3), so AWETrim plans no turn the KCU cannot fly. Its own box is
the ROM's, 0.357 and 0.29 1/s. V3Kite's rel_steering and the ROM's u_s are the
same unit (tape half-difference over 1.4 m). Left out of the request key while
unset, so the cached entries stay valid.

DEPOWER_SEED_BOUNDS follows the ROM's band, now 1.7-2.6 m: the 2025 flights stall
already at 1.7 m of power tape.

Generated with Claude Code
Copilot AI balanced review requested due to automatic review settings November 10, 2026 12:36

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants