(WIP) 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 234 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.
Rewrite VTOL docs and setting descriptions in simpler user-facing language, including clearer explanations for transition behavior, mission USER flags, and smooth mixer handover. Remove nav_vtol_mission_transition_track_distance_cm from user-facing configuration and use a fixed internal MC->FW mission run-up distance instead. Bump PG_NAV_CONFIG after removing the stored nav config field.
…calculated by fwAuthorityScale define USE_AUTO_TRANSITION and end keep auto transition logic off for 512 KB targets to preserve flash space
- improve target fixed-wing servo preview during auto-transition - rename VTOL transition percentage settings to *_min_percent - separate motor ramp timing from transition handoff timing - update CLI-generated and narrative docs to match the behavior
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
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.
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.