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:
parent
4dbd985046
commit
03bfb70a15
3 changed files with 3 additions and 127 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue