also looking at this
feat: add bounded VTOL wind braking
#88
13 files
+447
-25
| @@ -36,6 +36,44 @@ and a 120 N/s slew limit. An independent 14 N pusher and the owned trainer's aer | ||
| 36 | 36 | share the rigid body. Rotor allocation preserves collective thrust first, then roll/pitch demand, |
| 37 | 37 | then yaw. No coefficient is measured from a purchased airframe. |
| 38 | 38 | |
| 39 | The VTOL wing uses the fictional `folded-incidence-v2` extension. Its forward pre-stall curve | |
| 40 | matches the trainer. In reversed chordwise flow, incidence is folded and the coefficient changes | |
| 41 | sign, with a cosine fade toward broadside. This removes the force/moment jump at the raw angle's | |
| 42 | positive/negative pi boundary and restores the local vertical response in the tested head/tail flow. | |
| 43 | Raw airflow angles remain available to the capture and envelope guards. The fixed-wing profile keeps | |
| 44 | its original trainer model. Neither curve represents measured reverse-flow or post-stall data. | |
| 45 | ||
| 46 | Back-transition braking compares the linear pre-stall estimate with 41 pitch candidates in the | |
| 47 | existing -0.08 to 0.3 rad range. It evaluates the declared nonlinear wing/rotor force balance against | |
| 48 | qualified captured airflow and estimated ground motion. Candidates must admit 0 to 48 N of lift-rotor | |
| 49 | thrust while supporting the requested vertical force; high-speed candidate incidence remains within | |
| 50 | 0.3 rad. The finite transition deadline, source guards, capture dwell and independent authority still | |
| 51 | apply. Replacing a correlated back request preserves rotary capture once reached, so recovery cannot | |
| 52 | restart forward-flight braking during a reverse position return. | |
| 53 | ||
| 54 | ### Bounded library wind experiment | |
| 55 | ||
| 56 | The library campaign applies sustained 2 m/s headwind or tailwind to the actual world model from | |
| 57 | 1000 ms, including takeoff, transitions, cruise and landing. Both routes complete within their | |
| 58 | original budgets using the raw sensor/estimator/controller runtime. This does not add wind selectors | |
| 59 | to the 14 named CLI/workspace cases below. A tailwind library run can be constructed explicitly: | |
| 60 | ||
| 61 | ```ts | |
| 62 | import { createVtolTransitionProfile } from '../resources/functions/drone/vehicles/vtol/transition-profile' | |
| 63 | import { runVehicleSimulation } from '../resources/functions/drone/vehicles/runtime' | |
| 64 | ||
| 65 | const profile = createVtolTransitionProfile({ electrical: true }) | |
| 66 | profile.faults = (_scenario, atMs) => ({ windMps: atMs >= 1000 ? [2, 0, 0] : [0, 0, 0] }) | |
| 67 | const result = runVehicleSimulation(profile, { seconds: 160 }) | |
| 68 | ``` | |
| 69 | ||
| 70 | The same `[0, 2, 0]` m/s crosswind experiment still reaches the back-transition envelope guard | |
| 71 | without confirmed hover or landing. Its yaw excursion and eventual pitch limit remain an unsupported | |
| 72 | case. Neutral outputs at that airborne failure do not establish a safe landing. Wider wind directions, | |
| 73 | onset phases, planning/heading feasibility and named native/workspace cases remain in | |
| 74 | [#87](https://github.com/stacksjs/drone/issues/87). No arbitrary-wind, measured-airframe or physical | |
| 75 | flight acceptance is claimed. | |
| 76 | ||
| 39 | 77 | The hover demonstration commands the pusher and three surfaces to zero. Calibrated modeled raw |
| 40 | 78 | IMU/GNSS samples feed the owned estimator. The controller receives estimated pose, a current qualified |
| 41 | 79 | raw gyro capture and delayed contact measurements. Plant truth is used for sensor synthesis and |
| @@ -262,9 +300,11 @@ route. A timeout/controller rejection that recovers to contact ends with `vtol-r | ||
| 262 | 300 | |
| 263 | 301 | Landing holds the captured estimated approach height until horizontal position and speed qualify |
| 264 | 302 | descent to the selected site. Actual failed-pusher and expired-back campaigns retain rotor-supported |
| 265 | hover and fresh contact. The original 25-second back-recovery approach/landing case still times out | |
| 266 | airborne. A separately declared 35-second allowance completes after about 26.94 seconds, charged to | |
| 267 | the complete 156,520 ms / 52.1733 Wh worst-case plan. A normal 45-second back plus 45-second recovery | |
| 303 | hover and fresh contact. With nonlinear braking, both the 25-second and 35-second back-recovery | |
| 304 | approach/landing cases reach contact within their declared allowances. They retain complete | |
| 305 | 146,520 ms / 48.84 Wh and 156,520 ms / 52.1733 Wh worst-case plans, respectively. A stricter | |
| 306 | 20-second landing case expires at its exact deadline while still airborne, with a complete | |
| 307 | 141,520 ms / 47.1733 Wh plan. A normal 45-second back plus 45-second recovery | |
| 268 | 308 | hover and 35-second landing exceeds the unchanged 180-second graph cap and is rejected. The phase |
| 269 | 309 | abort/pause/recover campaigns instead declare 40-second recovery hover and 30-second landing, fitting |
| 270 | 310 | 176,520 ms / 58.84 Wh. These remain conservative 1200 W planning charges, without identified electrical |