mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-03 02:31:35 +08:00
update ecl/EKF with improved covariance prediction stability and change default IMU integration period 4000 us -> 2500 us
- bring in PX4/ecl#795 "EKF: Improve covariance prediction stability" - the ecl/EKF filter update period has changed from 8 ms to 10 ms - change default integration period 4000 us -> 2500 us (aligns with new EKF filter update period)
This commit is contained in:
@@ -302,7 +302,7 @@ void ICM20602::ConfigureGyro()
|
|||||||
void ICM20602::ConfigureSampleRate(int sample_rate)
|
void ICM20602::ConfigureSampleRate(int sample_rate)
|
||||||
{
|
{
|
||||||
if (sample_rate == 0) {
|
if (sample_rate == 0) {
|
||||||
sample_rate = 1000; // default to 1 kHz
|
sample_rate = 800; // default to 800 Hz
|
||||||
}
|
}
|
||||||
|
|
||||||
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ private:
|
|||||||
|
|
||||||
STATE _state{STATE::RESET};
|
STATE _state{STATE::RESET};
|
||||||
|
|
||||||
uint16_t _fifo_empty_interval_us{1000}; // default 1000 us / 1000 Hz transfer interval
|
uint16_t _fifo_empty_interval_us{1250}; // default 1250 us / 800 Hz transfer interval
|
||||||
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
||||||
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
||||||
|
|
||||||
|
|||||||
@@ -315,7 +315,7 @@ void ICM20608G::ConfigureGyro()
|
|||||||
void ICM20608G::ConfigureSampleRate(int sample_rate)
|
void ICM20608G::ConfigureSampleRate(int sample_rate)
|
||||||
{
|
{
|
||||||
if (sample_rate == 0) {
|
if (sample_rate == 0) {
|
||||||
sample_rate = 1000; // default to 1 kHz
|
sample_rate = 800; // default to 800 Hz
|
||||||
}
|
}
|
||||||
|
|
||||||
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ private:
|
|||||||
|
|
||||||
STATE _state{STATE::RESET};
|
STATE _state{STATE::RESET};
|
||||||
|
|
||||||
uint16_t _fifo_empty_interval_us{1000}; // default 1000 us / 1000 Hz transfer interval
|
uint16_t _fifo_empty_interval_us{1250}; // default 1250 us / 800 Hz transfer interval
|
||||||
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
||||||
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
||||||
|
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ void ICM20649::ConfigureGyro()
|
|||||||
void ICM20649::ConfigureSampleRate(int sample_rate)
|
void ICM20649::ConfigureSampleRate(int sample_rate)
|
||||||
{
|
{
|
||||||
if (sample_rate == 0) {
|
if (sample_rate == 0) {
|
||||||
sample_rate = 1000; // default to ~1 kHz
|
sample_rate = 800; // default to ~800 Hz
|
||||||
}
|
}
|
||||||
|
|
||||||
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ private:
|
|||||||
|
|
||||||
STATE _state{STATE::RESET};
|
STATE _state{STATE::RESET};
|
||||||
|
|
||||||
uint16_t _fifo_empty_interval_us{1000}; // default 1000 us / 1000 Hz transfer interval
|
uint16_t _fifo_empty_interval_us{1250}; // default 1250 us / 800 Hz transfer interval
|
||||||
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
||||||
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
||||||
|
|
||||||
|
|||||||
@@ -315,7 +315,7 @@ void ICM20689::ConfigureGyro()
|
|||||||
void ICM20689::ConfigureSampleRate(int sample_rate)
|
void ICM20689::ConfigureSampleRate(int sample_rate)
|
||||||
{
|
{
|
||||||
if (sample_rate == 0) {
|
if (sample_rate == 0) {
|
||||||
sample_rate = 1000; // default to 1 kHz
|
sample_rate = 800; // default to 800 Hz
|
||||||
}
|
}
|
||||||
|
|
||||||
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ private:
|
|||||||
|
|
||||||
STATE _state{STATE::RESET};
|
STATE _state{STATE::RESET};
|
||||||
|
|
||||||
uint16_t _fifo_empty_interval_us{1000}; // default 1000 us / 1000 Hz transfer interval
|
uint16_t _fifo_empty_interval_us{1250}; // default 1250 us / 800 Hz transfer interval
|
||||||
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
||||||
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
||||||
|
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ void ICM40609D::ConfigureGyro()
|
|||||||
void ICM40609D::ConfigureSampleRate(int sample_rate)
|
void ICM40609D::ConfigureSampleRate(int sample_rate)
|
||||||
{
|
{
|
||||||
if (sample_rate == 0) {
|
if (sample_rate == 0) {
|
||||||
sample_rate = 1000; // default to 1 kHz
|
sample_rate = 800; // default to 800 Hz
|
||||||
}
|
}
|
||||||
|
|
||||||
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ private:
|
|||||||
|
|
||||||
STATE _state{STATE::RESET};
|
STATE _state{STATE::RESET};
|
||||||
|
|
||||||
uint16_t _fifo_empty_interval_us{1000}; // default 1000 us / 1000 Hz transfer interval
|
uint16_t _fifo_empty_interval_us{1250}; // default 1250 us / 800 Hz transfer interval
|
||||||
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
||||||
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
||||||
|
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ void ICM42688P::ConfigureGyro()
|
|||||||
void ICM42688P::ConfigureSampleRate(int sample_rate)
|
void ICM42688P::ConfigureSampleRate(int sample_rate)
|
||||||
{
|
{
|
||||||
if (sample_rate == 0) {
|
if (sample_rate == 0) {
|
||||||
sample_rate = 1000; // default to 1 kHz
|
sample_rate = 800; // default to 800 Hz
|
||||||
}
|
}
|
||||||
|
|
||||||
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ private:
|
|||||||
|
|
||||||
STATE _state{STATE::RESET};
|
STATE _state{STATE::RESET};
|
||||||
|
|
||||||
uint16_t _fifo_empty_interval_us{1000}; // default 1000 us / 1000 Hz transfer interval
|
uint16_t _fifo_empty_interval_us{1250}; // default 1250 us / 800 Hz transfer interval
|
||||||
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
||||||
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
||||||
|
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ void MPU6000::ConfigureGyro()
|
|||||||
void MPU6000::ConfigureSampleRate(int sample_rate)
|
void MPU6000::ConfigureSampleRate(int sample_rate)
|
||||||
{
|
{
|
||||||
if (sample_rate == 0) {
|
if (sample_rate == 0) {
|
||||||
sample_rate = 1000; // default to 1 kHz
|
sample_rate = 800; // default to 800 Hz
|
||||||
}
|
}
|
||||||
|
|
||||||
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ private:
|
|||||||
|
|
||||||
STATE _state{STATE::RESET};
|
STATE _state{STATE::RESET};
|
||||||
|
|
||||||
uint16_t _fifo_empty_interval_us{1000}; // default 1000 us / 1000 Hz transfer interval
|
uint16_t _fifo_empty_interval_us{1250}; // default 1250 us / 800 Hz transfer interval
|
||||||
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
||||||
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
||||||
|
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ void MPU6500::ConfigureGyro()
|
|||||||
void MPU6500::ConfigureSampleRate(int sample_rate)
|
void MPU6500::ConfigureSampleRate(int sample_rate)
|
||||||
{
|
{
|
||||||
if (sample_rate == 0) {
|
if (sample_rate == 0) {
|
||||||
sample_rate = 1000; // default to 1 kHz
|
sample_rate = 800; // default to 800 Hz
|
||||||
}
|
}
|
||||||
|
|
||||||
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ private:
|
|||||||
|
|
||||||
STATE _state{STATE::RESET};
|
STATE _state{STATE::RESET};
|
||||||
|
|
||||||
uint16_t _fifo_empty_interval_us{1000}; // default 1000 us / 1000 Hz transfer interval
|
uint16_t _fifo_empty_interval_us{1250}; // default 1250 us / 800 Hz transfer interval
|
||||||
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
||||||
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
||||||
|
|
||||||
|
|||||||
@@ -343,7 +343,7 @@ void MPU9250::ConfigureGyro()
|
|||||||
void MPU9250::ConfigureSampleRate(int sample_rate)
|
void MPU9250::ConfigureSampleRate(int sample_rate)
|
||||||
{
|
{
|
||||||
if (sample_rate == 0) {
|
if (sample_rate == 0) {
|
||||||
sample_rate = 1000; // default to 1 kHz
|
sample_rate = 800; // default to 800 Hz
|
||||||
}
|
}
|
||||||
|
|
||||||
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
// round down to nearest FIFO sample dt * SAMPLES_PER_TRANSFER
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ private:
|
|||||||
|
|
||||||
STATE _state{STATE::RESET};
|
STATE _state{STATE::RESET};
|
||||||
|
|
||||||
uint16_t _fifo_empty_interval_us{1000}; // default 1000 us / 1000 Hz transfer interval
|
uint16_t _fifo_empty_interval_us{1250}; // default 1250 us / 800 Hz transfer interval
|
||||||
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
uint8_t _fifo_gyro_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / GYRO_RATE))};
|
||||||
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
uint8_t _fifo_accel_samples{static_cast<uint8_t>(_fifo_empty_interval_us / (1000000 / ACCEL_RATE))};
|
||||||
|
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ void PX4Accelerometer::set_update_rate(uint16_t rate)
|
|||||||
const uint32_t update_interval = 1000000 / rate;
|
const uint32_t update_interval = 1000000 / rate;
|
||||||
|
|
||||||
// TODO: set this intelligently
|
// TODO: set this intelligently
|
||||||
_integrator_reset_samples = 4000 / update_interval;
|
_integrator_reset_samples = 2500 / update_interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PX4Accelerometer::update(hrt_abstime timestamp_sample, float x, float y, float z)
|
void PX4Accelerometer::update(hrt_abstime timestamp_sample, float x, float y, float z)
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ private:
|
|||||||
|
|
||||||
hrt_abstime _status_last_publish{0};
|
hrt_abstime _status_last_publish{0};
|
||||||
|
|
||||||
Integrator _integrator{4000, false};
|
Integrator _integrator{2500, false};
|
||||||
|
|
||||||
matrix::Vector3f _calibration_scale{1.f, 1.f, 1.f};
|
matrix::Vector3f _calibration_scale{1.f, 1.f, 1.f};
|
||||||
matrix::Vector3f _calibration_offset{0.f, 0.f, 0.f};
|
matrix::Vector3f _calibration_offset{0.f, 0.f, 0.f};
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
class Integrator
|
class Integrator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Integrator(uint32_t auto_reset_interval = 4000 /* 250 Hz */, bool coning_compensation = false);
|
Integrator(uint32_t auto_reset_interval = 2500 /* 400 Hz */, bool coning_compensation = false);
|
||||||
~Integrator() = default;
|
~Integrator() = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ void PX4Gyroscope::set_update_rate(uint16_t rate)
|
|||||||
const uint32_t update_interval = 1000000 / rate;
|
const uint32_t update_interval = 1000000 / rate;
|
||||||
|
|
||||||
// TODO: set this intelligently
|
// TODO: set this intelligently
|
||||||
_integrator_reset_samples = 4000 / update_interval;
|
_integrator_reset_samples = 2500 / update_interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PX4Gyroscope::update(hrt_abstime timestamp_sample, float x, float y, float z)
|
void PX4Gyroscope::update(hrt_abstime timestamp_sample, float x, float y, float z)
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ private:
|
|||||||
|
|
||||||
hrt_abstime _status_last_publish{0};
|
hrt_abstime _status_last_publish{0};
|
||||||
|
|
||||||
Integrator _integrator{4000, true};
|
Integrator _integrator{2500, true};
|
||||||
|
|
||||||
matrix::Vector3f _calibration_offset{0.f, 0.f, 0.f};
|
matrix::Vector3f _calibration_offset{0.f, 0.f, 0.f};
|
||||||
|
|
||||||
|
|||||||
+1
-1
Submodule src/lib/ecl updated: 47624a0f02...8a9d961f0d
@@ -318,8 +318,8 @@ MulticopterPositionControl::init()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// limit to every other vehicle_local_position update (~62.5 Hz)
|
// limit to every other vehicle_local_position update (50 Hz)
|
||||||
_local_pos_sub.set_interval_us(16_ms);
|
_local_pos_sub.set_interval_us(20_ms);
|
||||||
|
|
||||||
_time_stamp_last_loop = hrt_absolute_time();
|
_time_stamp_last_loop = hrt_absolute_time();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user