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.
No description provided.