123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- % IMPORTANT - This script requires the Matlab symbolic toolbox
- % Author: Paul Riseborough
- % Last Modified: 16 Feb 2014
- % Derivation of a navigation EKF using a local NED earth Tangent Frame for
- % the initial alignment and gyro bias estimation from a moving platform
- % Uses quaternions for attitude propagation
- % State vector:
- % quaternions
- % Velocity - North, East, Down (m/s)
- % Delta Angle bias - X,Y,Z (rad)
- % Observations:
- % NED velocity - N,E,D (m/s)
- % body fixed magnetic field vector - X,Y,Z
- % Time varying parameters:
- % XYZ delta angle measurements in body axes - rad
- % XYZ delta velocity measurements in body axes - m/sec
- % magnetic declination
- clear all;
- %% define symbolic variables and constants
- syms dax day daz real % IMU delta angle measurements in body axes - rad
- syms dvx dvy dvz real % IMU delta velocity measurements in body axes - m/sec
- syms q0 q1 q2 q3 real % quaternions defining attitude of body axes relative to local NED
- syms vn ve vd real % NED velocity - m/sec
- syms dax_b day_b daz_b real % delta angle bias - rad
- syms dvx_b dvy_b dvz_b real % delta velocity bias - m/sec
- syms dt real % IMU time step - sec
- syms gravity real % gravity - m/sec^2
- syms daxNoise dayNoise dazNoise dvxNoise dvyNoise dvzNoise real; % IMU delta angle and delta velocity measurement noise
- syms vwn vwe real; % NE wind velocity - m/sec
- syms magX magY magZ real; % XYZ body fixed magnetic field measurements - milligauss
- syms magN magE magD real; % NED earth fixed magnetic field components - milligauss
- syms R_VN R_VE R_VD real % variances for NED velocity measurements - (m/sec)^2
- syms R_MAG real % variance for magnetic flux measurements - milligauss^2
- %% define the process equations
- % define the measured Delta angle and delta velocity vectors
- dAngMeas = [dax; day; daz];
- dVelMeas = [dvx; dvy; dvz];
- % define the delta angle bias errors
- dAngBias = [dax_b; day_b; daz_b];
- % define the quaternion rotation vector for the state estimate
- quat = [q0;q1;q2;q3];
- % derive the truth body to nav direction cosine matrix
- Tbn = Quat2Tbn(quat);
- % define the truth delta angle
- % ignore coning acompensation as these effects are negligible in terms of
- % covariance growth for our application and grade of sensor
- dAngTruth = dAngMeas - dAngBias;
- % Define the truth delta velocity
- dVelTruth = dVelMeas;
- % define the attitude update equations
- % use a first order expansion of rotation to calculate the quaternion increment
- % acceptable for propagation of covariances
- deltaQuat = [1;
- 0.5*dAngTruth(1);
- 0.5*dAngTruth(2);
- 0.5*dAngTruth(3);
- ];
- quatNew = QuatMult(quat,deltaQuat);
- % define the velocity update equations
- % ignore coriolis terms for linearisation purposes
- vNew = [vn;ve;vd] + [0;0;gravity]*dt + Tbn*dVelTruth;
- % define the IMU bias error update equations
- dabNew = [dax_b; day_b; daz_b];
- % Define the state vector & number of states
- stateVector = [quat;vn;ve;vd;dAngBias];
- nStates=numel(stateVector);
- %% derive the covariance prediction equation
- % This reduces the number of floating point operations by a factor of 6 or
- % more compared to using the standard matrix operations in code
- % Define the control (disturbance) vector. Use the measured delta angles
- % and velocities (not truth) to simplify the derivation
- distVector = [dAngMeas;dVelMeas];
- % derive the control(disturbance) influence matrix
- G = jacobian([quatNew;vNew;dabNew], distVector);
- f = matlabFunction(G,'file','calcG.m');
- % derive the state error matrix
- imuNoise = diag([daxNoise dayNoise dazNoise dvxNoise dvyNoise dvzNoise]);
- Q = G*imuNoise*transpose(G);
- f = matlabFunction(Q,'file','calcQ.m');
- % derive the state transition matrix
- F = jacobian([quatNew;vNew;dabNew], stateVector);
- f = matlabFunction(F,'file','calcF.m');
- %% derive equations for fusion of magnetic deviation measurement
- % rotate body measured field into earth axes
- magMeasNED = Tbn*[magX;magY;magZ];
- % the predicted measurement is the angle wrt true north of the horizontal
- % component of the measured field
- angMeas = tan(magMeasNED(2)/magMeasNED(1));
- H_MAG = jacobian(angMeas,stateVector); % measurement Jacobian
- f = matlabFunction(H_MAG,'file','calcH_MAG.m');
|