4.8 KiB
Bounded native translation experiment
powered-translate is an opt-in WORKBENCH fixture, not a production HQ aircraft driver. The 120245 native run passes 85 assertions with zero captured errors: actual takeoff, bounded translation toward a frozen four-metre target, five-second target hold, contact landing and engine-off. This remains an isolated mechanism, not an operational HQ route. The independently archived 114504 vertical pass does not qualify this new path.
Invoke the existing hidden, muted runner with --project core --smoke powered-translate --rounds 1 --timeout 420 --flight-action-inputs --flight-autohover. The Core fixture must call SetAutohoverMode(true) before its first Tick, as for the selected vertical experiment. Both the runner and probe refuse missing actor-action/autohover selection. Its first native run retained the original safety envelope and completed without position or velocity overrides.
The probe reuses the original finite airframe/pilot, cleared 40m column, measured footprint, native seating, normal engine start, positive/negative collective consumption proofs and five-second 7–9m hover. Only then does stage 5 freeze the actual hover origin and a target four horizontal metres toward the original ground home. Within 0.5m of home it instead uses the current horizontal right axis. The target must remain within five metres of home. Neither home nor the original safety boundaries move. This matters because the archived vertical hover settled about 3.25m from home before landing.
During the new stage, an experimental outer velocity request uses horizontal position error times 0.25, caps desired speed at 0.5m/s, multiplies velocity error by 0.05, and caps the horizontal demand magnitude at 0.03. Current aircraft axes project this request into the same owned actor-local forward/back and right/left actions, each independently capped at 0.03. Native autohover remains the attitude stabilizer; the old custom attitude corrections are discarded. Vertical and yaw control remain unchanged. These gains are experimental requests, not a documented native velocity transfer function or evidence that the aircraft will reach the target.
Within 45 seconds, including settling, the actual aircraft must remain within 0.75m of the frozen target for five continuous seconds, displaced at least 3.25m from the frozen hover origin, with horizontal speed below 0.25m/s, height 7–9m, total speed below 1.5m/s, absolute vertical speed below 0.5m/s, uprightness above 0.98 and no ground contact. A failed predicate or interrupted observation resets the hold. Landing cannot begin without this proof. The original native contact landing, two-second ground stability and engine-off verification follow.
The overall 240-second deadline, original-home drift below 8m, height ceiling 18m, lower height boundary, tilt limit, current ownership/seat/player checks, health/fuel/rotor checks and input freshness/readback gates remain unchanged. No transform, velocity, health, fuel or signal setter was added. A failure retains the existing bounded fixture cleanup and is not converted into a pass or a wider flight envelope.
Telemetry records frozen origin/target, actual position, displacement along/across the intended direction, target error, measured horizontal speed, native input values and the existing MainRotorCyclicForward/MainRotorCyclicAside signals. Those signals must exist before translation starts; native autohover may modify them, so they are observations rather than an equality assertion against raw pilot demand. The origin and target are assigned once, not updated to follow drift.
Installed vanilla evidence is limited but supports this experiment: HelicopterControllerComponent exposes autohover enable/readback without a target-position API; SCR_HelicopterHoverAction uses that enable method; Configs/Tutorial/Courses/Tutorial_HELICOPTER.conf enables autohover before cyclic tilt lessons and later disables it for free flight. SCR_Tutorial_Heli_CYCLIC_FORWARD and SCR_Tutorial_Heli_CYCLIC_RIGHT observe physical pitch/roll signals. This does not establish the response of this Mi-8 to the small demands used here.
tests/test_powered_flight_policy.py executes the actual translation target/demand/guard bodies and stage methods through the existing C++ harness. It covers radial and angular target geometry, the unchanged origin envelope, invalid input combinations, demand saturation and braking direction, target hold boundaries, interruption/reset, immutable target selection, unavailable native signals, repeated begin refusal and the exact 45-second timeout. Vector math and native signal/simulation boundaries are adapters; these tests do not prove Enforce compilation, flight, multiplayer or operational HQ routing.