Skip to content

Commit 3779acb

Browse files
committed
chore(tecs): remove TECS airspeed filter parameters
These parameters are never tuned by the end-user, so we can use constants instead. Now the Kalman gain can be computed once at compile time.
1 parent 2828162 commit 3779acb

File tree

5 files changed

+22
-68
lines changed

5 files changed

+22
-68
lines changed

src/lib/tecs/TECS.cpp

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -103,31 +103,18 @@ void TECSAirspeedFilter::update(const float dt, const Input &input, const Param
103103
new_state_predicted(0) = _airspeed_state.speed + dt * _airspeed_state.speed_rate;
104104
new_state_predicted(1) = _airspeed_state.speed_rate;
105105

106-
const float airspeed_noise_inv{1.0f / param.airspeed_measurement_std_dev};
107-
const float airspeed_rate_noise_inv{1.0f / param.airspeed_rate_measurement_std_dev};
108-
const float airspeed_rate_noise_inv_squared_process_noise{airspeed_rate_noise_inv *airspeed_rate_noise_inv * param.airspeed_rate_noise_std_dev};
109-
const float denom{airspeed_noise_inv + airspeed_rate_noise_inv_squared_process_noise};
110-
const float common_nom{std::sqrt(param.airspeed_rate_noise_std_dev * (2.0f * airspeed_noise_inv + airspeed_rate_noise_inv_squared_process_noise))};
111-
112-
matrix::Matrix<float, 2, 2> kalman_gain;
113-
kalman_gain(0, 0) = airspeed_noise_inv * common_nom / denom;
114-
kalman_gain(0, 1) = airspeed_rate_noise_inv_squared_process_noise / denom;
115-
kalman_gain(1, 0) = airspeed_noise_inv * airspeed_noise_inv * param.airspeed_rate_noise_std_dev / denom;
116-
kalman_gain(1, 1) = airspeed_rate_noise_inv_squared_process_noise * common_nom / denom;
117-
118106
const matrix::Vector2f innovation{(airspeed - new_state_predicted(0)), (airspeed_derivative - new_state_predicted(1))};
107+
119108
matrix::Vector2f new_state;
120-
new_state = new_state_predicted + dt * (kalman_gain * (innovation));
109+
new_state(0) = new_state_predicted(0) + dt * (kKg00 * innovation(0) + kKg01 * innovation(1));
110+
new_state(1) = new_state_predicted(1) + dt * (kKg10 * innovation(0) + kKg11 * innovation(1));
121111

122112
// Clip airspeed at zero
123113
if (new_state(0) < FLT_EPSILON) {
124114
new_state(0) = 0.0f;
125115
// calculate input that would result in zero speed.
126-
const float desired_airspeed_innovation = (-new_state_predicted(0) / dt - kalman_gain(0,
127-
1) * innovation(1)) / kalman_gain(0,
128-
0);
129-
new_state(1) = new_state_predicted(1) + dt * (kalman_gain(1, 0) * desired_airspeed_innovation + kalman_gain(1,
130-
1) * innovation(1));
116+
const float desired_airspeed_innovation = (-new_state_predicted(0) / dt - kKg01 * innovation(1)) / kKg00;
117+
new_state(1) = new_state_predicted(1) + dt * (kKg10 * desired_airspeed_innovation + kKg11 * innovation(1));
131118
}
132119

133120
// Update states

src/lib/tecs/TECS.hpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,6 @@ class TECSAirspeedFilter
7070
*/
7171
struct Param {
7272
float equivalent_airspeed_trim; ///< the trim value of the equivalent airspeed [m/s].
73-
float airspeed_measurement_std_dev; ///< airspeed measurement standard deviation in [m/s].
74-
float airspeed_rate_measurement_std_dev;///< airspeed rate measurement standard deviation in [m/s²].
75-
float airspeed_rate_noise_std_dev; ///< standard deviation on the airspeed rate deviation in the model in [m/s²].
7673
};
7774

7875
/**
@@ -116,6 +113,23 @@ class TECSAirspeedFilter
116113
private:
117114
// States
118115
AirspeedFilterState _airspeed_state{.speed = 0.0f, .speed_rate = 0.0f}; ///< Complimentary filter state
116+
117+
static constexpr float kAirspeedMeasurementStdDev{0.07f}; ///< Airspeed measurement standard deviation [m/s].
118+
static constexpr float kAirspeedRateMeasurementStdDev{0.2f}; ///< Airspeed rate measurement standard deviation [m/s²].
119+
static constexpr float kAirspeedRateNoiseStdDev{0.2f}; ///< Standard deviation of the airspeed rate process noise [m/s²].
120+
121+
// Intermediate values for the steady-state Kalman gain (all compile-time constants)
122+
static constexpr float _kNoiseInv{1.0f / kAirspeedMeasurementStdDev};
123+
static constexpr float _kRateNoiseInv{1.0f / kAirspeedRateMeasurementStdDev};
124+
static constexpr float _kRateInvSqProc{_kRateNoiseInv *_kRateNoiseInv * kAirspeedRateNoiseStdDev};
125+
static constexpr float _kDenom{_kNoiseInv + _kRateInvSqProc};
126+
static constexpr float _kCommonNom{__builtin_sqrtf(kAirspeedRateNoiseStdDev * (2.0f * _kNoiseInv + _kRateInvSqProc))};
127+
128+
/// Steady-state Kalman gain entries, fixed because the noise constants are fixed.
129+
static constexpr float kKg00{_kNoiseInv *_kCommonNom / _kDenom};
130+
static constexpr float kKg01{_kRateInvSqProc / _kDenom};
131+
static constexpr float kKg10{_kNoiseInv *_kNoiseInv *kAirspeedRateNoiseStdDev / _kDenom};
132+
static constexpr float kKg11{_kRateInvSqProc *_kCommonNom / _kDenom};
119133
};
120134

121135
class TECSAltitudeReferenceModel
@@ -598,9 +612,6 @@ class TECS
598612
void set_detect_underspeed_enabled(bool enabled) { _control_flag.detect_underspeed_enabled = enabled; };
599613

600614
// setters for parameters
601-
void set_airspeed_measurement_std_dev(float std_dev) {_airspeed_filter_param.airspeed_measurement_std_dev = std_dev;};
602-
void set_airspeed_rate_measurement_std_dev(float std_dev) {_airspeed_filter_param.airspeed_rate_measurement_std_dev = std_dev;};
603-
void set_airspeed_filter_process_std_dev(float std_dev) {_airspeed_filter_param.airspeed_rate_noise_std_dev = std_dev;};
604615

605616
void set_integrator_gain_throttle(float gain) { _control_param.integrator_gain_throttle = gain;};
606617
void set_integrator_gain_pitch(float gain) { _control_param.integrator_gain_pitch = gain; };
@@ -710,9 +721,6 @@ class TECS
710721
/// Airspeed filter parameters.
711722
TECSAirspeedFilter::Param _airspeed_filter_param{
712723
.equivalent_airspeed_trim = 15.0f,
713-
.airspeed_measurement_std_dev = 0.2f,
714-
.airspeed_rate_measurement_std_dev = 0.05f,
715-
.airspeed_rate_noise_std_dev = 0.02f
716724
};
717725
/// Reference model parameters.
718726
TECSAltitudeReferenceModel::Param _reference_param{

src/modules/fw_lateral_longitudinal_control/FwLateralLongitudinalControl.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,6 @@ FwLateralLongitudinalControl::parameters_update()
110110
_tecs.set_airspeed_error_time_constant(_param_fw_t_tas_error_tc.get());
111111
_tecs.set_ste_rate_time_const(_param_ste_rate_time_const.get());
112112
_tecs.set_seb_rate_ff_gain(_param_seb_rate_ff.get());
113-
_tecs.set_airspeed_measurement_std_dev(_param_speed_standard_dev.get());
114-
_tecs.set_airspeed_rate_measurement_std_dev(_param_speed_rate_standard_dev.get());
115-
_tecs.set_airspeed_filter_process_std_dev(_param_process_noise_standard_dev.get());
116113

117114
_roll_slew_rate.setSlewRate(radians(_param_fw_pn_r_slew_max.get()));
118115

src/modules/fw_lateral_longitudinal_control/FwLateralLongitudinalControl.hpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,6 @@ class FwLateralLongitudinalControl final : public ModuleBase, public ModuleParam
160160
(ParamFloat<px4::params::FW_T_STE_R_TC>) _param_ste_rate_time_const,
161161
(ParamFloat<px4::params::FW_T_SEB_R_FF>) _param_seb_rate_ff,
162162
(ParamFloat<px4::params::FW_T_SPDWEIGHT>) _param_t_spdweight,
163-
(ParamFloat<px4::params::FW_T_SPD_STD>) _param_speed_standard_dev,
164-
(ParamFloat<px4::params::FW_T_SPD_DEV_STD>) _param_speed_rate_standard_dev,
165-
(ParamFloat<px4::params::FW_T_SPD_PRC_STD>) _param_process_noise_standard_dev,
166163
(ParamFloat<px4::params::FW_T_CLMB_R_SP>) _param_climbrate_target,
167164
(ParamFloat<px4::params::FW_T_SINK_R_SP>) _param_sinkrate_target,
168165
(ParamFloat<px4::params::FW_THR_MAX>) _param_fw_thr_max,

src/modules/fw_lateral_longitudinal_control/fw_lat_long_params.yaml

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -103,41 +103,6 @@ parameters:
103103
max: 10.0
104104
decimal: 1
105105
increment: 0.5
106-
FW_T_SPD_STD:
107-
description:
108-
short: Airspeed measurement standard deviation
109-
long: For the airspeed filter in TECS.
110-
type: float
111-
default: 0.07
112-
unit: m/s
113-
min: 0.01
114-
max: 10.0
115-
decimal: 2
116-
increment: 0.1
117-
FW_T_SPD_DEV_STD:
118-
description:
119-
short: Airspeed rate measurement standard deviation
120-
long: For the airspeed filter in TECS.
121-
type: float
122-
default: 0.2
123-
unit: m/s^2
124-
min: 0.01
125-
max: 10.0
126-
decimal: 2
127-
increment: 0.1
128-
FW_T_SPD_PRC_STD:
129-
description:
130-
short: Process noise standard deviation for the airspeed rate
131-
long: |-
132-
This is defining the noise in the airspeed rate for the constant airspeed rate model
133-
of the TECS airspeed filter.
134-
type: float
135-
default: 0.2
136-
unit: m/s^2
137-
min: 0.01
138-
max: 10.0
139-
decimal: 2
140-
increment: 0.1
141106
FW_T_RLL2THR:
142107
description:
143108
short: Roll -> Throttle feedforward

0 commit comments

Comments
 (0)