123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- #pragma once
- #include <AP_Math/AP_Math.h>
- #include <AP_AHRS/AP_AHRS.h>
- #include <AP_Param/AP_Param.h>
- #include <AP_Vehicle/AP_Vehicle.h>
- #include <AP_SpdHgtControl/AP_SpdHgtControl.h>
- #include <AP_Landing/AP_Landing.h>
- class AP_TECS : public AP_SpdHgtControl {
- public:
- AP_TECS(AP_AHRS &ahrs, const AP_Vehicle::FixedWing &parms, const AP_Landing &landing)
- : _ahrs(ahrs)
- , aparm(parms)
- , _landing(landing)
- {
- AP_Param::setup_object_defaults(this, var_info);
- }
-
- AP_TECS(const AP_TECS &other) = delete;
- AP_TECS &operator=(const AP_TECS&) = delete;
-
-
-
- void update_50hz(void) override;
-
- void update_pitch_throttle(int32_t hgt_dem_cm,
- int32_t EAS_dem_cm,
- enum AP_Vehicle::FixedWing::FlightStage flight_stage,
- float distance_beyond_land_wp,
- int32_t ptchMinCO_cd,
- int16_t throttle_nudge,
- float hgt_afe,
- float load_factor,
- bool soaring_active) override;
-
-
- int32_t get_throttle_demand(void) override {
- return int32_t(_throttle_dem * 100.0f);
- }
-
-
- int32_t get_pitch_demand(void) override {
- return int32_t(_pitch_dem * 5729.5781f);
- }
-
- float get_VXdot(void) override {
- return _vel_dot;
- }
-
- float get_target_airspeed(void) const override {
- return _TAS_dem / _ahrs.get_EAS2TAS();
- }
-
- float get_max_climbrate(void) const override {
- return _maxClimbRate;
- }
-
- void reset_pitch_I(void) override {
- _integSEB_state = 0.0f;
- }
-
-
- float get_land_sinkrate(void) const override {
- return _land_sink;
- }
-
- float get_land_airspeed(void) const override {
- return _landAirspeed;
- }
-
- float get_height_rate_demand(void) const {
- return _hgt_rate_dem;
- }
-
- void set_path_proportion(float path_proportion) override {
- _path_proportion = constrain_float(path_proportion, 0.0f, 1.0f);
- }
-
- void set_pitch_max_limit(int8_t pitch_limit) {
- _pitch_max_limit = pitch_limit;
- }
-
- void use_synthetic_airspeed(void) {
- _use_synthetic_airspeed_once = true;
- }
-
-
- static const struct AP_Param::GroupInfo var_info[];
- private:
-
- uint64_t _update_50hz_last_usec;
-
- uint64_t _update_speed_last_usec;
-
- uint64_t _update_pitch_throttle_last_usec;
-
- AP_AHRS &_ahrs;
- const AP_Vehicle::FixedWing &aparm;
-
- const AP_Landing &_landing;
-
-
- AP_Float _hgtCompFiltOmega;
- AP_Float _spdCompFiltOmega;
- AP_Float _maxClimbRate;
- AP_Float _minSinkRate;
- AP_Float _maxSinkRate;
- AP_Float _timeConst;
- AP_Float _landTimeConst;
- AP_Float _ptchDamp;
- AP_Float _land_pitch_damp;
- AP_Float _landDamp;
- AP_Float _thrDamp;
- AP_Float _land_throttle_damp;
- AP_Float _integGain;
- AP_Float _integGain_takeoff;
- AP_Float _integGain_land;
- AP_Float _vertAccLim;
- AP_Float _rollComp;
- AP_Float _spdWeight;
- AP_Float _spdWeightLand;
- AP_Float _landThrottle;
- AP_Float _landAirspeed;
- AP_Float _land_sink;
- AP_Float _land_sink_rate_change;
- AP_Int8 _pitch_max;
- AP_Int8 _pitch_min;
- AP_Int8 _land_pitch_max;
- AP_Float _maxSinkRate_approach;
- AP_Int32 _options;
- enum {
- OPTION_GLIDER_ONLY=(1<<0),
- };
-
- int8_t _pitch_max_limit = 90;
-
-
- float _height;
-
- float _throttle_dem;
-
- float _pitch_dem;
-
- float _climb_rate;
-
- struct {
-
- float dd_height;
-
- float height;
- } _height_filter;
-
- float _integDTAS_state;
-
- float _TAS_state;
-
- float _integTHR_state;
-
- float _integSEB_state;
-
- float _last_throttle_dem;
-
- float _last_pitch_dem;
-
- float _vel_dot;
-
- float _EAS;
-
- float _TASmax;
- float _TASmin;
-
- float _TAS_dem;
-
- float _EAS_dem;
-
- float _hgt_dem;
- float _hgt_dem_in_old;
- float _hgt_dem_adj;
- float _hgt_dem_adj_last;
- float _hgt_rate_dem;
- float _hgt_dem_prev;
- float _land_hgt_dem;
-
-
- float _TAS_dem_adj;
-
-
- float _TAS_rate_dem;
-
- float _STEdotErrLast;
- struct flags {
-
- bool underspeed:1;
-
- bool badDescent:1;
-
- bool is_doing_auto_land:1;
-
- bool reached_speed_takeoff:1;
- };
- union {
- struct flags _flags;
- uint8_t _flags_byte;
- };
-
- uint32_t _underspeed_start_ms;
-
- enum AP_Vehicle::FixedWing::FlightStage _flight_stage;
-
- float _pitch_dem_unc;
-
- float _STEdot_max;
- float _STEdot_min;
-
- float _THRmaxf;
- float _THRminf;
-
- float _PITCHmaxf;
- float _PITCHminf;
-
- float _SPE_dem;
- float _SKE_dem;
- float _SPEdot_dem;
- float _SKEdot_dem;
- float _SPE_est;
- float _SKE_est;
- float _SPEdot;
- float _SKEdot;
-
- float _STE_error;
-
- float _DT;
-
- uint8_t _flare_counter;
-
- float hgt_dem_lag_filter_slew;
-
- float _path_proportion;
- float _distance_beyond_land_wp;
- float _land_pitch_min = -90;
-
- struct {
- float SKE_weighting;
- float SPE_error;
- float SKE_error;
- float SEB_delta;
- } logging;
- AP_Int8 _use_synthetic_airspeed;
-
-
- bool _use_synthetic_airspeed_once;
-
-
- void _update_speed(float load_factor);
-
- void _update_speed_demand(void);
-
- void _update_height_demand(void);
-
- void _detect_underspeed(void);
-
- void _update_energies(void);
-
- void _update_throttle_with_airspeed(void);
-
- void _update_throttle_without_airspeed(int16_t throttle_nudge);
-
- float _get_i_gain(void);
-
- void _detect_bad_descent(void);
-
- void _update_pitch(void);
-
- void _initialise_states(int32_t ptchMinCO_cd, float hgt_afe);
-
- void _update_STE_rate_lim(void);
-
- AverageFilterFloat_Size5 _vdot_filter;
-
- float timeConstant(void) const;
- };
|