mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-23 16:25:26 +03:00
BARO: Remove averaging and extra LPF filtering. Changed defaults for sensor fusion for INAV
This commit is contained in:
parent
517c958d17
commit
c180856b4f
6 changed files with 19 additions and 51 deletions
|
@ -134,7 +134,7 @@ static uint32_t activeFeaturesLatch = 0;
|
||||||
static uint8_t currentControlRateProfileIndex = 0;
|
static uint8_t currentControlRateProfileIndex = 0;
|
||||||
controlRateConfig_t *currentControlRateProfile;
|
controlRateConfig_t *currentControlRateProfile;
|
||||||
|
|
||||||
static const uint8_t EEPROM_CONF_VERSION = 114;
|
static const uint8_t EEPROM_CONF_VERSION = 115;
|
||||||
|
|
||||||
static void resetAccelerometerTrims(flightDynamicsTrims_t * accZero, flightDynamicsTrims_t * accGain)
|
static void resetAccelerometerTrims(flightDynamicsTrims_t * accZero, flightDynamicsTrims_t * accGain)
|
||||||
{
|
{
|
||||||
|
@ -231,10 +231,10 @@ void resetNavConfig(navConfig_t * navConfig)
|
||||||
navConfig->inav.accz_unarmed_cal = 1;
|
navConfig->inav.accz_unarmed_cal = 1;
|
||||||
navConfig->inav.use_gps_velned = 0; // "Disabled" is mandatory with gps_nav_model = LOW_G
|
navConfig->inav.use_gps_velned = 0; // "Disabled" is mandatory with gps_nav_model = LOW_G
|
||||||
|
|
||||||
navConfig->inav.w_z_baro_p = 1.0f;
|
navConfig->inav.w_z_baro_p = 0.35f;
|
||||||
|
|
||||||
navConfig->inav.w_z_gps_p = 0.3f;
|
navConfig->inav.w_z_gps_p = 0.2f;
|
||||||
navConfig->inav.w_z_gps_v = 0.3f;
|
navConfig->inav.w_z_gps_v = 0.2f;
|
||||||
|
|
||||||
navConfig->inav.w_xy_gps_p = 1.0f;
|
navConfig->inav.w_xy_gps_p = 1.0f;
|
||||||
navConfig->inav.w_xy_gps_v = 2.0f;
|
navConfig->inav.w_xy_gps_v = 2.0f;
|
||||||
|
@ -277,8 +277,7 @@ void resetNavConfig(navConfig_t * navConfig)
|
||||||
|
|
||||||
void resetBarometerConfig(barometerConfig_t *barometerConfig)
|
void resetBarometerConfig(barometerConfig_t *barometerConfig)
|
||||||
{
|
{
|
||||||
barometerConfig->baro_sample_count = 7;
|
barometerConfig->use_median_filtering = 1;
|
||||||
barometerConfig->baro_noise_lpf = 0.35f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetSensorAlignment(sensorAlignmentConfig_t *sensorAlignmentConfig)
|
void resetSensorAlignment(sensorAlignmentConfig_t *sensorAlignmentConfig)
|
||||||
|
@ -546,7 +545,7 @@ static void resetConf(void)
|
||||||
|
|
||||||
currentProfile->mag_declination = 0;
|
currentProfile->mag_declination = 0;
|
||||||
|
|
||||||
resetBarometerConfig(¤tProfile->barometerConfig);
|
resetBarometerConfig(&masterConfig.barometerConfig);
|
||||||
|
|
||||||
// Radio
|
// Radio
|
||||||
parseRcChannels("AETR1234", &masterConfig.rxConfig);
|
parseRcChannels("AETR1234", &masterConfig.rxConfig);
|
||||||
|
@ -808,7 +807,7 @@ void activateConfig(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BARO
|
#ifdef BARO
|
||||||
useBarometerConfig(¤tProfile->barometerConfig);
|
useBarometerConfig(&masterConfig.barometerConfig);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,8 @@ typedef struct master_t {
|
||||||
|
|
||||||
gyroConfig_t gyroConfig;
|
gyroConfig_t gyroConfig;
|
||||||
|
|
||||||
|
barometerConfig_t barometerConfig;
|
||||||
|
|
||||||
uint8_t mag_hardware; // Which mag hardware to use on boards with more than one device
|
uint8_t mag_hardware; // Which mag hardware to use on boards with more than one device
|
||||||
uint8_t baro_hardware; // Barometer hardware to use
|
uint8_t baro_hardware; // Barometer hardware to use
|
||||||
|
|
||||||
|
|
|
@ -25,8 +25,6 @@ typedef struct profile_s {
|
||||||
int16_t mag_declination; // Get your magnetic decliniation from here : http://magnetic-declination.com/
|
int16_t mag_declination; // Get your magnetic decliniation from here : http://magnetic-declination.com/
|
||||||
// For example, -6deg 37min, = -637 Japan, format is [sign]dddmm (degreesminutes) default is zero.
|
// For example, -6deg 37min, = -637 Japan, format is [sign]dddmm (degreesminutes) default is zero.
|
||||||
|
|
||||||
barometerConfig_t barometerConfig;
|
|
||||||
|
|
||||||
modeActivationCondition_t modeActivationConditions[MAX_MODE_ACTIVATION_CONDITION_COUNT];
|
modeActivationCondition_t modeActivationConditions[MAX_MODE_ACTIVATION_CONDITION_COUNT];
|
||||||
|
|
||||||
adjustmentRange_t adjustmentRanges[MAX_ADJUSTMENT_RANGE_COUNT];
|
adjustmentRange_t adjustmentRanges[MAX_ADJUSTMENT_RANGE_COUNT];
|
||||||
|
|
|
@ -701,8 +701,7 @@ const clivalue_t valueTable[] = {
|
||||||
|
|
||||||
{ "acc_hardware", VAR_UINT8 | MASTER_VALUE, &masterConfig.acc_hardware, .config.minmax = { 0, ACC_MAX }, 0 },
|
{ "acc_hardware", VAR_UINT8 | MASTER_VALUE, &masterConfig.acc_hardware, .config.minmax = { 0, ACC_MAX }, 0 },
|
||||||
|
|
||||||
{ "baro_tab_size", VAR_UINT8 | PROFILE_VALUE, &masterConfig.profile[0].barometerConfig.baro_sample_count, .config.minmax = { 0, BARO_SAMPLE_COUNT_MAX }, 0 },
|
{ "baro_use_median_filter", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.barometerConfig.use_median_filtering, .config.lookup = { TABLE_OFF_ON }, 0 },
|
||||||
{ "baro_noise_lpf", VAR_FLOAT | PROFILE_VALUE, &masterConfig.profile[0].barometerConfig.baro_noise_lpf, .config.minmax = { 0, 1 }, 0 },
|
|
||||||
{ "baro_hardware", VAR_UINT8 | MASTER_VALUE, &masterConfig.baro_hardware, .config.minmax = { 0, BARO_MAX }, 0 },
|
{ "baro_hardware", VAR_UINT8 | MASTER_VALUE, &masterConfig.baro_hardware, .config.minmax = { 0, BARO_MAX }, 0 },
|
||||||
|
|
||||||
{ "mag_hardware", VAR_UINT8 | MASTER_VALUE, &masterConfig.mag_hardware, .config.minmax = { 0, MAG_MAX }, 0 },
|
{ "mag_hardware", VAR_UINT8 | MASTER_VALUE, &masterConfig.mag_hardware, .config.minmax = { 0, MAG_MAX }, 0 },
|
||||||
|
|
|
@ -43,7 +43,6 @@ int32_t BaroAlt = 0;
|
||||||
|
|
||||||
static int32_t baroGroundAltitude = 0;
|
static int32_t baroGroundAltitude = 0;
|
||||||
static int32_t baroGroundPressure = 0;
|
static int32_t baroGroundPressure = 0;
|
||||||
static uint32_t baroPressureSum = 0;
|
|
||||||
|
|
||||||
static barometerConfig_t *barometerConfig;
|
static barometerConfig_t *barometerConfig;
|
||||||
|
|
||||||
|
@ -72,7 +71,7 @@ static int32_t applyBarometerMedianFilter(int32_t newPressureReading)
|
||||||
static int currentFilterSampleIndex = 0;
|
static int currentFilterSampleIndex = 0;
|
||||||
static bool medianFilterReady = false;
|
static bool medianFilterReady = false;
|
||||||
int nextSampleIndex;
|
int nextSampleIndex;
|
||||||
|
|
||||||
nextSampleIndex = (currentFilterSampleIndex + 1);
|
nextSampleIndex = (currentFilterSampleIndex + 1);
|
||||||
if (nextSampleIndex == PRESSURE_SAMPLES_MEDIAN) {
|
if (nextSampleIndex == PRESSURE_SAMPLES_MEDIAN) {
|
||||||
nextSampleIndex = 0;
|
nextSampleIndex = 0;
|
||||||
|
@ -81,45 +80,18 @@ static int32_t applyBarometerMedianFilter(int32_t newPressureReading)
|
||||||
|
|
||||||
barometerFilterSamples[currentFilterSampleIndex] = newPressureReading;
|
barometerFilterSamples[currentFilterSampleIndex] = newPressureReading;
|
||||||
currentFilterSampleIndex = nextSampleIndex;
|
currentFilterSampleIndex = nextSampleIndex;
|
||||||
|
|
||||||
if (medianFilterReady)
|
if (medianFilterReady)
|
||||||
return quickMedianFilter3(barometerFilterSamples);
|
return quickMedianFilter3(barometerFilterSamples);
|
||||||
else
|
else
|
||||||
return newPressureReading;
|
return newPressureReading;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PRESSURE_SAMPLE_COUNT (barometerConfig->baro_sample_count - 1)
|
|
||||||
|
|
||||||
static uint32_t recalculateBarometerTotal(uint8_t baroSampleCount, uint32_t pressureTotal, int32_t newPressureReading)
|
|
||||||
{
|
|
||||||
static int32_t barometerSamples[BARO_SAMPLE_COUNT_MAX];
|
|
||||||
static int currentSampleIndex = 0;
|
|
||||||
int nextSampleIndex;
|
|
||||||
|
|
||||||
// store current pressure in barometerSamples
|
|
||||||
nextSampleIndex = (currentSampleIndex + 1);
|
|
||||||
if (nextSampleIndex == baroSampleCount) {
|
|
||||||
nextSampleIndex = 0;
|
|
||||||
baroReady = true;
|
|
||||||
}
|
|
||||||
barometerSamples[currentSampleIndex] = applyBarometerMedianFilter(newPressureReading);
|
|
||||||
|
|
||||||
// recalculate pressure total
|
|
||||||
// Note, the pressure total is made up of baroSampleCount - 1 samples - See PRESSURE_SAMPLE_COUNT
|
|
||||||
pressureTotal += barometerSamples[currentSampleIndex];
|
|
||||||
pressureTotal -= barometerSamples[nextSampleIndex];
|
|
||||||
|
|
||||||
currentSampleIndex = nextSampleIndex;
|
|
||||||
|
|
||||||
return pressureTotal;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
BAROMETER_NEEDS_SAMPLES = 0,
|
BAROMETER_NEEDS_SAMPLES = 0,
|
||||||
BAROMETER_NEEDS_CALCULATION
|
BAROMETER_NEEDS_CALCULATION
|
||||||
} barometerState_e;
|
} barometerState_e;
|
||||||
|
|
||||||
|
|
||||||
bool isBaroReady(void) {
|
bool isBaroReady(void) {
|
||||||
return baroReady;
|
return baroReady;
|
||||||
}
|
}
|
||||||
|
@ -141,7 +113,9 @@ uint32_t baroUpdate(void)
|
||||||
baro.get_up();
|
baro.get_up();
|
||||||
baro.start_ut();
|
baro.start_ut();
|
||||||
baro.calculate(&baroPressure, &baroTemperature);
|
baro.calculate(&baroPressure, &baroTemperature);
|
||||||
baroPressureSum = recalculateBarometerTotal(barometerConfig->baro_sample_count, baroPressureSum, baroPressure);
|
if (barometerConfig->use_median_filtering) {
|
||||||
|
baroPressure = applyBarometerMedianFilter(baroPressure);
|
||||||
|
}
|
||||||
state = BAROMETER_NEEDS_SAMPLES;
|
state = BAROMETER_NEEDS_SAMPLES;
|
||||||
return baro.ut_delay;
|
return baro.ut_delay;
|
||||||
break;
|
break;
|
||||||
|
@ -151,7 +125,7 @@ uint32_t baroUpdate(void)
|
||||||
static void performBaroCalibrationCycle(void)
|
static void performBaroCalibrationCycle(void)
|
||||||
{
|
{
|
||||||
baroGroundPressure -= baroGroundPressure / 8;
|
baroGroundPressure -= baroGroundPressure / 8;
|
||||||
baroGroundPressure += baroPressureSum / PRESSURE_SAMPLE_COUNT;
|
baroGroundPressure += baroPressure;
|
||||||
baroGroundAltitude = (1.0f - powf((baroGroundPressure / 8) / 101325.0f, 0.190295f)) * 4433000.0f;
|
baroGroundAltitude = (1.0f - powf((baroGroundPressure / 8) / 101325.0f, 0.190295f)) * 4433000.0f;
|
||||||
|
|
||||||
calibratingB--;
|
calibratingB--;
|
||||||
|
@ -167,13 +141,10 @@ int32_t baroCalculateAltitude(void)
|
||||||
#ifdef HIL
|
#ifdef HIL
|
||||||
if (!hilActive) {
|
if (!hilActive) {
|
||||||
#endif
|
#endif
|
||||||
int32_t BaroAlt_tmp;
|
|
||||||
|
|
||||||
// calculates height from ground via baro readings
|
// calculates height from ground via baro readings
|
||||||
// see: https://github.com/diydrones/ardupilot/blob/master/libraries/AP_Baro/AP_Baro.cpp#L140
|
// see: https://github.com/diydrones/ardupilot/blob/master/libraries/AP_Baro/AP_Baro.cpp#L140
|
||||||
BaroAlt_tmp = lrintf((1.0f - powf((float)(baroPressureSum / PRESSURE_SAMPLE_COUNT) / 101325.0f, 0.190295f)) * 4433000.0f); // in cm
|
BaroAlt = lrintf((1.0f - powf((float)(baroPressure) / 101325.0f, 0.190295f)) * 4433000.0f); // in cm
|
||||||
BaroAlt_tmp -= baroGroundAltitude;
|
BaroAlt -= baroGroundAltitude;
|
||||||
BaroAlt = lrintf((float)BaroAlt * barometerConfig->baro_noise_lpf + (float)BaroAlt_tmp * (1.0f - barometerConfig->baro_noise_lpf)); // additional LPF to reduce baro noise
|
|
||||||
#ifdef HIL
|
#ifdef HIL
|
||||||
} else {
|
} else {
|
||||||
BaroAlt = hilToFC.baroAlt;
|
BaroAlt = hilToFC.baroAlt;
|
||||||
|
|
|
@ -30,8 +30,7 @@ typedef enum {
|
||||||
#define BARO_MAX BARO_FAKE
|
#define BARO_MAX BARO_FAKE
|
||||||
|
|
||||||
typedef struct barometerConfig_s {
|
typedef struct barometerConfig_s {
|
||||||
uint8_t baro_sample_count; // size of baro filter array
|
uint8_t use_median_filtering; // Use 3-point median filtering
|
||||||
float baro_noise_lpf; // additional LPF to reduce baro noise
|
|
||||||
} barometerConfig_t;
|
} barometerConfig_t;
|
||||||
|
|
||||||
extern int32_t BaroAlt;
|
extern int32_t BaroAlt;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue