mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-26 17:53:59 -04:00
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:
parent
c57b25b4c9
commit
451fe840ee
@ -524,6 +524,10 @@ private:
|
|||||||
|
|
||||||
bool inhibitGpsVertVelUse; // true when GPS vertical velocity use is prohibited
|
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
|
// 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
|
// 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
|
// old_primary - index of the ekf instance that we are currently using as the primary
|
||||||
|
@ -479,10 +479,10 @@ bool NavEKF3_core::setOriginLLH(const Location &loc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set the NED origin to be used until the next filter reset
|
// 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)
|
// 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 flying, correct for height change from takeoff so that the origin is at field elevation
|
||||||
if (inFlight) {
|
if (inFlight) {
|
||||||
EKF_origin.alt += (int32_t)(100.0f * stateStruct.position.z);
|
EKF_origin.alt += (int32_t)(100.0f * stateStruct.position.z);
|
||||||
@ -491,7 +491,11 @@ void NavEKF3_core::setOrigin()
|
|||||||
// define Earth rotation vector in the NED navigation frame at the origin
|
// define Earth rotation vector in the NED navigation frame at the origin
|
||||||
calcEarthRateNED(earthRateNED, EKF_origin.lat);
|
calcEarthRateNED(earthRateNED, EKF_origin.lat);
|
||||||
validOrigin = true;
|
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
|
// record a yaw reset event
|
||||||
|
@ -582,12 +582,17 @@ void NavEKF3_core::readGpsData()
|
|||||||
// Post-alignment checks
|
// Post-alignment checks
|
||||||
calcGpsGoodForFlight();
|
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
|
// Read the GPS location in WGS-84 lat,long,height coordinates
|
||||||
const struct Location &gpsloc = gps.location();
|
const struct Location &gpsloc = gps.location();
|
||||||
|
|
||||||
// Set the EKF origin and magnetic field declination if not previously set and GPS checks have passed
|
// Set the EKF origin and magnetic field declination if not previously set and GPS checks have passed
|
||||||
if (gpsGoodToAlign && !validOrigin) {
|
if (gpsGoodToAlign && !validOrigin) {
|
||||||
setOrigin();
|
setOrigin(gpsloc);
|
||||||
|
|
||||||
// set the NE earth magnetic field states using the published declination
|
// set the NE earth magnetic field states using the published declination
|
||||||
// and set the corresponding variances and covariances
|
// and set the corresponding variances and covariances
|
||||||
|
@ -768,7 +768,7 @@ private:
|
|||||||
void controlMagYawReset();
|
void controlMagYawReset();
|
||||||
|
|
||||||
// Set the NED origin to be used until the next filter reset
|
// 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
|
// determine if a takeoff is expected so that we can compensate for expected barometer errors due to ground effect
|
||||||
bool getTakeoffExpected();
|
bool getTakeoffExpected();
|
||||||
|
Loading…
Reference in New Issue
Block a user