2 #if HAL_CPU_CLASS >= HAL_CPU_CLASS_150 15 #if APM_BUILD_TYPE(APM_BUILD_ArduCopter) || APM_BUILD_TYPE(APM_BUILD_Replay) 17 #define VELNE_M_NSE_DEFAULT 0.5f 18 #define VELD_M_NSE_DEFAULT 0.7f 19 #define POSNE_M_NSE_DEFAULT 0.5f 20 #define ALT_M_NSE_DEFAULT 2.0f 21 #define MAG_M_NSE_DEFAULT 0.05f 22 #define GYRO_P_NSE_DEFAULT 1.5E-02f 23 #define ACC_P_NSE_DEFAULT 3.5E-01f 24 #define GBIAS_P_NSE_DEFAULT 1.0E-03f 25 #define ABIAS_P_NSE_DEFAULT 3.0E-03f 26 #define MAGB_P_NSE_DEFAULT 1.0E-04f 27 #define MAGE_P_NSE_DEFAULT 1.0E-03f 28 #define VEL_I_GATE_DEFAULT 500 29 #define POS_I_GATE_DEFAULT 500 30 #define HGT_I_GATE_DEFAULT 500 31 #define MAG_I_GATE_DEFAULT 300 32 #define MAG_CAL_DEFAULT 3 33 #define GLITCH_RADIUS_DEFAULT 25 34 #define FLOW_MEAS_DELAY 10 35 #define FLOW_M_NSE_DEFAULT 0.25f 36 #define FLOW_I_GATE_DEFAULT 300 37 #define CHECK_SCALER_DEFAULT 100 39 #elif APM_BUILD_TYPE(APM_BUILD_APMrover2) 41 #define VELNE_M_NSE_DEFAULT 0.5f 42 #define VELD_M_NSE_DEFAULT 0.7f 43 #define POSNE_M_NSE_DEFAULT 0.5f 44 #define ALT_M_NSE_DEFAULT 2.0f 45 #define MAG_M_NSE_DEFAULT 0.05f 46 #define GYRO_P_NSE_DEFAULT 1.5E-02f 47 #define ACC_P_NSE_DEFAULT 3.5E-01f 48 #define GBIAS_P_NSE_DEFAULT 1.0E-03f 49 #define ABIAS_P_NSE_DEFAULT 3.0E-03f 50 #define MAGB_P_NSE_DEFAULT 1.0E-04f 51 #define MAGE_P_NSE_DEFAULT 1.0E-03f 52 #define VEL_I_GATE_DEFAULT 500 53 #define POS_I_GATE_DEFAULT 500 54 #define HGT_I_GATE_DEFAULT 500 55 #define MAG_I_GATE_DEFAULT 300 56 #define MAG_CAL_DEFAULT 2 57 #define GLITCH_RADIUS_DEFAULT 25 58 #define FLOW_MEAS_DELAY 10 59 #define FLOW_M_NSE_DEFAULT 0.25f 60 #define FLOW_I_GATE_DEFAULT 300 61 #define CHECK_SCALER_DEFAULT 100 63 #elif APM_BUILD_TYPE(APM_BUILD_ArduPlane) 65 #define VELNE_M_NSE_DEFAULT 0.5f 66 #define VELD_M_NSE_DEFAULT 0.7f 67 #define POSNE_M_NSE_DEFAULT 0.5f 68 #define ALT_M_NSE_DEFAULT 3.0f 69 #define MAG_M_NSE_DEFAULT 0.05f 70 #define GYRO_P_NSE_DEFAULT 1.5E-02f 71 #define ACC_P_NSE_DEFAULT 3.5E-01f 72 #define GBIAS_P_NSE_DEFAULT 1.0E-03f 73 #define ABIAS_P_NSE_DEFAULT 3.0E-03f 74 #define MAGB_P_NSE_DEFAULT 1.0E-04f 75 #define MAGE_P_NSE_DEFAULT 1.0E-03f 76 #define VEL_I_GATE_DEFAULT 500 77 #define POS_I_GATE_DEFAULT 500 78 #define HGT_I_GATE_DEFAULT 500 79 #define MAG_I_GATE_DEFAULT 300 80 #define MAG_CAL_DEFAULT 0 81 #define GLITCH_RADIUS_DEFAULT 25 82 #define FLOW_MEAS_DELAY 10 83 #define FLOW_M_NSE_DEFAULT 0.25f 84 #define FLOW_I_GATE_DEFAULT 300 85 #define CHECK_SCALER_DEFAULT 100 89 #define VELNE_M_NSE_DEFAULT 0.5f 90 #define VELD_M_NSE_DEFAULT 0.7f 91 #define POSNE_M_NSE_DEFAULT 0.5f 92 #define ALT_M_NSE_DEFAULT 2.0f 93 #define MAG_M_NSE_DEFAULT 0.05f 94 #define GYRO_P_NSE_DEFAULT 1.5E-02f 95 #define ACC_P_NSE_DEFAULT 3.5E-01f 96 #define GBIAS_P_NSE_DEFAULT 1.0E-03f 97 #define ABIAS_P_NSE_DEFAULT 3.0E-03f 98 #define MAGB_P_NSE_DEFAULT 1.0E-04f 99 #define MAGE_P_NSE_DEFAULT 1.0E-03f 100 #define VEL_I_GATE_DEFAULT 500 101 #define POS_I_GATE_DEFAULT 500 102 #define HGT_I_GATE_DEFAULT 500 103 #define MAG_I_GATE_DEFAULT 300 104 #define MAG_CAL_DEFAULT 3 105 #define GLITCH_RADIUS_DEFAULT 25 106 #define FLOW_MEAS_DELAY 10 107 #define FLOW_M_NSE_DEFAULT 0.25f 108 #define FLOW_I_GATE_DEFAULT 300 109 #define CHECK_SCALER_DEFAULT 100 111 #endif // APM_BUILD_DIRECTORY 635 if (
core ==
nullptr) {
639 if (dataflash !=
nullptr) {
648 for (uint8_t i=0; i<7; i++) {
655 for (uint8_t i=0; i<7; i++) {
665 gcs().
send_text(MAV_SEVERITY_CRITICAL,
"NavEKF3: not enough memory");
672 if (
core ==
nullptr) {
674 gcs().
send_text(MAV_SEVERITY_CRITICAL,
"NavEKF3: allocation failed");
677 for (uint8_t i = 0; i <
num_cores; i++) {
686 bool core_setup_success =
true;
687 for (uint8_t core_index=0; core_index<
num_cores; core_index++) {
691 core_setup_success =
false;
696 if (!core_setup_success) {
738 statePredictEnabled[i] =
false;
740 statePredictEnabled[i] =
true;
749 static uint64_t lastUnhealthyTime_us = 0;
757 float lowestErrorScore = 0.67f * primaryErrorScore;
758 uint8_t newPrimaryIndex =
primary;
759 for (uint8_t coreIndex=0; coreIndex<
num_cores; coreIndex++) {
763 bool altCoreAvailable =
core[coreIndex].
healthy() && statePredictEnabled[coreIndex];
769 if (altCoreAvailable && (!
core[
primary].
healthy() || altErrorScore < lowestErrorScore)) {
770 newPrimaryIndex = coreIndex;
771 lowestErrorScore = altErrorScore;
776 if (newPrimaryIndex !=
primary) {
1099 core[instance].
getVariances(velVar, posVar, hgtVar, magVar, tasVar, offset);
1139 void NavEKF3::getFlowDebug(int8_t instance,
float &varFlow,
float &gndOffset,
float &flowInnovX,
float &flowInnovY,
float &auxInnov,
1140 float &HAGL,
float &rngInnov,
float &
range,
float &gndOffsetErr)
const 1144 core[instance].
getFlowDebug(varFlow, gndOffset, flowInnovX, flowInnovY, auxInnov, HAGL, rngInnov, range, gndOffsetErr);
1188 if (instance < 0 || instance >=
num_cores) {
1201 float &offsetHigh,
float &offsetLow,
Vector3f &posNED)
const 1205 return core[instance].
getRangeBeaconDebug(ID, rng, innov, innovVar, testRatio, beaconPosNED, offsetHigh, offsetLow, posNED);
1297 memset(&status, 0,
sizeof(status));
1310 memset(&status, 0,
sizeof(status));
1363 if (lastCoreYawReset_ms > lastYawReset_ms) {
1364 yawAngDelta =
wrap_PI(yawAngDelta + temp_yawAng);
1365 lastYawReset_ms = lastCoreYawReset_ms;
1368 return lastYawReset_ms;
1401 if (lastCorePosReset_ms > lastPosReset_ms) {
1402 posDelta = posDelta + tempPosDelta;
1403 lastPosReset_ms = lastCorePosReset_ms;
1406 return lastPosReset_ms;
1458 if (lastCorePosReset_ms > lastPosReset_ms) {
1459 posDelta += tempPosDelta;
1460 lastPosReset_ms = lastCorePosReset_ms;
1463 return lastPosReset_ms;
1469 Vector3f eulers_old_primary, eulers_new_primary;
1470 float old_yaw_delta;
1495 Vector2f pos_old_primary, pos_new_primary, old_pos_delta;
1522 float posDownOldPrimary, posDownNewPrimary, oldPosDownDelta;
1549 if (instance < 0 || instance >=
num_cores) {
1555 memset(&timing, 0,
sizeof(timing));
1559 #endif //HAL_CPU_CLASS void getFlowDebug(int8_t instance, float &varFlow, float &gndOffset, float &flowInnovX, float &flowInnovY, float &auxInnov, float &HAGL, float &rngInnov, float &range, float &gndOffsetErr) const
#define GLITCH_RADIUS_DEFAULT
virtual uint32_t available_memory(void)
#define MAGE_P_NSE_DEFAULT
void getRotationBodyToNED(Matrix3f &mat) const
void writeBodyFrameOdom(float quality, const Vector3f &delPos, const Vector3f &delAng, float delTime, uint32_t timeStamp_ms, const Vector3f &posOffset)
void getTiltError(int8_t instance, float &ang) const
uint32_t get_last_update_usec(void) const
#define ABIAS_P_NSE_DEFAULT
float getPosDownDerivative(void) const
bool resetHeightDatum(void)
void getFilterFaults(uint16_t &faults) const
#define AP_PARAM_FLAG_ENABLE
bool getPosD(float &posD) const
#define VELNE_M_NSE_DEFAULT
bool getRangeBeaconDebug(int8_t instance, uint8_t &ID, float &rng, float &innov, float &innovVar, float &testRatio, Vector3f &beaconPosNED, float &offsetHigh, float &offsetLow, Vector3f &posNED) const
struct NavEKF3::@148 logging
#define MAG_I_GATE_DEFAULT
bool getPosNE(Vector2f &posNE) const
void send_status_report(mavlink_channel_t chan)
struct NavEKF3::@151 pos_down_reset_data
bool setup_core(NavEKF3 *_frontend, uint8_t _imu_index, uint8_t _core_index)
static const struct AP_Param::GroupInfo var_info[]
void getFilterGpsStatus(int8_t instance, nav_gps_status &faults) const
uint8_t getIMUIndex(void) const
void getVariances(int8_t instance, float &velVar, float &posVar, float &hgtVar, Vector3f &magVar, float &tasVar, Vector2f &offset) const
bool setOriginLLH(const Location &loc)
uint32_t getBodyFrameOdomDebug(Vector3f &velInnov, Vector3f &velInnovVar)
uint8_t getActiveMag() const
bool setOriginLLH(const Location &loc)
struct NavEKF3::@150 pos_reset_data
Interface definition for the various Ground Control System.
uint32_t getBodyFrameOdomDebug(int8_t instance, Vector3f &velInnov, Vector3f &velInnovVar) const
void getVelNED(Vector3f &vel) const
struct NavEKF3::@149 yaw_reset_data
void getTimingStatistics(struct ekf_timing &timing)
uint32_t getLastVelNorthEastReset(Vector2f &vel) const
void getAccelBias(Vector3f &accelBias) const
bool use_compass(void) const
#define AP_GROUPINFO(name, idx, clazz, element, def)
void getGyroBias(int8_t instance, Vector3f &gyroBias) const
void getMagNED(Vector3f &magNED) const
void getFilterStatus(int8_t instance, nav_filter_status &status) const
const char * prearm_failure_reason(void) const
bool have_ekf_logging(void) const
void getMagXYZ(int8_t instance, Vector3f &magXYZ) const
bool getHeightControlLimit(float &height) const
bool InitialiseFilter(void)
void getQuaternion(Quaternion &quat) const
void getTiltError(float &ang) const
#define POS_I_GATE_DEFAULT
void Log_Write_IMUDT(uint64_t time_us, uint8_t imu_mask)
void getTimingStatistics(int8_t instance, struct ekf_timing &timing) const
void getGyroBias(Vector3f &gyroBias) const
void getFilterStatus(nav_filter_status &status) const
#define VEL_I_GATE_DEFAULT
void setTerrainHgtStable(bool val)
uint8_t setInhibitGPS(void)
void getRotationBodyToNED(Matrix3f &mat) const
const Compass * get_compass() const
static AP_InertialSensor ins
bool use_compass(void) const
void setTouchdownExpected(bool val)
float errorScore(void) const
uint32_t getLastYawResetAngle(float &yawAng) const
void writeWheelOdom(float delAng, float delTime, uint32_t timeStamp_ms, const Vector3f &posOffset, float radius)
#define ALT_M_NSE_DEFAULT
#define AP_GROUPINFO_FLAGS(name, idx, clazz, element, def, flags)
bool InitialiseFilterBootstrap(void)
void getWind(Vector3f &wind) const
void updateLaneSwitchYawResetData(uint8_t new_primary, uint8_t old_primary)
uint32_t getLastYawResetAngle(float &yawAngDelta)
void setTakeoffExpected(bool val)
bool getRangeBeaconDebug(uint8_t &ID, float &rng, float &innov, float &innovVar, float &testRatio, Vector3f &beaconPosNED, float &offsetHigh, float &offsetLow, Vector3f &posNED)
bool getHAGL(float &HAGL) const
uint32_t getLastPosNorthEastReset(Vector2f &pos) const
bool getLLH(struct Location &loc) const
void updateLaneSwitchPosResetData(uint8_t new_primary, uint8_t old_primary)
#define VELD_M_NSE_DEFAULT
void getVelNED(int8_t instance, Vector3f &vel) const
float wrap_PI(const T radian)
#define FLOW_I_GATE_DEFAULT
void Log_Write_Compass(const Compass &compass, uint64_t time_us=0)
void getInnovations(int8_t index, Vector3f &velInnov, Vector3f &posInnov, Vector3f &magInnov, float &tasInnov, float &yawInnov) const
void getEulerAngles(Vector3f &eulers) const
#define MAGB_P_NSE_DEFAULT
#define ACC_P_NSE_DEFAULT
bool getPosD(int8_t instance, float &posD) const
int8_t getPrimaryCoreIMUIndex(void) const
void UpdateFilter(bool predict)
void getVariances(float &velVar, float &posVar, float &hgtVar, Vector3f &magVar, float &tasVar, Vector2f &offset) const
void getEulerAngles(int8_t instance, Vector3f &eulers) const
void setTakeoffExpected(bool val)
const AP_HAL::HAL & hal
-*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
void check_log_write(void)
uint32_t getLastPosNorthEastReset(Vector2f &posDelta)
static DataFlash_Class * instance(void)
#define POSNE_M_NSE_DEFAULT
uint64_t imuSampleTime_us
void getEkfControlLimits(float &ekfGndSpdLimit, float &ekfNavVelGainScaler) const
uint32_t getLastPosDownReset(float &posD) const
void getFilterFaults(int8_t instance, uint16_t &faults) const
void send_text(MAV_SEVERITY severity, const char *fmt,...)
void getInnovations(Vector3f &velInnov, Vector3f &posInnov, Vector3f &magInnov, float &tasInnov, float &yawInnov) const
bool getMagOffsets(uint8_t mag_idx, Vector3f &magOffsets) const
uint16_t get_sample_rate(void) const
uint32_t getLastPosDownReset(float &posDelta)
#define CHECK_SCALER_DEFAULT
void Log_Write_GPS(uint8_t instance, uint64_t time_us=0)
void getFilterGpsStatus(nav_gps_status &status) const
NavEKF3(const AP_AHRS *ahrs, const RangeFinder &rng)
#define HGT_I_GATE_DEFAULT
bool coreSetupRequired[7]
void getFlowDebug(float &varFlow, float &gndOffset, float &flowInnovX, float &flowInnovY, float &auxInnov, float &HAGL, float &rngInnov, float &range, float &gndOffsetErr) const
virtual void * malloc_type(size_t size, Memory_Type mem_type)
bool getHAGL(float &HAGL) const
void getMagNED(int8_t instance, Vector3f &magNED) const
void writeWheelOdom(float delAng, float delTime, uint32_t timeStamp_ms, const Vector3f &posOffset, float radius)
bool getPosNE(int8_t instance, Vector2f &posNE) const
void getFilterTimeouts(int8_t instance, uint8_t &timeouts) const
void getQuaternion(int8_t instance, Quaternion &quat) const
int8_t getPrimaryCoreIndex(void) const
#define MAG_M_NSE_DEFAULT
void getStateVariances(float stateVar[24])
AP_HAL::AnalogSource * chan
void getOutputTrackingError(Vector3f &error) const
bool getOriginLLH(int8_t instance, struct Location &loc) const
void writeOptFlowMeas(uint8_t &rawFlowQuality, Vector2f &rawFlowRates, Vector2f &rawGyroRates, uint32_t &msecFlowMeas, const Vector3f &posOffset)
uint8_t setInhibitGPS(void)
#define error(fmt, args ...)
const char * prearm_failure_reason(void) const
void getMagXYZ(Vector3f &magXYZ) const
#define GYRO_P_NSE_DEFAULT
#define FLOW_M_NSE_DEFAULT
AP_InertialSensor & ins()
void getStateVariances(int8_t instance, float stateVar[24]) const
void getAccelNED(Vector3f &accelNED) const
void setTouchdownExpected(bool val)
void getEkfControlLimits(float &ekfGndSpdLimit, float &ekfNavVelGainScaler) const
bool getHeightControlLimit(float &height) const
float getPosDownDerivative(int8_t instance) const
void getAccelBias(int8_t instance, Vector3f &accelBias) const
bool getLLH(struct Location &loc) const
void getWind(int8_t instance, Vector3f &wind) const
uint8_t _framesPerPrediction
uint32_t getLastVelNorthEastReset(Vector2f &vel) const
#define GBIAS_P_NSE_DEFAULT
void getOutputTrackingError(int8_t instance, Vector3f &error) const
void send_status_report(mavlink_channel_t chan)
void Log_Write_Baro(uint64_t time_us=0)
bool getOriginLLH(struct Location &loc) const
void setTerrainHgtStable(bool val)
uint8_t get_accel_count(void) const
friend class NavEKF3_core
uint8_t getActiveMag(int8_t instance) const
void getFilterTimeouts(uint8_t &timeouts) const
static void setup_object_defaults(const void *object_pointer, const struct GroupInfo *group_info)
void writeOptFlowMeas(uint8_t &rawFlowQuality, Vector2f &rawFlowRates, Vector2f &rawGyroRates, uint32_t &msecFlowMeas, const Vector3f &posOffset)
void updateLaneSwitchPosDownResetData(uint8_t new_primary, uint8_t old_primary)
void getAccelNED(Vector3f &accelNED) const
void writeBodyFrameOdom(float quality, const Vector3f &delPos, const Vector3f &delAng, float delTime, uint32_t timeStamp_ms, const Vector3f &posOffset)