Browse Source

AP_NavEKF: Modifed Vel Pos fusion to fuse height data whenever baro reading has changed

master
Paul Riseborough 11 years ago committed by Andrew Tridgell
parent
commit
32cc427ff4
  1. 38
      libraries/AP_NavEKF/AP_NavEKF.cpp
  2. 6
      libraries/AP_NavEKF/AP_NavEKF.h

38
libraries/AP_NavEKF/AP_NavEKF.cpp

@ -71,6 +71,8 @@ NavEKF::NavEKF(const AP_AHRS *ahrs, AP_Baro &baro) : @@ -71,6 +71,8 @@ NavEKF::NavEKF(const AP_AHRS *ahrs, AP_Baro &baro) :
hgtRate = 0.0f;
mag_state.q0 = 1;
mag_state.DCM.identity();
hgtMeaPrev = 0.0f;
hgtMea = 0.0f;
}
bool NavEKF::healthy(void) const
@ -262,38 +264,20 @@ void NavEKF::SelectVelPosFusion() @@ -262,38 +264,20 @@ void NavEKF::SelectVelPosFusion()
{
fuseVelData = true;
fusePosData = true;
fuseHgtData = true;
}
// Don't wait longer than HGTmsecMax msec between height updates
// if no GPS
else if ((IMUmsec - HGTmsecPrev) >= HGTmsecMax)
if (newDataHgt)
{
// Static mode is used for pre-arm and bench testing and allows operation
// without GPS
if (staticMode) {
fuseVelData = true;
fusePosData = true;
fuseHgtData = true;
}
else {
fuseVelData = false;
fusePosData = false;
fuseHgtData = true;
}
HGTmsecPrev = IMUmsec;
}
else
{
fuseVelData = false;
fusePosData = false;
fuseHgtData = false;
}
// set flag to let other processes know that GPS and/or height fusion has
// ocurred in this frame
if (fuseVelData || fusePosData || fuseHgtData)
{
FuseVelPosNED();
newDataGps = false;
newDataHgt = false;
posVelFuseStep = true;
}
else
@ -1958,14 +1942,16 @@ void NavEKF::readGpsData() @@ -1958,14 +1942,16 @@ void NavEKF::readGpsData()
void NavEKF::readHgtData()
{
// ToDo do we check for new height data or grab a height measurement?
// ToDo - better check for new height data
// Best to do this at the same time as GPS measurement fusion for efficiency
hgtMea = _baro.get_altitude();
#if 0
Vector3f pos;
getPosNED(pos);
//::printf("BARO.Alt=%.2f REL.z=%.2f\n", hgtMea, -pos.z);
#endif
if (hgtMeaPrev != hgtMea) {
newDataHgt == true;
hgtMeaPrev = hgtMea;
}
else {
newDataHgt == false;
}
// recall states from compass measurement time
RecallStates(statesAtHgtTime, (IMUmsec - msecHgtDelay));
}

6
libraries/AP_NavEKF/AP_NavEKF.h

@ -201,7 +201,7 @@ private: @@ -201,7 +201,7 @@ private:
ftype _windStateNoise; // rate of change of wind : m/s^2
ftype _wndVarHgtRateScale; // scale factor applied to wind process noise from height rate
ftype _gyrNoise; // gyro process noise : rad/s
ftype _accNoise; // accelerometer process noise : m/s^2
ftype _accNoise; // accelerometer process noise : m/s^2hgtHealth = (sq(hgtInnov) < maxf((100.0f * varInnovVelPos[5])) , 5.0f);
ftype _dAngBiasNoise; // gyro bias state noise : rad/s^2
ftype _magEarthNoise; // earth magnetic field process noise : gauss/sec
ftype _magBodyNoise; // earth magnetic field process noise : gauss/sec
@ -297,6 +297,10 @@ private: @@ -297,6 +297,10 @@ private:
// TAS input variables
bool newDataTas;
// HGT input variables
float hgtMeaPrev;
bool newDataHgt;
// Time stamp when vel, pos or height measurements last failed checks
uint32_t velFailTime;
uint32_t posFailTime;

Loading…
Cancel
Save