From 9a2b57ca824ba6036c74a89f127d0cb5fdf40011 Mon Sep 17 00:00:00 2001 From: Eurus <105340988+AkaiEurus@users.noreply.github.com> Date: Sun, 31 May 2026 02:36:56 +0800 Subject: [PATCH] fix(fw_latlon): align airspeed load factor (#27519) --- .../FwLateralLongitudinalControl.cpp | 21 ++++--------------- .../FwLateralLongitudinalControl.hpp | 3 +-- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/src/modules/fw_lateral_longitudinal_control/FwLateralLongitudinalControl.cpp b/src/modules/fw_lateral_longitudinal_control/FwLateralLongitudinalControl.cpp index 20ca60e0bbd..6600629bc14 100644 --- a/src/modules/fw_lateral_longitudinal_control/FwLateralLongitudinalControl.cpp +++ b/src/modules/fw_lateral_longitudinal_control/FwLateralLongitudinalControl.cpp @@ -607,13 +607,13 @@ void FwLateralLongitudinalControl::updateAttitude() { _long_control_state.pitch_rad = euler_angles.theta(); _yaw = euler_angles.psi(); - const float load_factor_from_bank_angle = 1.0f / max(cosf(euler_angles.phi()), FLT_EPSILON); + _load_factor_from_bank_angle = 1.0f / max(cosf(euler_angles.phi()), FLT_EPSILON); // Used to compensate for higher induced drag during banking - _tecs.set_load_factor(load_factor_from_bank_angle); + _tecs.set_load_factor(_load_factor_from_bank_angle); // Used to give underspeed mitigation the correct minimum airspeed _tecs.set_equivalent_airspeed_min( - _performance_model.getMinimumCalibratedAirspeed(load_factor_from_bank_angle, _flaps_setpoint) + _performance_model.getMinimumCalibratedAirspeed(_load_factor_from_bank_angle, _flaps_setpoint) ); } } @@ -649,7 +649,7 @@ float FwLateralLongitudinalControl::adapt_airspeed_setpoint(const float control_interval, float calibrated_airspeed_setpoint, float calibrated_min_airspeed_guidance, float wind_speed) { - float system_min_airspeed = _performance_model.getMinimumCalibratedAirspeed(getLoadFactor(), _flaps_setpoint); + float system_min_airspeed = _performance_model.getMinimumCalibratedAirspeed(_load_factor_from_bank_angle, _flaps_setpoint); const float system_max_airspeed = _performance_model.getMaximumCalibratedAirspeed(); @@ -853,19 +853,6 @@ void FwLateralLongitudinalControl::updateLongitudinalControlConfiguration(const } } -float FwLateralLongitudinalControl::getLoadFactor() const -{ - float load_factor_from_bank_angle = 1.f; - - const float roll_body = Eulerf(Quatf(_att_sp.q_d)).phi(); - - if (PX4_ISFINITE(roll_body)) { - load_factor_from_bank_angle = 1.f / math::max(cosf(roll_body), FLT_EPSILON); - } - - return load_factor_from_bank_angle; -} - extern "C" __EXPORT int fw_lat_lon_control_main(int argc, char *argv[]) { return ModuleBase::main(FwLateralLongitudinalControl::desc, argc, argv); diff --git a/src/modules/fw_lateral_longitudinal_control/FwLateralLongitudinalControl.hpp b/src/modules/fw_lateral_longitudinal_control/FwLateralLongitudinalControl.hpp index 9aae9387fd5..9cf728efc8a 100644 --- a/src/modules/fw_lateral_longitudinal_control/FwLateralLongitudinalControl.hpp +++ b/src/modules/fw_lateral_longitudinal_control/FwLateralLongitudinalControl.hpp @@ -201,6 +201,7 @@ private: vehicle_attitude_setpoint_s _att_sp{}; bool _landed{false}; float _can_run_factor{0.f}; + float _load_factor_from_bank_angle{1.f}; SlewRate _airspeed_slew_rate_controller; perf_counter_t _loop_perf; // loop performance counter @@ -248,8 +249,6 @@ private: void updateControllerConfiguration(hrt_abstime now); - float getLoadFactor() const; - /** * @brief Returns an adapted calibrated airspeed setpoint *