Implement auto vtol smooth transition state#11553
Conversation
mission WP auto transmision available
…speed-first logic and dynamic scaling - Introduce a common VTOL transition controller path used by: - manual MIXER TRANSITION (edge-triggered mode, optional via manual_vtol_transition_controller) - mission-authorized VTOL transition via nav_vtol_mission_transition_user_action - Keep profile hot-switch safety boundaries intact: - no broad manual mixer switching in active waypoint navigation - switching remains authorized only through transition state handling - Add airspeed-first completion behavior: - MC->FW threshold via vtol_transition_to_fw_min_airspeed_cm_s - FW->MC threshold via vtol_transition_to_mc_max_airspeed_cm_s - timer fallback only when pitot is unavailable/unhealthy - timeout/abort support via vtol_transition_airspeed_timeout_ms - Add optional dynamic mixer scaling (vtol_transition_dynamic_mixer): - pusher contribution ramping - lift throttle scaling (vtol_transition_lift_end_percent) - MC authority scaling (vtol_transition_mc_authority_end_percent) - FW authority blend scaling (vtol_transition_fw_authority_start_percent) - Fix transition scaling/progress details: - pusher ramp uses idle-to-target interpolation - FW->MC progress uses captured transition start airspeed for smooth deceleration-based ramp - Improve transition abort/reset robustness: - clear transition/nav mission transition state on disarm/failsafe/abort paths - avoid blind mission resume after half-complete transition - Add mission VTOL settings and behavior: - nav_vtol_mission_transition_user_action - nav_vtol_mission_transition_min_altitude_cm - nav_vtol_mission_transition_track_distance_cm - mission pause/resume around transition, straight-line MC->FW transition segment - Update documentation: - MixerProfile.md, Navigation.md, VTOL.md - document unified controller, manual semantics, mission semantics, airspeed precedence, dynamic scaling, and CLI usage
…orm target (0=MC, 1=FW) - document dependency on existing mixer profile switching infrastructure (two profiles + MIXER PROFILE 2 mode condition) - update docs: MixerProfile.md, Navigation.md, VTOL.md with behavior, safety boundaries, tuning examples, and CLI reference
|
Thanks for your VTOL contribution to INAV. They will be welcome improvements I have a couple of questions. I noticed you have an edge trigger for the transition switch, along with the legacy 3Pos manual method. I also noticed your addition of Dynamic Scaling. Of which I like the idea. |
|
Great feedback, thank you. On the 3-position manual method question: I agree this can be confusing if not documented clearly, so I should clarify it better in the PR/docs. The intent is not to replace legacy behaviour. The edge-triggered manual controller is optional (manual_vtol_transition_controller), and legacy 3-position/manual behaviour remains available when that setting is OFF. my intention is still to support practical 3-position switch workflow when manual_vtol_transition_controller = ON, not to remove it. Position 1: MC So the goal is to keep familiar switch ergonomics, while making transition execution more deterministic and safer. On the dynamic scaling timer point: I agree this is a good observation. I propose an optional separate setting: vtol_transition_scale_ramp_time_ms with behavior: 0 (default): keep current behavior (backward compatible)
mixer_switch_trans_timer = 5000 ms scaling reaches target levels in about 1.2s (smoother motor startup / less torque step), When pitot is healthy/available, transition progress is airspeed-driven (not timer-driven).
Dynamic mixer scaling (
For transition/pusher motors (
where:
|
Yes I agree with both changes you have proposed. Do you happen to have the RealFlight simulator software to test this with the SITL before an actual flight? I unfortunately don't have it. |
…y/3-pos switch behavior - add new mixer setting `vtol_transition_scale_ramp_time_ms` (default 0) - keep backward compatibility: - `0` => scaling stays coupled to transition progress (existing behavior) - `>0` => pusher/lift/authority scaling uses time-based ramp - keep transition completion logic unchanged: - airspeed-first when pitot is healthy/available - timer fallback via `mixer_switch_trans_timer` when pitot is unavailable/unhealthy - wire new setting into mixer profile config/reset path - update VTOL and MixerProfile docs: - explicitly state intent is not to replace legacy manual behavior - document 3-position workflow with edge-trigger controller - document new ramp timer semantics with practical examples
|
Changes pushed and PR updated. No I do not have RealFlight on my site right now but while ago I tested some scenarios with X-Plane and Alia 250 eVTOL. One more question: Currently I'm using one of User Actions in WP (configurable) for target selection in mission. Do you think this is good approach or is it better to use bit 5 (which is currently reserved) from WP's p3 instead? |
|
Test firmware build ready — commit Download firmware for PR #11553 238 targets built. Find your board's
|
…itch controller setting - Rename per-mixer manual transition setting: - `mixer_manual_vtol_transition_controller` -> `mixer_vtol_manualswitch_autotransition_controller` - Keep per-mixer scope only where profile-specific behavior is intended: - `mixer_vtol_transition_dynamic_mixer` - `mixer_vtol_transition_airspeed_timeout_ms` - `mixer_vtol_transition_scale_ramp_time_ms` - legacy/profile-switch settings (`mixer_automated_switch`, `mixer_switch_trans_*`) - Move these transition tuning parameters from mixer profile scope to global system scope: - `vtol_transition_to_fw_min_airspeed_cm_s` - `vtol_transition_to_mc_max_airspeed_cm_s` - `vtol_transition_lift_end_percent` - `vtol_transition_mc_authority_end_percent` - `vtol_transition_fw_authority_start_percent` - Update transition logic to read moved fields from `systemConfig()` instead of `currentMixerConfig` - Remove moved fields from `mixerConfig_t`; add them to `systemConfig_t` - Bump PG versions for layout changes: - `PG_MIXER_PROFILE`: 2 -> 3 - `PG_SYSTEM_CONFIG`: 7 -> 8 - Update docs and regenerate CLI settings docs: - explicit per-mixer vs global scope notes in VTOL/MixerProfile docs - `docs/Settings.md` regenerated via `update_cli_docs.py`
- remove unused automated-transition artifacts: - drop MIXERAT_PHASE_DONE - drop unused mixerProfileAT fields (transitionInputMixing, transitionStabEndTime, transitionTransEndTime) - fix transition finalize ordering: - apply final progress/scaling before profile hot-switch - avoid final scale computation using post-switch mixer profile config - document airspeed-timeout behavior explicitly: - mixer_vtol_transition_airspeed_timeout_ms applies only in trusted pitot (airspeed-controlled) path - timer fallback path uses mixer_switch_trans_timer when pitot is unavailable/unhealthy - update VTOL and MixerProfile docs with practical test presets: - three English test profiles for VTOL ~1.0m wingspan / ~1720g AUW - legacy-compatible baseline - airspeed-first dynamic scaling - mission-authorized transition integration - add explicit safety guidance for manual RC setup: - require dedicated 3-position switch mapping - warn that overlapping MIXER PROFILE 2 and MIXER TRANSITION modes can cause order-dependent, unpredictable behavior
- recompute manual transition-controller enable flag after potential direct MIXER PROFILE 2 hot-switch in outputProfileUpdateTask(), so per-profile manual-controller config is applied with current profile context
- add new debug mode `VTOL_TRANSITION`
- extend debug enum with `DEBUG_VTOL_TRANSITION`
- register CLI/debug name `VTOL_TRANSITION`
- add settings table entry for `debug_mode`
- instrument VTOL transition controller in mixer_profile task loop:
- debug[0] = phase
- debug[1] = request
- debug[2] = direction
- debug[3] = progress x1000
- debug[4] = pusherScale x1000
- debug[5] = liftScale x1000
- debug[6] = blendToFw x1000
- debug[7] = flags bitfield (active, usedAirspeed, hotSwitchDone, aborted)
- improve controller consistency:
- recompute manual transition-controller enable flag after potential direct
MIXER PROFILE 2 hot-switch so per-profile setting is evaluated in current context
- docs updates (VTOL/MixerProfile):
- clarify direct `MIXER PROFILE 2` path vs controller-driven `MIXER TRANSITION` path
- document airspeed-timeout scope (airspeed-controlled path only)
- recommend non-zero `mixer_switch_trans_timer` fallback for airspeed-first setups
- add explicit 3-position switch mapping warning and note that overlapping
PROFILE2/TRANSITION activation is order-dependent and unpredictable
- add VTOL transition debug mode usage and channel map
- `docs/Settings.md` after debug mode table update
…ssful transition frames remain visible in Blackbox - document VTOL debug mode usage and debug channel meanings
… mode flags - Report MIXER TRANSITION from internal transition activity when manual auto-transition controller is enabled - Report MIXER PROFILE 2 from the currently active mixer profile (not raw RC request) - Preserve legacy MIXER TRANSITION reporting when manual auto-transition controller is disabled
Add global NAV settings for transition failure handling: - nav_vtol_transition_fail_action_mc_to_fw (IDLE/POSH/RTH/EMERGENCY_LANDING) - nav_vtol_transition_fail_action_fw_to_mc (IDLE/LOITER/RTH/EMERGENCY_LANDING/FORCE_SWITCH, default LOITER) - nav_vtol_transition_retry_on_airspeed_timeout Implement one-shot MC->FW retry after airspeed timeout (pitot-gated), including yaw scan/alignment. Handle fail actions in MIXERAT paths (mission and RTH), including FORCE_SWITCH fallback. Expose airspeed-timeout abort reason from mixer transition state. Regenerate settings docs.
… POSHOLD Add step/overall timeouts to MC->FW retry scan, fail retry when no trusted pitot sample is collected, and require valid pitot data before starting retry. Update FW->MC LOITER/FORCE_SWITCH fail-event mapping to POSHOLD_3D and align settings/docs description.
…etry settle timing Suppress direct BOXMIXERPROFILE hot-switch while manual transition trigger is active to prevent FW->MC direction regression. Bump PG_NAV_CONFIG to 9 and make retry settle timing start after heading tolerance is actually reached.
…TION switch OFF edge, за да не сменяме semantics mid-session.
|
I've had a bit of a look through your later commits and the docs you have added. And need to point out a few things. In keeping with consistency. I noticed you have stated in your Docs, the use of Profile 1 for MC and Profile 2 for FW. While the legacy documentation show it to be the other way around. i.e. Profile 1 for FW and Profile 2 for MC.
Does explicit mean it excludes it from working in the legacy way that I mentioned above ? I have also read through your Documents and Setting descriptions. And I have to say they are not easy to follow. I have made a start on rewording your documents for this pull request. And when I have them finished. If you don't mind ? I can post them here to see what you think. I also have a few other function related questions, about your implementation. But I'll ask about that later. |
|
Thanks, this is very helpful feedback. You were right on both points. I had left the newer wording inconsistent with the long-standing VTOL convention used in the older docs. I have now aligned the documentation so it consistently uses:
I also reworded the switch section. “Recommended switch topology (explicit)” was not meant to imply that other arrangements are unsupported. What I wanted to show was a clear 3-position example. The wording now reflects that more clearly, and it also notes that the firmware can still work with the profiles swapped if someone intentionally sets it up that way. I also simplified some of the setup wording in the VTOL docs to make it easier to follow for non-technical users. I agree that VTOL documentation needs to stay as simple and practical as possible, and I’d be happy to incorporate improvements there, including cleanup of older wording where it helps. Feel free to send the function-related questions too when ready. |
That sounds great. Try to think of it from the perspective of someone who has no idea of what your improvements do. Don't assume they understand any of the setting operations, as you do. For example. In your setting explanations and docs. Perhaps use a descriptor like RPM speed ramp-up in place of SCALE. I hope that make sense. |
Use mixer_vtol_transition_scale_ramp_time_ms for MC->FW pusher ramp independently of airspeed progress, so the pusher can reach full authority without being limited by low initial airspeed. Keep lift, MC authority and FW authority scaling on the existing handoff path: airspeed-based when trusted pitot is available, with timer/progress fallback when it is not. Update VTOL and mixer profile docs to describe the split scaling behavior.
Prevent direct manual profile switches and direct transition aborts from using auto-transition servo handoff smoothing. Direct switch now clears transition handoff state and switches immediately to the requested profile. Add blinking VTOL OSD reminders after automatic manual transitions and after NAV/mission handback when the physical mixer switch does not match the active profile. Show MOVE SWITCH TO FW/MC until the pilot confirms the active endpoint, including DJI HD OSD support. Hold the active mixer profile after NAV releases profile ownership if the manual switch is still in transition position or points to a different profile, avoiding an unexpected direct switch when a mission ends or WP mode is disabled. Add unit tests for manual switch reminders, navigation handback hold/clear logic, and remove the obsolete direct-switch servo hold test.
|
PR is stable for final testing. Everyone are welcome to try. |
|
Does it have OSD system messages to inform us of when a state is in operation or complete?
This will be extremely helpful. |
|
Yes, system osd messages are available after latest commits. |
Add target-profile output smoothing for auto-transition cases where the active mixer does not own the final transition output yet. - Preview target MC tilt-servo transition/static output during FW->MC when the FW profile has no transition-linked rule for that servo - Smooth target-only MC lift/tail motor output from the current real output toward the target MC lift output during FW->MC - Keep old lift/pusher motor shutdown smoothing after profile hot-switch - Add VTOL transition OSD/debug wait reasons for FW->MC: WAIT MC SPEED, NO SPEED, MC SPEED HIGH - Clarify hardware pitot vs Virtual Pitot timer fallback behavior - Clarify lift base throttle vs MC stabilisation authority settings - Document manual throttle considerations during VTOL transitions
Treat an explicitly configured PITOT_VIRTUAL with a valid airspeed estimate as a usable VTOL transition airspeed source. Apply the shared usable airspeed check to manual auto transitions, FW->MC low-speed protection, hot-switch readiness, and mission/RTH/failsafe transition retry logic. Keep timer fallback behavior when no usable airspeed source is available, and avoid using failed or missing pitot readings. Update VTOL, mixer profile, settings YAML, and generated Settings docs to explain real pitot vs virtual pitot behavior.
|
@mart1npetroff I've been going over your code and docs. And I have to say, you are covering all the bases with this PR. I'm presently setting up a plane for ground testing, and altering my Diff to suit these changes. I'm not sure when I will get out to flight test it, because its winter here. With the whether not being too good. Plus, I don't want to rush this. I want to understand what each settings is doing in its fullness. |
Introduce vtol_autotransition_always so an armed manual VTOL profile switch can start the auto-transition controller instead of directly switching profiles, while keeping disarmed direct switching available for bench and preflight checks. Add transition helper tests for profile-switch autotransition gating, owned-state exclusion, disarmed direct switching, and aborting back to the current profile before hot-switch. Report abort result more clearly with FW/MC-specific OSD messages, and document the two-position workflow, instant FW->MC setup, and which source mixer profile owns each transition direction's settings.
- add MC/FW automatic transition state machine for manual and mission requests - blend pusher, lift, MC/FW authority, target surfaces, and transition servo outputs - preserve immediate direct switching and legacy behavior when the controller is disabled - handle aborts, retries, failsafe paths, profile changes, and completed mission waypoint advance - avoid post-transition loiter when a valid mission transition temporarily climbs above its waypoint altitude - add transition debug/OSD visibility, unit coverage, and detailed VTOL/settings documentation
|
Fully autonomous flight including: MC take off, MC->FW transition, FW flight, FW->MC transition, RTH and landing. |
|
Bravo, you’ve done a truly colossal amount of work. Does it also work with tailsitters ? If it does, I absolutely have to give it a try. |
|
I would like to integrate the PR into the iNav 9.1 version for an AtomRC F405 Navi. Do you think that's possible ? |
I think back-porting this back to 9.1 would be quite a bit of work. Any reason not to try this branch? Or maintenance-10.x when this is ready to merge? |
Does this work for a tailsitter ? |
I installed the firmware he suggested, but before trying it, I'd like to know if it will work with a tailsitter. |
With the current implementation, it is not safe to test the new auto-transition controller on a tailsitter in flight. The functionality has been developed and tested on tilt-motor and pusher VTOL configurations. |
|
Entering CLI Mode, type 'exit' to return, or 'help' # Building AutoComplete Cache...Done!get mixer_vtol_manualswitch_autotransition_controllermixer_vtol_manualswitch_autotransition_controller = ON get vtolmixer_vtol_transition_dynamic_mixer = OFF mixer_vtol_manualswitch_autotransition_controller = ON mixer_vtol_transition_airspeed_timeout_ms = 0 mixer_vtol_transition_scale_ramp_time_ms = 0 nav_vtol_mission_transition_user_action = OFF nav_vtol_mission_transition_min_altitude_cm = 0 nav_vtol_transition_retry_on_airspeed_timeout = OFF nav_vtol_transition_fail_action_mc_to_fw = IDLE nav_vtol_transition_fail_action_fw_to_mc = LOITER vtol_transition_to_fw_min_airspeed_cm_s = 0 vtol_transition_to_mc_max_airspeed_cm_s = 0 vtol_fw_to_mc_auto_switch_airspeed_cm_s = 0 vtol_transition_lift_min_percent = 100 vtol_transition_mc_authority_min_percent = 100 vtol_transition_fw_authority_min_percent = 100 vtol_mc_protection_mode = OFF vtol_mc_thr_reserve_percent = 15 Show less Diagnosed firmware gap and weighed reflash versus Workaround Paths So it's confirmed: your build contains everything that was added up to ~end of June (the MC protection from June 15th, the renaming to _min_percent…), but not the commit from July 3rd which specifically introduced the 2-position mode. The "Jul 8" label on your firmware is misleading on this point. Nothing needs correcting in the file: the name is correct, it's just missing from your binary. Your GET also confirms my choices: all three airspeed thresholds are at 0 → timer completion, which is exactly the correct benchmark behavior without me having to invent any speeds. Two paths, the choice is yours: A. You want the true 2-position (position = desired mode). Reflash the latest pr-test-builds (Full Chip Erase). My 2-position file will work as is, without any changes. This is the only way to achieve this ergonomics. B. You test now without reflashing → 3-position. And good news: your diff from July 8th already has the correct aux wiring (PROFILE 2 at 1300-2100, TRANSITION at 1300-1700, the correct overlap), and your controller is already ON. Almost nothing is missing for smooth transitions to work on this build, via the middle position. I'll regenerate a clean 3-position file from your ATOMRC diff in 30 seconds. A "pure" 2-position switch isn't properly implemented on your current build (the only workaround would be to pulse MIXER TRANSITION on a 2-position switch, but that's a relative toggle, not a mode selection—fiddly in flight, I don't recommend it). |
|
A firmware update would be needed for the automatic transition to work on a 2-position switch; with the higher firmware versions, the 2-position mode cannot function. |
Thanks for the detailed and honest reply — understood on all points, especially that FW->MC is the risky direction on a tailsitter and that the orientation change hasn't been designed or validated for it yet. I'm happy to act as the initial test pilot for the tailsitter case, and I'll follow a strict bench-first, props-off methodology, only progressing to very cautious flight once each stage is confirmed safe. I'll re-read VTOL.md thoroughly before touching anything. My platform:
After every run I can provide: Blackbox logs (with debug_mode = VTOL_TRANSITION), a full diff all, and video showing the model, the Configurator horizon, and the OSD messages. If you can prepare an initial manual-test build for a tailsitter, I'll start on the bench with orientation and mixing-sign checks, then armed transitions beginning with MC->FW, and leave FW->MC for last and most cautiously. Could you let me know which commit/build to flash, and whether there's any specific debug channel or test sequence you'd like me to capture first? Happy to iterate step by step. |
- ignore manual mixer-profile and transition switch edges while navigation owns a mission, RTH, landing, or protection-driven transition - report effective mixer profile and transition state in Active Modes instead of reflecting an ignored RC switch position - smooth confirmed airspeed-progress changes in both directions to prevent common lift/authority steps from noisy airspeed samples - preserve output continuity when FW->MC enables new lift motors, while bounding their PID handoff to a short safe interval - add a mission MC capture state after FW->MC when a non-advanceable waypoint must be resumed, holding the current position until momentum decays before rebasing waypoint geometry - treat a successful FW->MC FORCE_SWITCH as reaching the requested profile, allowing an already accepted normal waypoint to advance - keep HOLD, LAND, altitude-incomplete, sensor-loss, abort, mode-change, and waypoint-jump paths safe and non-leaking - add focused unit coverage for transition policy, airspeed progress, motor handoff, mission capture, abort, and force-switch decisions
Add an isolated first tailsitter transition path for the canonical AIRPLANE <-> MULTIROTOR orientation-offset profile pair. FW-to-MC now requires valid airspeed below the configured MC limit, does not fall back to the transition timer, and aborts safely on airspeed timeout. After the MC hot-switch, retain the 45-degree tailsitter target until the MC attitude is captured and stable. Reverse requests during the capture phase use the existing MC-to-FW transition path instead of a direct profile switch. Keep dynamic mixer, mission, RTH, landing, failsafe, low-speed protection, and VTOL MC protection disabled for tailsitters in this first version. Add OSD capture status, focused unit coverage, and tailsitter configuration documentation.
|
Please test this on the bench first, with propellers removed. This is the first experimental tailsitter auto-transition implementation. (latest changes are pushed) Example profile layout: Use safe values appropriate for the airframe. The values above mean: Before any flight: |
Thanks a lot 🙏. Is there new firmware available for testing ? Or do I need to compile the new firmware myself ? |
|
I'm satisfied how it works, I attahed config, it's a good base for asjust transition to be more smoother. |
- wait for the manual switch to match the active profile after NAV handback - maintain heading during mission MC-to-FW transitions and retries - latch a successful landing settle and restart it only after unsafe drift or attitude - keep the VTOL PosHold capture target one-shot and out of pilot/NAV-owned targets - add regression coverage for handback, landing, and capture edge cases
PR #11553 Summary: Smooth VTOL Auto-Transition Controller
This PR adds a smooth VTOL transition controller for aircraft that switch between a fixed-wing mixer profile and a multicopter mixer profile.
Please use latest docs version and specially docs/VTOL.md for main guideline for setup and testing.
The description bellow could be outdated and could contain obsolete settings from old PR commits.
The goal is to keep the existing VTOL mixer-profile workflow usable, while making transitions less abrupt, more airspeed-aware, and safer during both manual and mission-triggered operation.
At a high level, this PR adds:
USE_AUTO_TRANSITIONgating so smaller flash targets can keep the pre-existing transition behavior.This PR does not implement target fixed-wing throttle preview or tilt-motor propulsion blending. Pusher throttle during transition still uses the existing transition pusher throttle convention from the MC mixer profile but with dynamic scaling.
Legacy behavior vs current PR behavior
In this summary, “legacy” means the behavior that existed before this PR.
Before this PR:
MIXER PROFILE 2directly selected mixer profile 2 while active.The default mixer profile was profile 1.
Existing VTOL examples commonly used:
MIXER TRANSITIONwas used as a transition-mixing input, typically overlapping withMIXER PROFILE 2in the middle switch position.A common switch layout was:
With this PR, when the new auto-transition controller is enabled,
MIXER TRANSITIONbecomes an edge-triggered transition request. The transition controller decides the direction from the current active profile and performs the profile hot-switch when the transition completes.When the auto-transition controller is disabled, manual transition should keep the pre-existing behavior.
Example switch topology
This PR should support the long-standing VTOL profile order and overlap-style switch topology used by existing VTOL examples:
Example 3-position switch:
The important part is the middle position:
With the new auto-transition controller enabled,
MIXER TRANSITIONis treated as a transition request edge. The controller determines the transition direction from the current active profile:During an active auto transition session, the transition controller temporarily owns the profile-switch decision. This prevents the direct
MIXER PROFILE 2path from immediately overriding the requested smooth transition while the transition is still active.Example: FW->MC using the overlap topology
Example: MC->FW using the overlap topology
This overlap topology is important because it matches the established VTOL workflow and user expectations.
Automated transition controller
The optional automated controller is enabled with:
When enabled, auto
MIXER TRANSITIONbecomes edge-triggered:The setting should be enabled in both mixer profiles used for VTOL switching.
The controller has a session latch so that the transition does not unexpectedly change behavior immediately after the profile hot-switch. This matters because mixer settings are profile-specific, but an active transition session must remain consistent across the source and destination profiles.
Direct profile switching vs transition-controller switching
The current PR keeps two separate paths:
During an active auto transition session, the transition controller owns profile switching.
Outside an active transition session, direct
MIXER PROFILE 2selection remains available.This distinction is important for the overlap topology. In the middle switch position, both
MIXER PROFILE 2andMIXER TRANSITIONcan be active. The controller must prevent the direct profile-switch path from immediately defeating the requested smooth transition.Mission-authorized VTOL transitions
This PR adds mission-authorized VTOL transitions through a configured waypoint USER action bit:
The selected USER bit acts as an absolute target selector on each navigable waypoint:
This is not a toggle. It is a per-waypoint target-state declaration.
Example:
During mission transition, mission progression pauses while the transition is in progress and resumes only after transition completion.
Airspeed-first completion
For MC->FW transitions, this PR can use trusted pitot airspeed as the primary completion condition.
Example:
Behavior:
If pitot is unavailable or unhealthy, or the configured threshold is disabled, transition completion falls back to the configured timer path.
The key point is that airspeed is used for transition completion only when trusted pitot data is available.
Timer fallback and airspeed timeout
The PR distinguishes between:
and:
They serve different purposes.
mixer_switch_trans_timeris the fallback completion timer. It is used when airspeed-controlled completion is not active.mixer_vtol_transition_airspeed_timeout_msis an abort timeout for the airspeed-controlled path. It only applies while the controller is waiting for trusted pitot airspeed to satisfy the transition threshold.Example:
For airspeed-first setups, reviewers should check that the fallback timer is non-zero and reasonable, so pitot-loss fallback does not complete immediately.
Dynamic transition scaling
The PR adds optional dynamic scaling:
When enabled, transition progress can scale:
The current setting names use “min” semantics, for example:
These values should be understood as minimum/floor authority values.
Example:
The optional scale ramp timer controls the ramping of transition scaling independently from airspeed completion. For example, forward propulsion can ramp in quickly while the final MC->FW hot-switch still waits for airspeed.
Target fixed-wing stabilized servo preview
The PR adds new servo input sources:
These are intended for fixed-wing control surfaces that should become active during MC->FW transition before the actual profile hot-switch.
Example:
For FW->MC, matching FW stabilized authority fades down instead of being removed abruptly.
This preview is intended to approximate the target FW control behavior closely enough for a smoother transition.
Tilt servos and transition geometry
Tilt servos, nacelles, and other mechanical transition geometry should continue to use:
This is the transition-progress input.
Example:
The new
INPUT_AUTOTRANSITION_TARGET_STABILIZED_*inputs are not for tilt geometry. They are for stabilized fixed-wing control outputs such as elevator, aileron, or rudder-like surfaces.Pusher throttle behavior
This PR keeps the existing transition pusher throttle model.
Dedicated transition pusher behavior still uses the existing MC mixer throttle convention but adds dynamic scaling , for example:
This PR does not add:
Those features are intentionally out of scope for this PR because PR is big enough so far and they require mixer Configurator UI changes.
Future work could add explicit target-FW propulsion preview:
But that will be a separate PR later. Current testing with pusher VTOL is giving great results even with throttle value between -1 and -2 in mixer.
Low-speed FW->MC protection
The PR adds optional low-speed FW->MC protection:
When configured, if the aircraft is in FW mode, valid pitot is available, and airspeed drops below the configured threshold, the controller can request a smooth FW->MC transition automatically.
Example:
This latch is important for the overlap topology, because the RC switch may still physically indicate the previous stable profile position when the protection transition completes.
Mission MC->FW retry and fail actions
The PR adds configurable retry behavior for mission MC->FW transitions that abort due to airspeed timeout.
Example:
The retry scan includes safeguards:
Fail actions are configurable separately for MC->FW and FW->MC failures. The current PR should ensure that “LOITER” style FW->MC failure behavior maps to a local position-hold style behavior, not an unexpected RTH path.
Those retries and fail actions are implemented mainly to provide stable "PLAN B, C..." in case when automated mission is executing and one of both (lift motors or pusher) fails for some reason (blown motor for example)
USE_AUTO_TRANSITION gating
The smooth transition functionality is conditionally compiled behind:
The intended split is:
Reviewers should verify both build paths:
This is one of the most important review areas because the PR adds conditional fields, settings, enums, and code paths.
Practical examples
Example 1: Existing overlap-style VTOL switch
This is the example reviewers should keep in mind when checking auto transition behavior.
Example 2: MC->FW with airspeed-first completion
Example 3: FW->MC from the same switch topology
Example 4: Tilt servo transition geometry
Example 5: Target-FW elevator preview
Out of scope:
Do not expect target-FW throttle preview or tilt-motor propulsion blending in this PR.