mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-14 06:43:34 +08:00
EKF: update default tuning parameters
Parameters needed to be changed when covariance prediction error was corrected. The magnetic earth and body field process noise now use separate parameters to help with tuning
This commit is contained in:
+15
-13
@@ -171,7 +171,8 @@ struct parameters {
|
||||
float gyro_bias_p_noise; // process noise for IMU delta angle bias prediction (rad/sec)
|
||||
float accel_bias_p_noise; // process noise for IMU delta velocity bias prediction (m/sec/sec)
|
||||
float gyro_scale_p_noise; // process noise for gyro scale factor prediction (N/A)
|
||||
float mag_p_noise; // process noise for magnetic field prediction (Guass/sec)
|
||||
float mage_p_noise; // process noise for earth magnetic field prediction (Guass/sec)
|
||||
float magb_p_noise; // process noise for body magnetic field prediction (Guass/sec)
|
||||
float wind_vel_p_noise; // process noise for wind velocity prediction (m/sec/sec)
|
||||
float terrain_p_noise; // process noise for terrain offset (m/sec)
|
||||
float terrain_gradient; // gradient of terrain used to estimate process noise due to changing position (m/m)
|
||||
@@ -238,33 +239,34 @@ struct parameters {
|
||||
range_delay_ms = 200.0f;
|
||||
|
||||
// input noise
|
||||
gyro_noise = 1.0e-3f;
|
||||
gyro_noise = 6.0e-2f;
|
||||
accel_noise = 2.5e-1f;
|
||||
|
||||
// process noise
|
||||
gyro_bias_p_noise = 7.0e-5f;
|
||||
accel_bias_p_noise = 1.0e-4f;
|
||||
gyro_scale_p_noise = 3.0e-3f;
|
||||
mag_p_noise = 2.5e-2f;
|
||||
gyro_bias_p_noise = 2.5e-6f;
|
||||
accel_bias_p_noise = 3.0e-5f;
|
||||
gyro_scale_p_noise = 3.0e-4f;
|
||||
mage_p_noise = 2.5e-3f;
|
||||
magb_p_noise = 5.0e-4f;
|
||||
wind_vel_p_noise = 1.0e-1f;
|
||||
terrain_p_noise = 5.0f;
|
||||
terrain_gradient = 0.5f;
|
||||
|
||||
// position and velocity fusion
|
||||
gps_vel_noise = 5.0e-1f;
|
||||
gps_pos_noise = 1.0f;
|
||||
gps_pos_noise = 0.5f;
|
||||
pos_noaid_noise = 10.0f;
|
||||
baro_noise = 3.0f;
|
||||
baro_innov_gate = 3.0f;
|
||||
posNE_innov_gate = 3.0f;
|
||||
vel_innov_gate = 3.0f;
|
||||
baro_noise = 2.0f;
|
||||
baro_innov_gate = 5.0f;
|
||||
posNE_innov_gate = 5.0f;
|
||||
vel_innov_gate = 5.0f;
|
||||
hgt_reset_lim = 5.0f;
|
||||
|
||||
// magnetometer fusion
|
||||
mag_heading_noise = 1.7e-1f;
|
||||
mag_heading_noise = 3.0e-1f;
|
||||
mag_noise = 5.0e-2f;
|
||||
mag_declination_deg = 0.0f;
|
||||
heading_innov_gate = 3.0f;
|
||||
heading_innov_gate = 2.6f;
|
||||
mag_innov_gate = 3.0f;
|
||||
mag_declination_source = 3;
|
||||
mag_fusion_type = 0;
|
||||
|
||||
+5
-5
@@ -153,17 +153,17 @@ void Ekf::predictCovariance()
|
||||
float d_ang_scale_sig = dt * math::constrain(_params.gyro_scale_p_noise, 0.0f, 1e-2f);
|
||||
float mag_I_sig, mag_B_sig;
|
||||
|
||||
// Don't continue to grow the body field variances if they are becoming too large or we are not doing 3-axis fusion as this can make the covariance matrix badly conditioned
|
||||
// Don't continue to grow the earth field variances if they are becoming too large or we are not doing 3-axis fusion as this can make the covariance matrix badly conditioned
|
||||
if (_control_status.flags.mag_3D && (P[16][16] + P[17][17] + P[18][8]) < 0.1f) {
|
||||
mag_I_sig = dt * math::constrain(_params.mag_p_noise, 0.0f, 1e-1f);
|
||||
mag_I_sig = dt * math::constrain(_params.mage_p_noise, 0.0f, 1e-1f);
|
||||
|
||||
} else {
|
||||
mag_I_sig = 0.0f;
|
||||
}
|
||||
|
||||
// Don't continue to grow the earth field variances if they is becoming too large or we are not doing 3-axis fusion as this can make the covariance matrix badly conditioned
|
||||
// Don't continue to grow the body field variances if they is becoming too large or we are not doing 3-axis fusion as this can make the covariance matrix badly conditioned
|
||||
if (_control_status.flags.mag_3D && (P[19][19] + P[20][20] + P[21][21]) < 0.1f) {
|
||||
mag_B_sig = dt * math::constrain(_params.mag_p_noise, 0.0f, 1e-1f);
|
||||
mag_B_sig = dt * math::constrain(_params.magb_p_noise, 0.0f, 1e-1f);
|
||||
|
||||
} else {
|
||||
mag_B_sig = 0.0f;
|
||||
@@ -210,7 +210,7 @@ void Ekf::predictCovariance()
|
||||
// inputs to the system are 3 delta angles and 3 delta velocities
|
||||
float daxNoise, dayNoise, dazNoise;
|
||||
float dvxNoise, dvyNoise, dvzNoise;
|
||||
float gyro_noise = math::constrain(_params.gyro_noise, 1e-4f, 1e-2f);
|
||||
float gyro_noise = math::constrain(_params.gyro_noise, 1e-4f, 1e-1f);
|
||||
daxNoise = dayNoise = dazNoise = dt * gyro_noise;
|
||||
float accel_noise = math::constrain(_params.accel_noise, 1e-2f, 1.0f);
|
||||
dvxNoise = dvyNoise = dvzNoise = dt * accel_noise;
|
||||
|
||||
Reference in New Issue
Block a user