1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-20 14:55:18 +03:00

Remove unused filterWithBuffer code. Not useful anymore as inertial filter alone calculate velocity with sufficient accuracy

This commit is contained in:
Konstantin Sharlaimov (DigitalEntity) 2015-11-25 22:56:57 +10:00
parent 4dbd985046
commit 03bfb70a15
3 changed files with 3 additions and 127 deletions

View file

@ -304,96 +304,6 @@ void arraySubInt32(int32_t *dest, int32_t *array1, int32_t *array2, int count)
} }
} }
// Base functions for FIR filters
void filterWithBufferReset(filterWithBufferState_t * state)
{
int i;
state->sample_index = 0;
for (i = 0; i < state->filter_size; i++) {
state->samples[i].value = 0.0f;
state->samples[i].timestamp = 0;
}
}
void filterWithBufferInit(filterWithBufferState_t * state, filterWithBufferSample_t * buffer, uint16_t size)
{
state->samples = buffer;
state->filter_size = size;
filterWithBufferReset(state);
}
void filterWithBufferUpdate(filterWithBufferState_t * state, float sample, uint32_t timestamp)
{
uint16_t old_sample_index;
if (state->sample_index == 0)
old_sample_index = state->filter_size - 1;
else
old_sample_index = state->sample_index - 1;
if (state->samples[old_sample_index].timestamp == timestamp) {
return;
}
state->samples[state->sample_index].timestamp = timestamp;
state->samples[state->sample_index].value = sample;
state->sample_index++;
if (state->sample_index >= state->filter_size)
state->sample_index = 0;
}
// An implementation of a derivative (slope) filter
// Code mostly taken from ArduPilot's DerivativeFilter.cpp
// http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/smooth-low-noise-differentiators/
float filterWithBufferApply_Derivative(filterWithBufferState_t * state)
{
float result = 0;
// use f() to make the code match the maths a bit better. Note
// that unlike an average filter, we care about the order of the elements
#define f(i) (state->samples[(((state->sample_index - 1) + i + 1) + 3 * state->filter_size / 2) % state->filter_size].value)
#define x(i) (state->samples[(((state->sample_index - 1) + i + 1) + 3 * state->filter_size / 2) % state->filter_size].timestamp)
if (state->samples[state->filter_size - 1].timestamp == state->samples[state->filter_size - 2].timestamp) {
return 0;
}
switch (state->filter_size) {
case 5:
result = 2*2*(f(1) - f(-1)) / (x(1) - x(-1))
+ 4*1*(f(2) - f(-2)) / (x(2) - x(-2));
result /= 8;
break;
case 7:
result = 2*5*(f(1) - f(-1)) / (x(1) - x(-1))
+ 4*4*(f(2) - f(-2)) / (x(2) - x(-2))
+ 6*1*(f(3) - f(-3)) / (x(3) - x(-3));
result /= 32;
break;
case 9:
result = 2*14*(f(1) - f(-1)) / (x(1) - x(-1))
+ 4*14*(f(2) - f(-2)) / (x(2) - x(-2))
+ 6* 6*(f(3) - f(-3)) / (x(3) - x(-3))
+ 8* 1*(f(4) - f(-4)) / (x(4) - x(-4));
result /= 128;
break;
case 11:
result = 2*42*(f(1) - f(-1)) / (x(1) - x(-1))
+ 4*48*(f(2) - f(-2)) / (x(2) - x(-2))
+ 6*27*(f(3) - f(-3)) / (x(3) - x(-3))
+ 8* 8*(f(4) - f(-4)) / (x(4) - x(-4))
+ 10* 1*(f(5) - f(-5)) / (x(5) - x(-5));
result /= 512;
break;
default:
result = 0;
break;
}
return result;
}
/** /**
* Sensor offset calculation code based on Freescale's AN4246 * Sensor offset calculation code based on Freescale's AN4246
* Initial implementation by @HaukeRa * Initial implementation by @HaukeRa

View file

@ -131,11 +131,6 @@ int32_t quickMedianFilter5(int32_t * v);
int32_t quickMedianFilter7(int32_t * v); int32_t quickMedianFilter7(int32_t * v);
int32_t quickMedianFilter9(int32_t * v); int32_t quickMedianFilter9(int32_t * v);
void filterWithBufferReset(filterWithBufferState_t * state);
void filterWithBufferInit(filterWithBufferState_t * state, filterWithBufferSample_t * buffer, uint16_t size);
void filterWithBufferUpdate(filterWithBufferState_t * state, float sample, uint32_t timestamp);
float filterWithBufferApply_Derivative(filterWithBufferState_t * state);
#if defined(FAST_MATH) || defined(VERY_FAST_MATH) #if defined(FAST_MATH) || defined(VERY_FAST_MATH)
float sin_approx(float x); float sin_approx(float x);
float cos_approx(float x); float cos_approx(float x);

View file

@ -62,13 +62,11 @@
#define INAV_POSITION_PUBLISH_RATE_HZ 50 // Publish position updates at this rate #define INAV_POSITION_PUBLISH_RATE_HZ 50 // Publish position updates at this rate
#define INAV_BARO_UPDATE_RATE 20 #define INAV_BARO_UPDATE_RATE 20
#define INAV_SONAR_UPDATE_RATE 10 // Sonar is limited to 1/60ms update rate, go lower that that #define INAV_SONAR_UPDATE_RATE 15 // Sonar is limited to 1/60ms update rate, go lower that that
#define INAV_GPS_TIMEOUT_MS 1500 // GPS timeout #define INAV_GPS_TIMEOUT_MS 1500 // GPS timeout
#define INAV_BARO_TIMEOUT_MS 200 // Baro timeout #define INAV_BARO_TIMEOUT_MS 200 // Baro timeout
#define INAV_SONAR_TIMEOUT_MS 250 // Sonar timeout (missed two readings in a row #define INAV_SONAR_TIMEOUT_MS 200 // Sonar timeout (missed 3 readings in a row)
#define INAV_BARO_CLIMB_RATE_FILTER_SIZE 7
#define INAV_SONAR_W1 0.8461f // Sonar predictive filter gain for altitude #define INAV_SONAR_W1 0.8461f // Sonar predictive filter gain for altitude
#define INAV_SONAR_W2 6.2034f // Sonar predictive filter gain for velocity #define INAV_SONAR_W2 6.2034f // Sonar predictive filter gain for velocity
@ -97,7 +95,6 @@ typedef struct {
typedef struct { typedef struct {
uint32_t lastUpdateTime; // Last update time (us) uint32_t lastUpdateTime; // Last update time (us)
float alt; // Raw barometric altitude (cm) float alt; // Raw barometric altitude (cm)
float vel; // Altitude derivative - velocity (cms)
float epv; float epv;
} navPositionEstimatorBARO_t; } navPositionEstimatorBARO_t;
@ -345,39 +342,16 @@ void onNewGPSData(int32_t newLat, int32_t newLon, int32_t newAlt, int16_t velN,
static void updateBaroTopic(uint32_t currentTime) static void updateBaroTopic(uint32_t currentTime)
{ {
static navigationTimer_t baroUpdateTimer; static navigationTimer_t baroUpdateTimer;
/*
static filterWithBufferSample_t baroClimbRateFilterBuffer[INAV_BARO_CLIMB_RATE_FILTER_SIZE];
static filterWithBufferState_t baroClimbRateFilter;
static bool climbRateFiltersInitialized = false;
*/
if (updateTimer(&baroUpdateTimer, HZ2US(INAV_BARO_UPDATE_RATE), currentTime)) { if (updateTimer(&baroUpdateTimer, HZ2US(INAV_BARO_UPDATE_RATE), currentTime)) {
/*
if (!climbRateFiltersInitialized) {
filterWithBufferInit(&baroClimbRateFilter, &baroClimbRateFilterBuffer[0], INAV_BARO_CLIMB_RATE_FILTER_SIZE);
climbRateFiltersInitialized = true;
}
*/
float newBaroAlt = baroCalculateAltitude(); float newBaroAlt = baroCalculateAltitude();
if (sensors(SENSOR_BARO) && isBaroCalibrationComplete()) { if (sensors(SENSOR_BARO) && isBaroCalibrationComplete()) {
/*
filterWithBufferUpdate(&baroClimbRateFilter, newBaroAlt, currentTime);
float baroClimbRate = filterWithBufferApply_Derivative(&baroClimbRateFilter) * 1e6f;
// FIXME: do we need this?
baroClimbRate = constrainf(baroClimbRate, -1500, 1500); // constrain baro velocity +/- 1500cm/s
baroClimbRate = applyDeadband(baroClimbRate, 10); // to reduce noise near zero
*/
posEstimator.baro.alt = newBaroAlt; posEstimator.baro.alt = newBaroAlt;
posEstimator.baro.vel = 0; //baroClimbRate;
posEstimator.baro.epv = posControl.navConfig->inav.baro_epv; posEstimator.baro.epv = posControl.navConfig->inav.baro_epv;
posEstimator.baro.lastUpdateTime = currentTime; posEstimator.baro.lastUpdateTime = currentTime;
} }
else { else {
posEstimator.baro.alt = 0; posEstimator.baro.alt = 0;
posEstimator.baro.vel = 0;
posEstimator.baro.lastUpdateTime = 0; posEstimator.baro.lastUpdateTime = 0;
} }
} }
@ -507,7 +481,7 @@ static void updateEstimatedTopic(uint32_t currentTime)
/* Apply GPS altitude corrections only on fixed wing aircrafts */ /* Apply GPS altitude corrections only on fixed wing aircrafts */
bool useGpsZ = STATE(FIXED_WING) && isGPSValid; bool useGpsZ = STATE(FIXED_WING) && isGPSValid;
/* Pre-calculate history index for GPS & baro delay compensation */ /* Pre-calculate history index for GPS delay compensation */
int gpsHistoryIndex = (posEstimator.history.index - 1) - constrain(((int)posControl.navConfig->inav.gps_delay_ms / (1000 / INAV_POSITION_PUBLISH_RATE_HZ)), 0, INAV_HISTORY_BUF_SIZE - 1); int gpsHistoryIndex = (posEstimator.history.index - 1) - constrain(((int)posControl.navConfig->inav.gps_delay_ms / (1000 / INAV_POSITION_PUBLISH_RATE_HZ)), 0, INAV_HISTORY_BUF_SIZE - 1);
if (gpsHistoryIndex < 0) { if (gpsHistoryIndex < 0) {
gpsHistoryIndex += INAV_HISTORY_BUF_SIZE; gpsHistoryIndex += INAV_HISTORY_BUF_SIZE;
@ -535,7 +509,6 @@ static void updateEstimatedTopic(uint32_t currentTime)
/* accelerometer bias correction for baro */ /* accelerometer bias correction for baro */
if (isBaroValid) { if (isBaroValid) {
accelBiasCorr.V.Z -= (posEstimator.baro.alt - posEstimator.est.pos.V.Z) * sq(posControl.navConfig->inav.w_z_baro_p); accelBiasCorr.V.Z -= (posEstimator.baro.alt - posEstimator.est.pos.V.Z) * sq(posControl.navConfig->inav.w_z_baro_p);
//accelBiasCorr.V.Z -= (posEstimator.baro.vel - posEstimator.est.vel.V.Z) * posControl.navConfig->inav.w_z_baro_v;
} }
/* transform error vector from NEU frame to body frame */ /* transform error vector from NEU frame to body frame */
@ -548,7 +521,6 @@ static void updateEstimatedTopic(uint32_t currentTime)
} }
/* Estimate Z-axis */ /* Estimate Z-axis */
/* FIXME: baro & sonar delay compensation (~100ms for sonar, about 500ms for baro) */
if ((posEstimator.est.epv < posControl.navConfig->inav.max_eph_epv) || useGpsZ || isBaroValid) { if ((posEstimator.est.epv < posControl.navConfig->inav.max_eph_epv) || useGpsZ || isBaroValid) {
/* Predict position/velocity based on acceleration */ /* Predict position/velocity based on acceleration */
inavFilterPredict(Z, dt, posEstimator.imu.accelNEU.V.Z); inavFilterPredict(Z, dt, posEstimator.imu.accelNEU.V.Z);
@ -557,7 +529,6 @@ static void updateEstimatedTopic(uint32_t currentTime)
if (isBaroValid) { if (isBaroValid) {
/* Apply only baro correction, no sonar */ /* Apply only baro correction, no sonar */
inavFilterCorrectPos(Z, dt, posEstimator.baro.alt - posEstimator.est.pos.V.Z, posControl.navConfig->inav.w_z_baro_p); inavFilterCorrectPos(Z, dt, posEstimator.baro.alt - posEstimator.est.pos.V.Z, posControl.navConfig->inav.w_z_baro_p);
//inavFilterCorrectVel(Z, dt, posEstimator.baro.vel - posEstimator.est.vel.V.Z, posControl.navConfig->inav.w_z_baro_v);
/* Adjust EPV */ /* Adjust EPV */
posEstimator.est.epv = MIN(posEstimator.est.epv, posEstimator.baro.epv); posEstimator.est.epv = MIN(posEstimator.est.epv, posEstimator.baro.epv);