2 * This file is part of Cleanflight.
4 * Cleanflight is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * Cleanflight is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
23 #include "common/axis.h"
24 #include "common/maths.h"
25 #include "common/filter.h"
26 #include "common/calibration.h"
28 #include "sensors/sensors.h"
30 #define INAV_GPS_DEFAULT_EPH 200.0f // 2m GPS HDOP (gives about 1.6s of dead-reckoning if GPS is temporary lost)
31 #define INAV_GPS_DEFAULT_EPV 500.0f // 5m GPS VDOP
33 #define INAV_GPS_ACCEPTANCE_EPE 500.0f // 5m acceptance radius
35 #define INAV_ACC_BIAS_ACCEPTANCE_VALUE (GRAVITY_CMSS * 0.25f) // Max accepted bias correction of 0.25G - unlikely we are going to be that much off anyway
37 #define INAV_GPS_GLITCH_RADIUS 250.0f // 2.5m GPS glitch radius
38 #define INAV_GPS_GLITCH_ACCEL 1000.0f // 10m/s/s max possible acceleration for GPS glitch detection
40 #define INAV_POSITION_PUBLISH_RATE_HZ 50 // Publish position updates at this rate
41 #define INAV_PITOT_UPDATE_RATE 10
43 #define INAV_GPS_TIMEOUT_MS 1500 // GPS timeout
44 #define INAV_BARO_TIMEOUT_MS 200 // Baro timeout
45 #define INAV_SURFACE_TIMEOUT_MS 400 // Surface timeout (missed 3 readings in a row)
46 #define INAV_FLOW_TIMEOUT_MS 200
48 #define CALIBRATING_GRAVITY_TIME_MS 2000
50 // Time constants for calculating Baro/Sonar averages. Should be the same value to impose same amount of group delay
51 #define INAV_BARO_AVERAGE_HZ 1.0f
52 #define INAV_SURFACE_AVERAGE_HZ 1.0f
54 #define INAV_ACC_CLIPPING_RC_CONSTANT (0.010f) // Reduce acc weight for ~10ms after clipping
56 #define RANGEFINDER_RELIABILITY_RC_CONSTANT (0.47802f)
57 #define RANGEFINDER_RELIABILITY_LIGHT_THRESHOLD (0.15f)
58 #define RANGEFINDER_RELIABILITY_LOW_THRESHOLD (0.33f)
59 #define RANGEFINDER_RELIABILITY_HIGH_THRESHOLD (0.75f)
62 timeUs_t lastTriggeredTime
;
67 timeUs_t lastUpdateTime
; // Last update time (us)
68 fpVector3_t pos
; // GPS position in NEU coordinate system (cm)
69 fpVector3_t vel
; // GPS velocity (cms)
72 } navPositionEstimatorGPS_t
;
75 timeUs_t lastUpdateTime
; // Last update time (us)
76 pt1Filter_t avgFilter
;
77 float alt
; // Raw barometric altitude (cm)
79 float baroAltRate
; // Baro altitude rate of change (cm/s)
80 } navPositionEstimatorBARO_t
;
83 timeUs_t lastUpdateTime
; // Last update time (us)
84 float airspeed
; // airspeed (cm/s)
85 } navPositionEstimatorPITOT_t
;
88 SURFACE_QUAL_LOW
, // Surface sensor signal lost long ago - most likely surface distance is incorrect
89 SURFACE_QUAL_MID
, // Surface sensor is not available but we can somewhat trust the estimate
90 SURFACE_QUAL_HIGH
// All good
91 } navAGLEstimateQuality_e
;
94 timeUs_t lastUpdateTime
; // Last update time (us)
95 pt1Filter_t avgFilter
;
96 float alt
; // Raw altitude measurement (cm)
98 } navPositionEstimatorSURFACE_t
;
101 timeUs_t lastUpdateTime
; // Last update time (us)
106 } navPositionEstimatorFLOW_t
;
109 timeUs_t lastUpdateTime
; // Last update time (us)
111 // 3D position, velocity and confidence
118 navAGLEstimateQuality_e aglQual
;
119 float aglOffset
; // Offset between surface and pos.Z
124 float flowCoordinates
[2];
127 int16_t cog
; // course over ground (decidegrees)
128 } navPositionEstimatorESTIMATE_t
;
131 timeUs_t lastUpdateTime
;
132 fpVector3_t accelNEU
;
133 fpVector3_t accelBias
;
134 float calibratedGravityCMSS
;
135 float accWeightFactor
;
136 zeroCalibrationScalar_t gravityCalibration
;
137 } navPosisitonEstimatorIMU_t
;
140 EST_GPS_XY_VALID
= (1 << 0),
141 EST_GPS_Z_VALID
= (1 << 1),
142 EST_BARO_VALID
= (1 << 2),
143 EST_SURFACE_VALID
= (1 << 3),
144 EST_FLOW_VALID
= (1 << 4),
145 EST_XY_VALID
= (1 << 5),
146 EST_Z_VALID
= (1 << 6),
147 } navPositionEstimationFlags_e
;
151 ALTITUDE_SOURCE_BARO
,
152 ALTITUDE_SOURCE_GPS_ONLY
,
153 ALTITUDE_SOURCE_BARO_ONLY
,
154 } navDefaultAltitudeSensor_e
;
157 timeUs_t baroGroundTimeout
;
159 bool isBaroGroundValid
;
160 } navPositionEstimatorSTATE_t
;
167 navPositionEstimatorGPS_t gps
;
168 navPositionEstimatorBARO_t baro
;
169 navPositionEstimatorSURFACE_t surface
;
170 navPositionEstimatorPITOT_t pitot
;
171 navPositionEstimatorFLOW_t flow
;
174 navPosisitonEstimatorIMU_t imu
;
177 navPositionEstimatorESTIMATE_t est
;
179 // Extra state variables
180 navPositionEstimatorSTATE_t state
;
181 } navigationPosEstimator_t
;
188 fpVector3_t estPosCorr
;
189 fpVector3_t estVelCorr
;
190 fpVector3_t accBiasCorr
;
191 } estimationContext_t
;
193 extern navigationPosEstimator_t posEstimator
;
195 extern float updateEPE(const float oldEPE
, const float dt
, const float newEPE
, const float w
);
196 extern void estimationCalculateAGL(estimationContext_t
* ctx
);
197 extern bool estimationCalculateCorrection_XY_FLOW(estimationContext_t
* ctx
);
198 extern float navGetAccelerometerWeight(void);