AP_NavEKF3: ensure that EKF origin stays in sync on all cores

this prevents the EKF origin on different cores from being initialised
to different values. A common value is stored in the frontend and used
by a core if it doesn't have an origin
This commit is contained in:
Andrew Tridgell 2019-07-27 17:00:10 +10:00
parent eeaae5b932
commit ef0ba9f94d
4 changed files with 18 additions and 5 deletions

View File

@ -485,6 +485,10 @@ private:
bool inhibitGpsVertVelUse; // true when GPS vertical velocity use is prohibited
// origin set by one of the cores
struct Location common_EKF_origin;
bool common_origin_valid;
// update the yaw reset data to capture changes due to a lane switch
// new_primary - index of the ekf instance that we are about to switch to as the primary
// old_primary - index of the ekf instance that we are currently using as the primary

View File

@ -482,10 +482,10 @@ bool NavEKF3_core::setOriginLLH(const Location &loc)
}
// Set the NED origin to be used until the next filter reset
void NavEKF3_core::setOrigin()
void NavEKF3_core::setOrigin(const Location &loc)
{
// assume origin at current GPS location (no averaging)
EKF_origin = AP::gps().location();
EKF_origin = loc;
// if flying, correct for height change from takeoff so that the origin is at field elevation
if (inFlight) {
EKF_origin.alt += (int32_t)(100.0f * stateStruct.position.z);
@ -494,7 +494,11 @@ void NavEKF3_core::setOrigin()
// define Earth rotation vector in the NED navigation frame at the origin
calcEarthRateNED(earthRateNED, EKF_origin.lat);
validOrigin = true;
gcs().send_text(MAV_SEVERITY_INFO, "EKF3 IMU%u Origin set to GPS",(unsigned)imu_index);
gcs().send_text(MAV_SEVERITY_INFO, "EKF3 IMU%u origin set",(unsigned)imu_index);
// put origin in frontend as well to ensure it stays in sync between lanes
frontend->common_EKF_origin = EKF_origin;
frontend->common_origin_valid = true;
}
// record a yaw reset event

View File

@ -569,12 +569,17 @@ void NavEKF3_core::readGpsData()
// Post-alignment checks
calcGpsGoodForFlight();
// see if we can get an origin from the frontend
if (!validOrigin && frontend->common_origin_valid) {
setOrigin(frontend->common_EKF_origin);
}
// Read the GPS location in WGS-84 lat,long,height coordinates
const struct Location &gpsloc = gps.location();
// Set the EKF origin and magnetic field declination if not previously set and GPS checks have passed
if (gpsGoodToAlign && !validOrigin) {
setOrigin();
setOrigin(gpsloc);
// set the NE earth magnetic field states using the published declination
// and set the corresponding variances and covariances

View File

@ -736,7 +736,7 @@ private:
void controlMagYawReset();
// Set the NED origin to be used until the next filter reset
void setOrigin();
void setOrigin(const Location &loc);
// determine if a takeoff is expected so that we can compensate for expected barometer errors due to ground effect
bool getTakeoffExpected();