diff --git a/ROMFS/px4fmu_common/init.d/airframes/13013_deltaquad b/ROMFS/px4fmu_common/init.d/airframes/13013_deltaquad index 594a891482..bea4333607 100644 --- a/ROMFS/px4fmu_common/init.d/airframes/13013_deltaquad +++ b/ROMFS/px4fmu_common/init.d/airframes/13013_deltaquad @@ -34,7 +34,7 @@ param set-default CBRK_IO_SAFETY 22027 param set-default EKF2_GPS_POS_X -0.12 param set-default EKF2_IMU_POS_X -0.12 -param set-default FW_ARSP_MODE 1 +param set-default FW_USE_AIRSPD 0 param set-default NPFG_PERIOD 25 param set-default FW_PR_FF 0.7 param set-default FW_PR_I 0.18 diff --git a/src/lib/parameters/param_translation.cpp b/src/lib/parameters/param_translation.cpp index b438de23a2..bd574475ec 100644 --- a/src/lib/parameters/param_translation.cpp +++ b/src/lib/parameters/param_translation.cpp @@ -42,7 +42,21 @@ bool param_modify_on_import(bson_node_t node) { + // 2023-12-06: translate and invert FW_ARSP_MODE-> FW_USE_AIRSPD + { + if (strcmp("FW_ARSP_MODE", node->name) == 0) { + if (node->i32 == 0) { + node->i32 = 1; + } else { + node->i32 = 0; + } + + strcpy(node->name, "FW_USE_AIRSPD"); + PX4_INFO("copying and inverting %s -> %s", "FW_ARSP_MODE", "FW_USE_AIRSPD"); + return true; + } + } return false; } diff --git a/src/modules/fw_att_control/FixedwingAttitudeControl.cpp b/src/modules/fw_att_control/FixedwingAttitudeControl.cpp index 81be49634e..35632b7aec 100644 --- a/src/modules/fw_att_control/FixedwingAttitudeControl.cpp +++ b/src/modules/fw_att_control/FixedwingAttitudeControl.cpp @@ -150,7 +150,7 @@ float FixedwingAttitudeControl::get_airspeed_constrained() // if no airspeed measurement is available out best guess is to use the trim airspeed float airspeed = _param_fw_airspd_trim.get(); - if ((_param_fw_arsp_mode.get() == 0) && airspeed_valid) { + if (_param_fw_use_airspd.get() && airspeed_valid) { /* prevent numerical drama by requiring 0.5 m/s minimal speed */ airspeed = math::max(0.5f, _airspeed_validated_sub.get().calibrated_airspeed_m_s); diff --git a/src/modules/fw_att_control/FixedwingAttitudeControl.hpp b/src/modules/fw_att_control/FixedwingAttitudeControl.hpp index de03fdfe27..20421f056d 100644 --- a/src/modules/fw_att_control/FixedwingAttitudeControl.hpp +++ b/src/modules/fw_att_control/FixedwingAttitudeControl.hpp @@ -135,7 +135,7 @@ private: (ParamFloat) _param_fw_airspd_min, (ParamFloat) _param_fw_airspd_stall, (ParamFloat) _param_fw_airspd_trim, - (ParamInt) _param_fw_arsp_mode, + (ParamBool) _param_fw_use_airspd, (ParamFloat) _param_fw_man_p_max, (ParamFloat) _param_fw_man_r_max, diff --git a/src/modules/fw_pos_control/FixedwingPositionControl.cpp b/src/modules/fw_pos_control/FixedwingPositionControl.cpp index b8a74c347c..b210b01b66 100644 --- a/src/modules/fw_pos_control/FixedwingPositionControl.cpp +++ b/src/modules/fw_pos_control/FixedwingPositionControl.cpp @@ -205,7 +205,7 @@ FixedwingPositionControl::airspeed_poll() bool airspeed_valid = _airspeed_valid; airspeed_validated_s airspeed_validated; - if ((_param_fw_arsp_mode.get() == 0) && _airspeed_validated_sub.update(&airspeed_validated)) { + if (_param_fw_use_airspd.get() && _airspeed_validated_sub.update(&airspeed_validated)) { _eas2tas = 1.0f; //this is the default value, taken in case of invalid airspeed diff --git a/src/modules/fw_pos_control/FixedwingPositionControl.hpp b/src/modules/fw_pos_control/FixedwingPositionControl.hpp index 85ccfe41f7..16c857e35b 100644 --- a/src/modules/fw_pos_control/FixedwingPositionControl.hpp +++ b/src/modules/fw_pos_control/FixedwingPositionControl.hpp @@ -954,7 +954,7 @@ private: (ParamFloat) _param_nav_gpsf_r, // external parameters - (ParamInt) _param_fw_arsp_mode, + (ParamBool) _param_fw_use_airspd, (ParamFloat) _param_fw_psp_off, diff --git a/src/modules/fw_rate_control/FixedwingRateControl.cpp b/src/modules/fw_rate_control/FixedwingRateControl.cpp index 4d1bab51bd..37c2d98ae0 100644 --- a/src/modules/fw_rate_control/FixedwingRateControl.cpp +++ b/src/modules/fw_rate_control/FixedwingRateControl.cpp @@ -162,7 +162,7 @@ float FixedwingRateControl::get_airspeed_and_update_scaling() // if no airspeed measurement is available out best guess is to use the trim airspeed float airspeed = _param_fw_airspd_trim.get(); - if ((_param_fw_arsp_mode.get() == 0) && airspeed_valid) { + if (_param_fw_use_airspd.get() && airspeed_valid) { /* prevent numerical drama by requiring 0.5 m/s minimal speed */ airspeed = math::max(0.5f, _airspeed_validated_sub.get().calibrated_airspeed_m_s); diff --git a/src/modules/fw_rate_control/FixedwingRateControl.hpp b/src/modules/fw_rate_control/FixedwingRateControl.hpp index 14f4a6427f..ec3b7e1c9e 100644 --- a/src/modules/fw_rate_control/FixedwingRateControl.hpp +++ b/src/modules/fw_rate_control/FixedwingRateControl.hpp @@ -164,7 +164,7 @@ private: (ParamFloat) _param_fw_airspd_min, (ParamFloat) _param_fw_airspd_stall, (ParamFloat) _param_fw_airspd_trim, - (ParamInt) _param_fw_arsp_mode, + (ParamBool) _param_fw_use_airspd, (ParamInt) _param_fw_arsp_scale_en, diff --git a/src/modules/fw_rate_control/fw_rate_control_params.c b/src/modules/fw_rate_control/fw_rate_control_params.c index ee6e194ce3..8493f11c72 100644 --- a/src/modules/fw_rate_control/fw_rate_control_params.c +++ b/src/modules/fw_rate_control/fw_rate_control_params.c @@ -41,16 +41,18 @@ */ /** - * Airspeed mode + * Use airspeed for control * - * On vehicles without airspeed sensor this parameter can be used to - * enable flying without an airspeed reading + * If set to 1, the airspeed measurement data, if valid, is used in the following controllers: + * - Rate controller: output scaling + * - Attitude controller: coordinated turn controller + * - Position controller: airspeed setpoint tracking, takeoff logic + * - VTOL: transition logic * - * @value 0 Use airspeed in controller - * @value 1 Do not use airspeed in controller + * @boolean * @group FW Rate Control */ -PARAM_DEFINE_INT32(FW_ARSP_MODE, 0); +PARAM_DEFINE_INT32(FW_USE_AIRSPD, 1); /** * Pitch rate proportional gain. diff --git a/src/modules/vtol_att_control/standard.cpp b/src/modules/vtol_att_control/standard.cpp index f8eee38ba7..d74ab45f42 100644 --- a/src/modules/vtol_att_control/standard.cpp +++ b/src/modules/vtol_att_control/standard.cpp @@ -217,7 +217,7 @@ void Standard::update_transition_state() _airspeed_trans_blend_margin; // time based blending when no airspeed sensor is set - } else if (_param_fw_arsp_mode.get() || !PX4_ISFINITE(_airspeed_validated->calibrated_airspeed_m_s)) { + } else if (!_param_fw_use_airspd.get() || !PX4_ISFINITE(_airspeed_validated->calibrated_airspeed_m_s)) { mc_weight = 1.0f - _time_since_trans_start / getMinimumFrontTransitionTime(); mc_weight = math::constrain(2.0f * mc_weight, 0.0f, 1.0f); diff --git a/src/modules/vtol_att_control/tailsitter.cpp b/src/modules/vtol_att_control/tailsitter.cpp index ff812f926e..269f9645a4 100644 --- a/src/modules/vtol_att_control/tailsitter.cpp +++ b/src/modules/vtol_att_control/tailsitter.cpp @@ -324,7 +324,7 @@ void Tailsitter::fill_actuator_outputs() bool Tailsitter::isFrontTransitionCompletedBase() { const bool airspeed_triggers_transition = PX4_ISFINITE(_airspeed_validated->calibrated_airspeed_m_s) - && !_param_fw_arsp_mode.get() ; + && _param_fw_use_airspd.get(); bool transition_to_fw = false; const float pitch = Eulerf(Quatf(_v_att->q)).theta(); diff --git a/src/modules/vtol_att_control/tiltrotor.cpp b/src/modules/vtol_att_control/tiltrotor.cpp index 0db029c161..6e023da689 100644 --- a/src/modules/vtol_att_control/tiltrotor.cpp +++ b/src/modules/vtol_att_control/tiltrotor.cpp @@ -243,7 +243,7 @@ void Tiltrotor::update_transition_state() _mc_roll_weight = 1.0f; _mc_yaw_weight = 1.0f; - if (!_param_fw_arsp_mode.get() && PX4_ISFINITE(_airspeed_validated->calibrated_airspeed_m_s) && + if (_param_fw_use_airspd.get() && PX4_ISFINITE(_airspeed_validated->calibrated_airspeed_m_s) && _airspeed_validated->calibrated_airspeed_m_s >= getBlendAirspeed()) { const float weight = 1.0f - (_airspeed_validated->calibrated_airspeed_m_s - getBlendAirspeed()) / (getTransitionAirspeed() - getBlendAirspeed()); @@ -252,7 +252,7 @@ void Tiltrotor::update_transition_state() } // without airspeed do timed weight changes - if ((_param_fw_arsp_mode.get() || !PX4_ISFINITE(_airspeed_validated->calibrated_airspeed_m_s)) && + if ((!_param_fw_use_airspd.get() || !PX4_ISFINITE(_airspeed_validated->calibrated_airspeed_m_s)) && _time_since_trans_start > getMinimumFrontTransitionTime()) { _mc_roll_weight = 1.0f - (_time_since_trans_start - getMinimumFrontTransitionTime()) / (getOpenLoopFrontTransitionTime() - getMinimumFrontTransitionTime()); diff --git a/src/modules/vtol_att_control/vtol_type.cpp b/src/modules/vtol_att_control/vtol_type.cpp index c44582a8dc..2695da5cf2 100644 --- a/src/modules/vtol_att_control/vtol_type.cpp +++ b/src/modules/vtol_att_control/vtol_type.cpp @@ -208,7 +208,7 @@ bool VtolType::isFrontTransitionCompletedBase() { // continue the transition to fw mode while monitoring airspeed for a final switch to fw mode const bool airspeed_triggers_transition = PX4_ISFINITE(_airspeed_validated->calibrated_airspeed_m_s) - && !_param_fw_arsp_mode.get(); + && _param_fw_use_airspd.get(); const bool minimum_trans_time_elapsed = _time_since_trans_start > getMinimumFrontTransitionTime(); const bool openloop_trans_time_elapsed = _time_since_trans_start > getOpenLoopFrontTransitionTime(); diff --git a/src/modules/vtol_att_control/vtol_type.h b/src/modules/vtol_att_control/vtol_type.h index 8e347e1877..c8cecb8fb0 100644 --- a/src/modules/vtol_att_control/vtol_type.h +++ b/src/modules/vtol_att_control/vtol_type.h @@ -354,7 +354,7 @@ protected: (ParamFloat) _param_vt_arsp_trans, (ParamFloat) _param_vt_f_trans_thr, (ParamFloat) _param_vt_arsp_blend, - (ParamBool) _param_fw_arsp_mode, + (ParamBool) _param_fw_use_airspd, (ParamFloat) _param_vt_trans_timeout, (ParamFloat) _param_mpc_xy_cruise, (ParamInt) _param_vt_fw_difthr_en,