1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-17 02:52:12 +01:00

AHRS: Detect when more than 2 seconds since last GPS update and in that case

reinit INSGPS to new location

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1958 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
peabody124 2010-10-14 01:36:28 +00:00 committed by peabody124
parent f2681ef2c4
commit 016bcad24a
3 changed files with 65 additions and 22 deletions

View File

@ -39,7 +39,9 @@
#include "insgps.h"
#include "CoordinateConversions.h"
#define MAX_OVERSAMPLING 50
#define MAX_OVERSAMPLING 50 /* cannot have more than 50 samples */
#define INSGPS_GPS_TIMEOUT 2 /* 2 seconds triggers reinit of position */
// For debugging the raw sensors
//#define DUMP_RAW
//#define DUMP_FRIENDLY
@ -195,7 +197,9 @@ int main()
{
float gyro[3], accel[3];
float vel[3] = { 0, 0, 0 };
uint8_t gps_dirty = 1;
gps_data.quality = -1;
uint32_t last_gps_time = 0;
ahrs_algorithm = AHRSSETTINGS_ALGORITHM_SIMPLE;
@ -223,10 +227,6 @@ int main()
PIOS_HMC5843_ReadID(mag_data.id);
#endif
/* SPI link to master */
// PIOS_SPI_Init();
// lfsm_init();
reset_values();
INSGPSInit();
@ -360,16 +360,31 @@ for all data to be up to date before doing anything*/
INSCovariancePrediction(1 / (float)EKF_RATE);
if (gps_data.updated && ahrs_algorithm == AHRSSETTINGS_ALGORITHM_INSGPS_OUTDOOR) {
// Compute velocity from Heading and groundspeed
vel[0] =
gps_data.groundspeed *
cos(gps_data.heading * M_PI / 180);
vel[1] =
gps_data.groundspeed *
sin(gps_data.heading * M_PI / 180);
uint32_t this_gps_time = timer_count();
float gps_delay;
// Detect if greater than certain time since last gps update and if so
// reset EKF to that position since probably drifted too far for safe
// update
if (this_gps_time < last_gps_time)
gps_delay = ((0xFFFF - last_gps_time) - this_gps_time) / timer_rate();
else
gps_delay = (this_gps_time - last_gps_time) / timer_rate();
last_gps_time = this_gps_time;
gps_dirty = gps_delay > INSGPS_GPS_TIMEOUT;
// Compute velocity from Heading and groundspeed
vel[0] = gps_data.groundspeed *
cos(gps_data.heading * M_PI / 180);
vel[1] = gps_data.groundspeed *
sin(gps_data.heading * M_PI / 180);
vel[2] = 0;
INSSetPosVelVar(0.004);
if (mag_data.updated) {
if (mag_data.updated && !gps_dirty) {
//TOOD: add check for altitude updates
FullCorrection(mag_data.scaled.axis,
gps_data.NED,
@ -377,11 +392,13 @@ for all data to be up to date before doing anything*/
altitude_data.
altitude);
mag_data.updated = 0;
} else {
} else if (!gps_dirty) {
GpsBaroCorrection(gps_data.NED,
vel,
altitude_data.
altitude);
} else { // GPS hasn't updated for a bit
INSPosVelReset(gps_data.NED,vel);
}
gps_data.updated = false;
@ -830,14 +847,13 @@ void gps_callback(AhrsObjHandle obj)
HomeLocationData home;
HomeLocationGet(&home);
if(ahrs_algorithm != AHRSSETTINGS_ALGORITHM_INSGPS_OUTDOOR) {
return;
}
if(pos.Status != GPSPOSITION_STATUS_FIX3D) //FIXME: Will this work? the old ahrs_comms does it differently.
if((ahrs_algorithm != AHRSSETTINGS_ALGORITHM_INSGPS_OUTDOOR) ||
(pos.Status != GPSPOSITION_STATUS_FIX3D) ||
(pos.Satellites < 7) ||
(pos.PDOP < 3.5))
{
gps_data.quality = 0;
gps_data.updated = true;
gps_data.updated = false;
return;
}
@ -848,8 +864,8 @@ void gps_callback(AhrsObjHandle obj)
gps_data.heading = pos.Heading;
gps_data.groundspeed = pos.Groundspeed;
gps_data.quality = 1;
gps_data.updated = true;
gps_data.quality = 1; /* currently unused */
gps_data.updated = true;
}
void altitude_callback(AhrsObjHandle obj)

View File

@ -59,6 +59,7 @@ void INSSetAccelVar(float accel_var[3]);
void INSSetGyroVar(float gyro_var[3]);
void INSSetMagNorth(float B[3]);
void INSSetMagVar(float scaled_mag_var[3]);
void INSPosVelReset(float pos[3], float vel[3]);
void MagCorrection(float mag_data[3]);
void MagVelBaroCorrection(float mag_data[3], float Vel[3], float BaroAlt);

View File

@ -76,6 +76,12 @@ void INSGPSInit() //pretty much just a place holder for now
Be[1] = 0;
Be[2] = 0; // local magnetic unit vector
for (int i = 0; i < NUMX; i++) {
for (int j = 0; j < NUMX; j++) {
P[i][j] = 0; // zero all terms
}
}
P[0][0] = P[1][1] = P[2][2] = 25; // initial position variance (m^2)
P[3][3] = P[4][4] = P[5][5] = 5; // initial velocity variance (m/s)^2
P[6][6] = P[7][7] = P[8][8] = P[9][9] = 1e-5; // initial quaternion variance
@ -98,6 +104,26 @@ void INSGPSInit() //pretty much just a place holder for now
R[9] = .05; // High freq altimeter noise variance (m^2)
}
void INSPosVelReset(float pos[3], float vel[3])
{
for (int i = 0; i < 6; i++) {
for(int j = i; j < NUMX; j++) {
P[i][j] = 0; // zero the first 6 rows and columns
P[j][i] = 0;
}
}
P[0][0] = P[1][1] = P[2][2] = 25; // initial position variance (m^2)
P[3][3] = P[4][4] = P[5][5] = 5; // initial velocity variance (m/s)^2
X[0] = pos[0];
X[1] = pos[1];
X[2] = pos[2];
X[3] = vel[0];
X[4] = vel[1];
X[5] = vel[2];
}
void INSSetPosVelVar(float PosVar)
{
R[0] = PosVar;