mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-27 18:27:05 +08:00
ekf2: directly use IMU sample to find corresponding aid source sample
- I think this helps make it clear we're using a sensor sample corresponding with a particular IMU sample
This commit is contained in:
@@ -33,12 +33,12 @@
|
|||||||
|
|
||||||
#include "ekf.h"
|
#include "ekf.h"
|
||||||
|
|
||||||
void Ekf::controlAuxVelFusion()
|
void Ekf::controlAuxVelFusion(const imuSample &imu_sample)
|
||||||
{
|
{
|
||||||
if (_auxvel_buffer) {
|
if (_auxvel_buffer) {
|
||||||
auxVelSample sample;
|
auxVelSample sample;
|
||||||
|
|
||||||
if (_auxvel_buffer->pop_first_older_than(_time_delayed_us, &sample)) {
|
if (_auxvel_buffer->pop_first_older_than(imu_sample.time_us, &sample)) {
|
||||||
|
|
||||||
updateAidSourceStatus(_aid_src_aux_vel,
|
updateAidSourceStatus(_aid_src_aux_vel,
|
||||||
sample.time_us, // sample timestamp
|
sample.time_us, // sample timestamp
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ void Ekf::controlBaroHeightFusion(const imuSample &imu_sample)
|
|||||||
|
|
||||||
baroSample baro_sample;
|
baroSample baro_sample;
|
||||||
|
|
||||||
if (_baro_buffer && _baro_buffer->pop_first_older_than(_time_delayed_us, &baro_sample)) {
|
if (_baro_buffer && _baro_buffer->pop_first_older_than(imu_sample.time_us, &baro_sample)) {
|
||||||
|
|
||||||
#if defined(CONFIG_EKF2_BARO_COMPENSATION)
|
#if defined(CONFIG_EKF2_BARO_COMPENSATION)
|
||||||
const float measurement = compensateBaroForDynamicPressure(imu_sample, baro_sample.hgt);
|
const float measurement = compensateBaroForDynamicPressure(imu_sample, baro_sample.hgt);
|
||||||
@@ -137,7 +137,7 @@ void Ekf::controlBaroHeightFusion(const imuSample &imu_sample)
|
|||||||
// reset vertical velocity
|
// reset vertical velocity
|
||||||
resetVerticalVelocityToZero();
|
resetVerticalVelocityToZero();
|
||||||
|
|
||||||
aid_src.time_last_fuse = _time_delayed_us;
|
aid_src.time_last_fuse = imu_sample.time_us;
|
||||||
|
|
||||||
} else if (is_fusion_failing) {
|
} else if (is_fusion_failing) {
|
||||||
// Some other height source is still working
|
// Some other height source is still working
|
||||||
@@ -166,7 +166,7 @@ void Ekf::controlBaroHeightFusion(const imuSample &imu_sample)
|
|||||||
bias_est.setBias(_state.pos(2) + _baro_lpf.getState());
|
bias_est.setBias(_state.pos(2) + _baro_lpf.getState());
|
||||||
}
|
}
|
||||||
|
|
||||||
aid_src.time_last_fuse = _time_delayed_us;
|
aid_src.time_last_fuse = imu_sample.time_us;
|
||||||
bias_est.setFusionActive();
|
bias_est.setFusionActive();
|
||||||
_control_status.flags.baro_hgt = true;
|
_control_status.flags.baro_hgt = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ void Ekf::controlExternalVisionFusion(const imuSample &imu_sample)
|
|||||||
// Check for new external vision data
|
// Check for new external vision data
|
||||||
extVisionSample ev_sample;
|
extVisionSample ev_sample;
|
||||||
|
|
||||||
if (_ext_vision_buffer && _ext_vision_buffer->pop_first_older_than(_time_delayed_us, &ev_sample)) {
|
if (_ext_vision_buffer && _ext_vision_buffer->pop_first_older_than(imu_sample.time_us, &ev_sample)) {
|
||||||
|
|
||||||
bool ev_reset = (ev_sample.reset_counter != _ev_sample_prev.reset_counter);
|
bool ev_reset = (ev_sample.reset_counter != _ev_sample_prev.reset_counter);
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
|
|
||||||
#include <ekf_derivation/generated/compute_mag_innov_innov_var_and_hx.h>
|
#include <ekf_derivation/generated/compute_mag_innov_innov_var_and_hx.h>
|
||||||
|
|
||||||
void Ekf::controlMagFusion()
|
void Ekf::controlMagFusion(const imuSample &imu_sample)
|
||||||
{
|
{
|
||||||
static constexpr const char *AID_SRC_NAME = "mag";
|
static constexpr const char *AID_SRC_NAME = "mag";
|
||||||
estimator_aid_source3d_s &aid_src = _aid_src_mag;
|
estimator_aid_source3d_s &aid_src = _aid_src_mag;
|
||||||
@@ -59,7 +59,7 @@ void Ekf::controlMagFusion()
|
|||||||
|
|
||||||
magSample mag_sample;
|
magSample mag_sample;
|
||||||
|
|
||||||
if (_mag_buffer && _mag_buffer->pop_first_older_than(_time_delayed_us, &mag_sample)) {
|
if (_mag_buffer && _mag_buffer->pop_first_older_than(imu_sample.time_us, &mag_sample)) {
|
||||||
|
|
||||||
if (mag_sample.reset || (_mag_counter == 0)) {
|
if (mag_sample.reset || (_mag_counter == 0)) {
|
||||||
// sensor or calibration has changed, reset low pass filter
|
// sensor or calibration has changed, reset low pass filter
|
||||||
@@ -185,7 +185,7 @@ void Ekf::controlMagFusion()
|
|||||||
if (mag_sample.reset || checkHaglYawResetReq() || (wmm_updated && no_ne_aiding_or_pre_takeoff)) {
|
if (mag_sample.reset || checkHaglYawResetReq() || (wmm_updated && no_ne_aiding_or_pre_takeoff)) {
|
||||||
ECL_INFO("reset to %s", AID_SRC_NAME);
|
ECL_INFO("reset to %s", AID_SRC_NAME);
|
||||||
resetMagStates(_mag_lpf.getState(), _control_status.flags.mag_hdg || _control_status.flags.mag_3D);
|
resetMagStates(_mag_lpf.getState(), _control_status.flags.mag_hdg || _control_status.flags.mag_3D);
|
||||||
aid_src.time_last_fuse = _time_delayed_us;
|
aid_src.time_last_fuse = imu_sample.time_us;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// The normal sequence is to fuse the magnetometer data first before fusing
|
// The normal sequence is to fuse the magnetometer data first before fusing
|
||||||
@@ -213,7 +213,7 @@ void Ekf::controlMagFusion()
|
|||||||
if (no_ne_aiding_or_pre_takeoff) {
|
if (no_ne_aiding_or_pre_takeoff) {
|
||||||
ECL_WARN("%s fusion failing, resetting", AID_SRC_NAME);
|
ECL_WARN("%s fusion failing, resetting", AID_SRC_NAME);
|
||||||
resetMagStates(_mag_lpf.getState(), _control_status.flags.mag_hdg || _control_status.flags.mag_3D);
|
resetMagStates(_mag_lpf.getState(), _control_status.flags.mag_hdg || _control_status.flags.mag_3D);
|
||||||
aid_src.time_last_fuse = _time_delayed_us;
|
aid_src.time_last_fuse = imu_sample.time_us;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ECL_WARN("stopping %s, fusion failing", AID_SRC_NAME);
|
ECL_WARN("stopping %s, fusion failing", AID_SRC_NAME);
|
||||||
@@ -242,7 +242,7 @@ void Ekf::controlMagFusion()
|
|||||||
bool reset_heading = !_control_status.flags.yaw_align;
|
bool reset_heading = !_control_status.flags.yaw_align;
|
||||||
|
|
||||||
resetMagStates(_mag_lpf.getState(), reset_heading);
|
resetMagStates(_mag_lpf.getState(), reset_heading);
|
||||||
aid_src.time_last_fuse = _time_delayed_us;
|
aid_src.time_last_fuse = imu_sample.time_us;
|
||||||
|
|
||||||
if (reset_heading) {
|
if (reset_heading) {
|
||||||
_control_status.flags.yaw_align = true;
|
_control_status.flags.yaw_align = true;
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
#include "ekf.h"
|
#include "ekf.h"
|
||||||
#include "ekf_derivation/generated/compute_hagl_innov_var.h"
|
#include "ekf_derivation/generated/compute_hagl_innov_var.h"
|
||||||
|
|
||||||
void Ekf::controlRangeHaglFusion()
|
void Ekf::controlRangeHaglFusion(const imuSample &imu_sample)
|
||||||
{
|
{
|
||||||
static constexpr const char *HGT_SRC_NAME = "RNG";
|
static constexpr const char *HGT_SRC_NAME = "RNG";
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ void Ekf::controlRangeHaglFusion()
|
|||||||
|
|
||||||
if (_range_buffer) {
|
if (_range_buffer) {
|
||||||
// Get range data from buffer and check validity
|
// Get range data from buffer and check validity
|
||||||
rng_data_ready = _range_buffer->pop_first_older_than(_time_delayed_us, _range_sensor.getSampleAddress());
|
rng_data_ready = _range_buffer->pop_first_older_than(imu_sample.time_us, _range_sensor.getSampleAddress());
|
||||||
_range_sensor.setDataReadiness(rng_data_ready);
|
_range_sensor.setDataReadiness(rng_data_ready);
|
||||||
|
|
||||||
// update range sensor angle parameters in case they have changed
|
// update range sensor angle parameters in case they have changed
|
||||||
@@ -55,7 +55,7 @@ void Ekf::controlRangeHaglFusion()
|
|||||||
_range_sensor.setCosMaxTilt(_params.range_cos_max_tilt);
|
_range_sensor.setCosMaxTilt(_params.range_cos_max_tilt);
|
||||||
_range_sensor.setQualityHysteresis(_params.range_valid_quality_s);
|
_range_sensor.setQualityHysteresis(_params.range_valid_quality_s);
|
||||||
|
|
||||||
_range_sensor.runChecks(_time_delayed_us, _R_to_earth);
|
_range_sensor.runChecks(imu_sample.time_us, _R_to_earth);
|
||||||
|
|
||||||
if (_range_sensor.isDataHealthy()) {
|
if (_range_sensor.isDataHealthy()) {
|
||||||
// correct the range data for position offset relative to the IMU
|
// correct the range data for position offset relative to the IMU
|
||||||
@@ -72,7 +72,7 @@ void Ekf::controlRangeHaglFusion()
|
|||||||
|
|
||||||
_rng_consistency_check.setGate(_params.range_kin_consistency_gate);
|
_rng_consistency_check.setGate(_params.range_kin_consistency_gate);
|
||||||
_rng_consistency_check.update(_range_sensor.getDistBottom(), math::max(var, 0.001f), _state.vel(2),
|
_rng_consistency_check.update(_range_sensor.getDistBottom(), math::max(var, 0.001f), _state.vel(2),
|
||||||
P(State::vel.idx + 2, State::vel.idx + 2), horizontal_motion, _time_delayed_us);
|
P(State::vel.idx + 2, State::vel.idx + 2), horizontal_motion, imu_sample.time_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -151,7 +151,7 @@ void Ekf::controlRangeHaglFusion()
|
|||||||
_control_status.flags.rng_hgt = true;
|
_control_status.flags.rng_hgt = true;
|
||||||
stopRngTerrFusion();
|
stopRngTerrFusion();
|
||||||
|
|
||||||
aid_src.time_last_fuse = _time_delayed_us;
|
aid_src.time_last_fuse = imu_sample.time_us;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -183,7 +183,7 @@ void Ekf::controlRangeHaglFusion()
|
|||||||
// reset vertical velocity
|
// reset vertical velocity
|
||||||
resetVerticalVelocityToZero();
|
resetVerticalVelocityToZero();
|
||||||
|
|
||||||
aid_src.time_last_fuse = _time_delayed_us;
|
aid_src.time_last_fuse = imu_sample.time_us;
|
||||||
|
|
||||||
} else if (is_fusion_failing) {
|
} else if (is_fusion_failing) {
|
||||||
// Some other height source is still working
|
// Some other height source is still working
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ void Ekf::controlFusionModes(const imuSample &imu_delayed)
|
|||||||
|
|
||||||
#if defined(CONFIG_EKF2_MAGNETOMETER)
|
#if defined(CONFIG_EKF2_MAGNETOMETER)
|
||||||
// control use of observations for aiding
|
// control use of observations for aiding
|
||||||
controlMagFusion();
|
controlMagFusion(imu_delayed);
|
||||||
#endif // CONFIG_EKF2_MAGNETOMETER
|
#endif // CONFIG_EKF2_MAGNETOMETER
|
||||||
|
|
||||||
#if defined(CONFIG_EKF2_OPTICAL_FLOW)
|
#if defined(CONFIG_EKF2_OPTICAL_FLOW)
|
||||||
@@ -142,7 +142,7 @@ void Ekf::controlFusionModes(const imuSample &imu_delayed)
|
|||||||
|
|
||||||
#if defined(CONFIG_EKF2_AUXVEL)
|
#if defined(CONFIG_EKF2_AUXVEL)
|
||||||
// Additional horizontal velocity data from an auxiliary sensor can be fused
|
// Additional horizontal velocity data from an auxiliary sensor can be fused
|
||||||
controlAuxVelFusion();
|
controlAuxVelFusion(imu_delayed);
|
||||||
#endif // CONFIG_EKF2_AUXVEL
|
#endif // CONFIG_EKF2_AUXVEL
|
||||||
//
|
//
|
||||||
#if defined(CONFIG_EKF2_TERRAIN)
|
#if defined(CONFIG_EKF2_TERRAIN)
|
||||||
|
|||||||
@@ -841,7 +841,7 @@ private:
|
|||||||
|
|
||||||
#if defined(CONFIG_EKF2_RANGE_FINDER)
|
#if defined(CONFIG_EKF2_RANGE_FINDER)
|
||||||
// range height
|
// range height
|
||||||
void controlRangeHaglFusion();
|
void controlRangeHaglFusion(const imuSample &imu_delayed);
|
||||||
bool isConditionalRangeAidSuitable();
|
bool isConditionalRangeAidSuitable();
|
||||||
void stopRngHgtFusion();
|
void stopRngHgtFusion();
|
||||||
void stopRngTerrFusion();
|
void stopRngTerrFusion();
|
||||||
@@ -1019,7 +1019,7 @@ private:
|
|||||||
|
|
||||||
#if defined(CONFIG_EKF2_MAGNETOMETER)
|
#if defined(CONFIG_EKF2_MAGNETOMETER)
|
||||||
// control fusion of magnetometer observations
|
// control fusion of magnetometer observations
|
||||||
void controlMagFusion();
|
void controlMagFusion(const imuSample &imu_sample);
|
||||||
|
|
||||||
bool checkHaglYawResetReq() const;
|
bool checkHaglYawResetReq() const;
|
||||||
|
|
||||||
@@ -1052,7 +1052,7 @@ private:
|
|||||||
|
|
||||||
#if defined(CONFIG_EKF2_AUXVEL)
|
#if defined(CONFIG_EKF2_AUXVEL)
|
||||||
// control fusion of auxiliary velocity observations
|
// control fusion of auxiliary velocity observations
|
||||||
void controlAuxVelFusion();
|
void controlAuxVelFusion(const imuSample &imu_sample);
|
||||||
void stopAuxVelFusion();
|
void stopAuxVelFusion();
|
||||||
#endif // CONFIG_EKF2_AUXVEL
|
#endif // CONFIG_EKF2_AUXVEL
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ void Ekf::controlHeightFusion(const imuSample &imu_delayed)
|
|||||||
#endif // CONFIG_EKF2_GNSS
|
#endif // CONFIG_EKF2_GNSS
|
||||||
|
|
||||||
#if defined(CONFIG_EKF2_RANGE_FINDER)
|
#if defined(CONFIG_EKF2_RANGE_FINDER)
|
||||||
controlRangeHaglFusion();
|
controlRangeHaglFusion(imu_delayed);
|
||||||
#endif // CONFIG_EKF2_RANGE_FINDER
|
#endif // CONFIG_EKF2_RANGE_FINDER
|
||||||
|
|
||||||
checkHeightSensorRefFallback();
|
checkHeightSensorRefFallback();
|
||||||
|
|||||||
Reference in New Issue
Block a user