You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.6 KiB
61 lines
1.6 KiB
function P = PredictCovariance(deltaAngle, ... |
|
deltaVelocity, ... |
|
quat, ... |
|
states,... |
|
P, ... % Previous state covariance matrix |
|
dt) ... % IMU and prediction time step |
|
|
|
% Set filter state process noise other than IMU errors, which are already |
|
% built into the derived covariance predition equations. |
|
% This process noise determines the rate of estimation of IMU bias errors |
|
dAngBiasSigma = dt*dt*5E-4; % delta angle bias process noise (rad) |
|
processNoise = [0*ones(1,6), dAngBiasSigma*[1 1 1]]; |
|
|
|
% Specify the estimated errors on the IMU delta angles and delta velocities |
|
% Allow for 0.5 deg/sec of gyro error |
|
daxNoise = (dt*0.5*pi/180)^2; |
|
dayNoise = (dt*0.5*pi/180)^2; |
|
dazNoise = (dt*0.5*pi/180)^2; |
|
% Allow for 0.5 m/s/s of accelerometer error |
|
dvxNoise = (dt*0.5)^2; |
|
dvyNoise = (dt*0.5)^2; |
|
dvzNoise = (dt*0.5)^2; |
|
|
|
dvx = deltaVelocity(1); |
|
dvy = deltaVelocity(2); |
|
dvz = deltaVelocity(3); |
|
dax = deltaAngle(1); |
|
day = deltaAngle(2); |
|
daz = deltaAngle(3); |
|
|
|
q0 = quat(1); |
|
q1 = quat(2); |
|
q2 = quat(3); |
|
q3 = quat(4); |
|
|
|
dax_b = states(7); |
|
day_b = states(8); |
|
daz_b = states(9); |
|
|
|
% Predicted covariance |
|
F = calcF(dax,dax_b,day,day_b,daz,daz_b,dvx,dvy,dvz,q0,q1,q2,q3); |
|
Q = calcQ(daxNoise,dayNoise,dazNoise,dvxNoise,dvyNoise,dvzNoise,q0,q1,q2,q3); |
|
P = F*P*transpose(F) + Q; |
|
|
|
% Add the general process noise |
|
for i = 1:9 |
|
P(i,i) = P(i,i) + processNoise(i)^2; |
|
end |
|
|
|
% Force symmetry on the covariance matrix to prevent ill-conditioning |
|
% of the matrix which would cause the filter to blow-up |
|
P = 0.5*(P + transpose(P)); |
|
|
|
% ensure diagonals are positive |
|
for i=1:9 |
|
if P(i,i) < 0 |
|
P(i,i) = 0; |
|
end |
|
end |
|
|
|
end |