1
0
Fork 0
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:
Konstantin Sharlaimov (DigitalEntity) 2016-03-29 11:13:15 +10:00
parent 517c958d17
commit c180856b4f
6 changed files with 19 additions and 51 deletions

View file

@ -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(&currentProfile->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(&currentProfile->barometerConfig); useBarometerConfig(&masterConfig.barometerConfig);
#endif #endif
} }

View file

@ -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

View file

@ -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];

View file

@ -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 },

View file

@ -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;

View file

@ -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;