Skip to content

Lift/drag validation of V3Kite against the AWETrim ROM - #25

Open
ufechner7 wants to merge 39 commits into
mainfrom
lift-drag-validation
Open

ufechner7 wants to merge 39 commits into
mainfrom
lift-drag-validation

Conversation

@ufechner7

@ufechner7 ufechner7 commented Oct 27, 2026 •

Copy link
Copy Markdown
Member

Compares V3Kite's lift and drag with AWETrim's reduced-order model (ROM) at the same power-tape length and apparent wind speed. All AWETrim requests now use one ROM, rom_config_aerostructural2.yaml. Needs AWETrim's POST /aero_forces and that ROM file, both on awegroup/AWETrim#31.

  • One ROM for every request. AWETRIM_ROM = "rom_config_aerostructural2.yaml" (in src/awetrim_client.jl) is sent as rom_config_path with every /init. Until now RKC sent no ROM, and the server used its default, the flight-corrected ROM. opt_init throws (check_rom) when the reply names another file or none.
    • The ROM is part of the request and cache keys, so results cached with the old ROM are not reused. The pinned keys in the tests moved for that reason.
    • The test fake server echoes rom_config like AWETrim.
  • examples/validate_lift_drag.jl parks the kite at 150 m, using the simple_auto_parking.jl setup. Per point (tape, v_a) it trims the ground wind until v_a reaches the target, then averages lift, drag, span_mean_aoa and v_a over 10 s. It then queries /aero_forces at the measured v_a, at the ROM's own trim.
  • examples/show_validation.jl shows the saved results as an HTML page in the browser:
    • V3Kite against the ROM trim, with deviations colour-coded and points outside the ROM's validity band marked;
    • a table of V3Kite's drag split.
  • Both scripts are in the identification menu (menu2) and on the identification docs page.
  • bin/install_awetrim installs AWETrim's feat/server-aero-forces branch until #31 is merged.
  • .JETLSConfig.toml.default: inferred-type inlay hints are switched off.

Result with rom_config_aerostructural2.yaml (L / D in N):

tape v_a V3Kite ROM trim ΔL ΔD
1.60 m 15.3 1637 / 240 1676 / 265 +2 % +11 %
1.60 m 8.8 584 / 82 554 / 88 −5 % +7 %
1.76 m 15.3 1358 / 226 1408 / 253 +4 % +12 %
1.76 m 8.6 478 / 74 450 / 81 −6 % +9 %

All four points are inside this ROM's validity band (1.6–2.2 m of tape). Lift agrees within ±6 %; the ROM's drag is 7–12 % higher at every point.

Switch BRANCH in bin/install_awetrim back to develop once awegroup/AWETrim#31 is merged.

🤖 Generated with Claude Code

ufechner7 and others added 5 commits October 27, 2026 18:21
examples/validate_lift_drag.jl parks the kite at 150 m, trims the ground
wind per block until v_a reaches its target, averages V3Kite's lift, drag
and span-mean AoA, and queries AWETrim's POST /aero_forces (both LEI-V3
ROMs, at the ROM trim and at V3Kite's AoA). Saved to
output/lift_drag_validation.json; fly = false re-queries without flying.
examples/show_validation.jl shows it as an HTML page in the browser.
Both are in the identification menu and on its docs page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rror

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It carries the POST /aero_forces endpoint validate_lift_drag.jl needs. A
branch only in the local checkout (not pushed yet) is checked out as it is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov-commenter

codecov-commenter commented Oct 27, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 74.72527% with 23 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/awetrim_client.jl 58.92% 23 Missing ⚠️

📢 Thoughts on this report? Let us know!

…ridle lines

lift_drag's drag holds only the bridle share SymbolicAWEModels lumps onto the
wing nodes (about 30 % of it), while the ROM's C_D includes every bridle line.
drag_parts splits the drag into VSM wing, bridle, tether and KCU; the old
lift_drag value is kept as drag_lift_drag. show_validation.jl adds a table
of the split.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

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.

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.

ufechner7 and others added 20 commits October 28, 2026 10:35
AWETRIM_ROM names the ROM; InitParams sends it as rom_config_path (so it is
in the request and cache keys), opt_init refuses a reply whose rom_config
names another file (check_rom), and validate_lift_drag.jl queries only it.
The test fake server echoes rom_config like AWETrim; the pinned keys move.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…attack

show_validation.jl takes the deviation from the ROM trim instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ty band

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tuning-log entry with the 1.60/1.76 m results, and a warning on the page
show_validation.jl writes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…aerostructural2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…size retries

The new ROM turns ~43 % less (physical for its geometry). Replaying the
failed startup requests: a 36 x 15 box with a 32x14 guess starts 5, 6, 8,
8.25 m/s, 30x13 and 34x15 cover 7 m/s; startup_retry_guess_sizes tries
them before the elevation offsets. The depower seed is flat at 1.5 m.
3.5 m/s still has no startup path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Builds V3Kite's structure for the gui project (no model compile) and reads
AWETrim's system file with AWETrim's own Python: canopy, bridle, KCU, the
airborne total, the wing mass the trim uses and the tether mass per metre.
V3Kite flies 21.0 kg airborne; AWETrim 22.0 kg since it added the 2.58 kg
bridle to the wing (1.62 kg in V3Kite), 19.4 kg before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AWETrim aa25dfc added its 2.58 kg bridle to the point-mass wing: 22.0 kg
airborne against V3Kite's 21.0 kg (validate_masses.jl). Every /init now
sends system_config_path = awetrim_system_config(), AWETrim's LEI-V3
system file with the bridle mass set to AWETRIM_BRIDLE_MASS = 1.62 kg,
written to output/awetrim_system/ with the ROMs next to it; its content
is part of the request key.

At 12.62 kg Maasvlakte 5 m/s could not trim along any startup guess; a
26 x 11 guess converges, so it is the last size retry. 5 m/s flies: all
10 criteria, 6.1 kW, power ratio 0.99.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the 1.62 kg bridle the 4 m/s startup request has no solution under
the pattern box at kv 0.0408; recorded and replayed in AWETrim it
converges at kv 0.030 (and 0.025), not with any guess, seed, turn-radius
or tether-length change. kv is a column of winch_table.yaml again
(winch_kv): 0.030 at 3 and 4 m/s, 0.0408 from 5 m/s up. build_winch sets
wc.kv from it, which the winch flies and the requests send. Flown at
4 m/s: all 10 criteria, 3.1 kW, power ratio 0.99.

OPT_REQUEST_RECORD (off by default) appends every POST body to a file for
exact replays. Fixes the startup_retry_guess_sizes test edc039a broke.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The recorded 3.5 m/s startup request converges at kv 0.019-0.022 and
fails at 0.015-0.018 and 0.023-0.030. New 3.5 m/s row at 0.020, and
0.020 at 3 m/s (untested) so kv does not rise as the wind drops. Flown:
all 10 criteria, 1.9 kW, power ratio 1.02.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
….62 kg wing

The recorded 9 m/s startup request has no solution at the startup f_max
of 6696 N with the 1.62 kg bridle; it converges from 6900 N up with the
full pattern box. 0.96 (6912 N) is the smallest step that does. Flown:
all 10 criteria (max force included), 17.8 kW, power ratio 0.89.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the 1.62 kg bridle the recorded Maasvlakte 10 m/s startup request
converges only with symmetric off AND no climb limit (or without the box
or the bridle mass); force cap, kv, seed and guess do not help. New
pattern_shape_wind_ref (12.5 m/s at 100 m) with
pattern_symmetric_shape_high and pattern_climb_angle_max_shape_high,
read by symmetric_at / climb_angle_max_at. Flown at 10 m/s: all 10
criteria, 18.1 kW, power ratio 0.85; paths centred within 2.4°.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ufechner7 and others added 13 commits October 31, 2026 04:24
With the 12.62 kg wing the 11 m/s startup has no solution at 150 m; 160 m
converges but fails the curvature gate (margin 0.79). FC_LowWind gets
high_wind_speed (14.0 m/s at the reference height) and high_wind_l_tether
(180 m); 10 m/s keeps 150 m.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kv 0.020 at f_low 350 N needs reel_in_beta >= 21.4. Logs the Cabauw rebuild
and the startup failures at 4, 8, 9 and 10 m/s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When no startup seed converges, setup_with_startup sets the run up again
with the tether startup_retry_length_steps longer (traj_opt.yaml: [20.0]),
through the new l_tether run input; solve_startup throws StartupNoPath for
that. Cabauw 4 m/s retries at 170 m and flies. high_wind_l_tether 180 -> 170:
Maasvlakte 11 m/s flies there. Cabauw 8 m/s still fails laps >= 2.5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AWETrim's default floor of 0° leaves Cabauw 9 m/s without a startup
solution: the depowered kite trims at -0.5 to +0.4°. box.angle_of_attack_min
(traj_opt.yaml: -7.0) is sent with every /init as angle_of_attack_limits;
unset, it is neither sent nor in the cache key. Cabauw 8 m/s flies with it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…aloft

From 16.5 m/s at 100 m (only Cabauw 9 and 10 m/s) the box's azimuth cap is
45° (was 36) and its elevation half-span cap 20° (was 15); neither wind has a
startup solution otherwise. startup_retry_length_steps [10, 20] gives 10 m/s
its 180 m start. Their 30-32 s laps hold 2.0 laps, so the laps criterion is
run.min_laps_high (2.0) from min_laps_high_wind (16.5 m/s). Both fly all 10
criteria: 15.0 and 15.2 kW.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A rerun skipped the failed startup seeds as cached but, since a skip cost no
retry, spent its budget on new seeds walked outward, ~4 min of 422s per rerun
at Cabauw 10 m/s. Each listed seed is now tried once, sent or skipped, so a
rerun moves on to the next length at once. startup_seed_offsets is removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

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.

3 participants