Skip to content

feat(vtol_att_control): increase front transition throttle to compensate for weight ratio#27900

Open
mbjd wants to merge 1 commit into
mainfrom
pr-adapt-transition-throttle-for-weight
Open

feat(vtol_att_control): increase front transition throttle to compensate for weight ratio#27900
mbjd wants to merge 1 commit into
mainfrom
pr-adapt-transition-throttle-for-weight

Conversation

@mbjd

@mbjd mbjd commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Problem

VTOL Transitions to FW are parameterised such that a significant weight ratio change requires re-tuning of some parameters. Currently:

  • VT_F_TRANS_THR is always the literal throttle used
  • VT_ARSP_TRANS is scaled by sqrt(weight ratio)
  • Transition times (VT_F_TRANS_OL_TM, VT_TRANS_TIMEOUT, VT_TRANS_MIN_TM) are only scaled with air density (^1.5) but not weight

This results in quite inconsistent behaviour. For a heavier vehicle:

  • We need a higher airspeed by sqrt(WR), but throttle and time params are the same
  • Acceleration decreases by WR assuming same force, and actual time to same airspeed too
  • So time to reach transition airspeed actually increases by WR^1.5, requiring manual re-tuning for substantial WR changes

Solution:

  • Scale throttle with sqrt(WR). Assuming quadratic throttle->thrust force mapping, This removes most of the discrepancy and reduces it to a factor of sqrt(WR)
  • This remaining factor is removed by scaling all transition times with sqrt(WR) as well

Main risk: Front transition is where we draw the most power, even more so at a heavy weight ratio. This increases peak power draw momentarily on those setups.

Tiltrotor and tailsitter are only affected in so far as the transition times are increased by sqrt(WR). We add no explicit weight compensation for those vehicles, as it is already approximately done by the hover thrust estimator.

Changelog Entry

Standard VTOL: Compensate transition throttle and transition times for weight ratio for more uniform transition across vehicle weights

…ate for weight ratio

Currently:
 - VT_F_TRANS_THR is always the literal throttle used
 - VT_ARSP_TRANS is scaled by sqrt(weight ratio =: WR)
 - Transition times (VT_F_TRANS_OL_TM, VT_TRANS_TIMEOUT,
   VT_TRANS_MIN_TM) are only scaled with air density (^1.5) but not
   weight

This results in quite inconsistent behaviour. A heavier vehicle will:
 - Need a higher airspeed by sqrt(WR), but throttle and time params are
   the same
 - Acceleration decreases by WR assuming same force, and actual time to
   same airspeed too
 - So time to reach transition airspeed actually increases by WR^1.5

To fix this:
 - Scale throttle with sqrt(WR). Assuming quadratic throttle->thrust
   force mapping, This removes most of the discrepancy and reduces it to
   a factor of sqrt(WR)
 - This remaining factor is removed by scaling all transition times with
   sqrt(WR) as well
@github-actions github-actions Bot added kind:feature Request or change that adds new functionality. scope:control Rate, attitude, position, allocation, or actuator control. scope:parameters Parameter definitions, metadata, migration, or defaults. vehicle:vtol VTOL-specific behavior. labels Jul 14, 2026
@mbjd mbjd requested a review from RomanBapst July 14, 2026 16:22
@github-actions

Copy link
Copy Markdown
Contributor

🔎 FLASH Analysis

px4_fmu-v5x [Total VM Diff: 96 byte (0 %)]
    FILE SIZE        VM SIZE    
 --------------  -------------- 
  +0.0%     +96  +0.0%     +96    .text
    [NEW]     +84  [NEW]     +84    VtolType::getWeightRatio()
    [NEW]     +38  [NEW]     +38    VtolType::getFrontTransitionThrottle()
    +0.0%     +28  +0.0%     +28    g_cromfs_image
     +16%     +16   +16%     +16    VtolType::getFrontTransitionTimeFactor()
    +0.9%      +8  +0.9%      +8    Standard::update_transition_state()
    +4.8%      +4  +4.8%      +4    FlightTask
   -25.0%      -2 -25.0%      -2    VtolType::getBlendAirspeed()
    -4.8%      -4  -4.8%      -4    write_user_stack.constprop.0
   -79.2%     -76 -79.2%     -76    VtolType::getTransitionAirspeed()
  +0.0%     +66  [ = ]       0    .debug_abbrev
  +0.0%     +16  [ = ]       0    .debug_aranges
  +0.0%     +56  [ = ]       0    .debug_frame
  +0.0%    +323  [ = ]       0    .debug_info
  +0.0%    +147  [ = ]       0    .debug_line
  +0.0%     +16  [ = ]       0    .debug_loclists
  +0.0%     +30  [ = ]       0    .debug_rnglists
    [NEW]      +2  [ = ]       0    [Unmapped]
    +0.0%     +28  [ = ]       0    [section .debug_rnglists]
  +0.0%    +138  [ = ]       0    .debug_str
  +0.0%     +76  [ = ]       0    .strtab
    [NEW]     +44  [ = ]       0    VtolType::getFrontTransitionThrottle()
    [NEW]     +32  [ = ]       0    VtolType::getWeightRatio()
   -32.7%     -16  [ = ]       0    __nxsched_add_prioritized_veneer
     +64%     +16  [ = ]       0    __param_get_index_veneer
  +0.0%     +64  [ = ]       0    .symtab
     +50%     +16  [ = ]       0    Standard
     +33%     +16  [ = ]       0    Standard::update_transition_state()
    +100%     +16  [ = ]       0    VtolType::getBlendAirspeed()
    [NEW]     +32  [ = ]       0    VtolType::getFrontTransitionThrottle()
   -33.3%     -16  [ = ]       0    VtolType::getTransitionAirspeed()
    [NEW]     +48  [ = ]       0    VtolType::getWeightRatio()
   -25.0%     -16  [ = ]       0    VtolType::isFrontTransitionCompletedBase()
    -0.3%     -32  [ = ]       0    [section .symtab]
   -40.0%     -32  [ = ]       0    __nxsched_add_prioritized_veneer
     +67%     +32  [ = ]       0    __param_get_index_veneer
  -1.1%     -96  [ = ]       0    [Unmapped]
  +0.0%    +932  +0.0%     +96    TOTAL

px4_fmu-v6x [Total VM Diff: 96 byte (0 %)]
    FILE SIZE        VM SIZE    
 --------------  -------------- 
  +0.0%     +96  +0.0%     +96    .text
    [NEW]     +84  [NEW]     +84    VtolType::getWeightRatio()
    [NEW]     +38  [NEW]     +38    VtolType::getFrontTransitionThrottle()
    +0.0%     +24  +0.0%     +24    g_cromfs_image
     +16%     +16   +16%     +16    VtolType::getFrontTransitionTimeFactor()
    +0.9%      +8  +0.9%      +8    Standard::update_transition_state()
    +0.0%      +8  +0.0%      +8    [section .text]
   -25.0%      -2 -25.0%      -2    VtolType::getBlendAirspeed()
    -4.8%      -4  -4.8%      -4    write_user_stack.constprop.0
   -79.2%     -76 -79.2%     -76    VtolType::getTransitionAirspeed()
  +0.0%     +66  [ = ]       0    .debug_abbrev
  +0.0%     +16  [ = ]       0    .debug_aranges
  +0.0%     +56  [ = ]       0    .debug_frame
  +0.0%    +323  [ = ]       0    .debug_info
  +0.0%    +147  [ = ]       0    .debug_line
  +0.0%     +16  [ = ]       0    .debug_loclists
  +0.0%     +30  [ = ]       0    .debug_rnglists
    [NEW]      +2  [ = ]       0    [Unmapped]
    +0.0%     +28  [ = ]       0    [section .debug_rnglists]
  +0.0%    +138  [ = ]       0    .debug_str
  +0.0%     +76  [ = ]       0    .strtab
    [NEW]     +44  [ = ]       0    VtolType::getFrontTransitionThrottle()
    [NEW]     +32  [ = ]       0    VtolType::getWeightRatio()
  +0.0%     +64  [ = ]       0    .symtab
     +50%     +16  [ = ]       0    Standard
     +33%     +16  [ = ]       0    Standard::update_transition_state()
    +100%     +16  [ = ]       0    VtolType::getBlendAirspeed()
    [NEW]     +32  [ = ]       0    VtolType::getFrontTransitionThrottle()
   -33.3%     -16  [ = ]       0    VtolType::getTransitionAirspeed()
    [NEW]     +48  [ = ]       0    VtolType::getWeightRatio()
   -25.0%     -16  [ = ]       0    VtolType::isFrontTransitionCompletedBase()
    -0.3%     -32  [ = ]       0    [section .symtab]
  -1.6%     -96  [ = ]       0    [Unmapped]
  +0.0%    +932  +0.0%     +96    TOTAL

Updated: 2026-07-14T16:27:04

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

kind:feature Request or change that adds new functionality. scope:control Rate, attitude, position, allocation, or actuator control. scope:parameters Parameter definitions, metadata, migration, or defaults. vehicle:vtol VTOL-specific behavior.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant