Navigation Algorithms
The following are key functions related to navigation algorithms.
MagNav Filter Model
MagNav.create_model — Functioncreate_model(dt = 0.1, lat1 = deg2rad(45);
init_pos_sigma = 3.0,
init_alt_sigma = 0.001,
init_vel_sigma = 0.01,
init_att_sigma = deg2rad(0.01),
meas_var = 3.0^2,
VRW_sigma = 0.000238,
ARW_sigma = 0.000000581,
baro_sigma = 1.0,
ha_sigma = 0.001,
a_hat_sigma = 0.01,
acc_sigma = 0.000245,
gyro_sigma = 0.00000000727,
fogm_sigma = 3.0,
vec_sigma = 1000.0,
TL_sigma = [],
baro_tau = 3600.0,
acc_tau = 3600.0,
gyro_tau = 3600.0,
fogm_tau = 600.0,
vec_states::Bool = false,
fogm_state::Bool = true,
P0_TL = [])Create a magnetic navigation filter model for use in an EKF or a MPF.
Arguments:
dt: measurement time step [s]lat1: initial approximate latitude [rad]init_pos_sigma: (optional) initial position uncertainty [m]init_alt_sigma: (optional) initial altitude uncertainty [m]init_vel_sigma: (optional) initial velocity uncertainty [m/s]init_att_sigma: (optional) initial attitude uncertainty [rad]meas_var: (optional) measurement (white) noise variance [nT^2]VRW_sigma: (optional) velocity random walk [m/s^2 /sqrt(Hz)]ARW_sigma: (optional) angular random walk [rad/s /sqrt(Hz)]baro_sigma: (optional) barometer bias [m]ha_sigma: (optional) barometer aiding altitude bias [m]a_hat_sigma: (optional) barometer aiding vertical accel bias [m/s^2]acc_sigma: (optional) accelerometer bias [m/s^2]gyro_sigma: (optional) gyroscope bias [rad/s]fogm_sigma: (optional) FOGM catch-all bias [nT]vec_sigma: (optional) vector magnetometer noise std devTL_sigma: (optional) Tolles-Lawson coefficients estimate std devbaro_tau: (optional) barometer time constant [s]acc_tau: (optional) accelerometer time constant [s]gyro_tau: (optional) gyroscope time constant [s]fogm_tau: (optional) FOGM catch-all time constant [s]vec_states: (optional) if true, include vector magnetometer statesfogm_state: (optional) if true, include FOGM catch-all bias stateP0_TL: (optional) initial Tolles-Lawson covariance matrix
Returns:
P0: initial covariance matrixQd: discrete time process/system noise matrixR: measurement (white) noise variance
MagNav filter model internals
MagNav.create_P0 — Functioncreate_P0(lat1 = deg2rad(45);
init_pos_sigma = 3.0,
init_alt_sigma = 0.001,
init_vel_sigma = 0.01,
init_att_sigma = deg2rad(0.01),
ha_sigma = 0.001,
a_hat_sigma = 0.01,
acc_sigma = 0.000245,
gyro_sigma = 0.00000000727,
fogm_sigma = 3.0,
vec_sigma = 1000.0,
vec_states::Bool = false,
fogm_state::Bool = true,
P0_TL = [])Create initial covariance matrix P0.
Arguments:
lat1: initial approximate latitude [rad]init_pos_sigma: (optional) initial position uncertainty [m]init_alt_sigma: (optional) initial altitude uncertainty [m]init_vel_sigma: (optional) initial velocity uncertainty [m/s]init_att_sigma: (optional) initial attitude uncertainty [rad]ha_sigma: (optional) barometer aiding altitude bias [m]a_hat_sigma: (optional) barometer aiding vertical accel bias [m/s^2]acc_sigma: (optional) accelerometer bias [m/s^2]gyro_sigma: (optional) gyroscope bias [rad/s]fogm_sigma: (optional) FOGM catch-all bias [nT]vec_sigma: (optional) vector magnetometer noise std devvec_states: (optional) if true, include vector magnetometer statesfogm_state: (optional) if true, include FOGM catch-all bias stateP0_TL: (optional) initial Tolles-Lawson covariance matrix
Returns:
P0: initial covariance matrix
MagNav.create_Qd — Functioncreate_Qd(dt = 0.1;
VRW_sigma = 0.000238,
ARW_sigma = 0.000000581,
baro_sigma = 1.0,
acc_sigma = 0.000245,
gyro_sigma = 0.00000000727,
fogm_sigma = 3.0,
vec_sigma = 1000.0,
TL_sigma = [],
baro_tau = 3600.0,
acc_tau = 3600.0,
gyro_tau = 3600.0,
fogm_tau = 600.0,
vec_states::Bool = false,
fogm_state::Bool = true)Create the discrete time process/system noise matrix Qd.
Arguments:
dt: measurement time step [s]VRW_sigma: (optional) velocity random walk [m/s^2 /sqrt(Hz)]ARW_sigma: (optional) angular random walk [rad/s /sqrt(Hz)]baro_sigma: (optional) barometer bias [m]acc_sigma: (optional) accelerometer bias [m/s^2]gyro_sigma: (optional) gyroscope bias [rad/s]fogm_sigma: (optional) FOGM catch-all bias [nT]vec_sigma: (optional) vector magnetometer noise std devTL_sigma: (optional) Tolles-Lawson coefficients estimate std devbaro_tau: (optional) barometer time constant [s]acc_tau: (optional) accelerometer time constant [s]gyro_tau: (optional) gyroscope time constant [s]fogm_tau: (optional) FOGM catch-all time constant [s]vec_states: (optional) if true, include vector magnetometer statesfogm_state: (optional) if true, include FOGM catch-all bias state
Returns:
Qd: discrete time process/system noise matrix
MagNav.get_pinson — Functionget_pinson(nx::Int, lat, vn, ve, vd, fn, fe, fd, Cnb;
baro_tau = 3600.0,
acc_tau = 3600.0,
gyro_tau = 3600.0,
fogm_tau = 600.0,
vec_states::Bool = false,
fogm_state::Bool = true,
k1=3e-2, k2=3e-4, k3=1e-6)Get the nx x nx Pinson dynamics matrix. States (errors) are:
| Num | State | Units | Description |
|---|---|---|---|
| 1 | lat | rad | latitude |
| 2 | lon | rad | longitude |
| 3 | alt | m | altitude |
| 4 | vn | m/s | north velocity |
| 5 | ve | m/s | east velocity |
| 6 | vd | m/s | down velocity |
| 7 | tn | rad | north tilt (attitude) |
| 8 | te | rad | east tilt (attitude) |
| 9 | td | rad | down tilt (attitude) |
| 10 | ha | m | barometer aiding altitude |
| 11 | a_hat | m/s^2 | barometer aiding vertical acceleration |
| 12 | ax | m/s^2 | x accelerometer |
| 13 | ay | m/s^2 | y accelerometer |
| 14 | az | m/s^2 | z accelerometer |
| 15 | gx | rad/s | x gyroscope |
| 16 | gy | rad/s | y gyroscope |
| 17 | gz | rad/s | z gyroscope |
| end | S | nT | FOGM catch-all |
Arguments:
nx: total state dimensionlat: latitude [rad]vn: north velocity [m/s]ve: east velocity [m/s]vd: down velocity [m/s]fn: north specific force [m/s^2]fe: east specific force [m/s^2]fd: down specific force [m/s^2]Cnb: direction cosine matrix (body to navigation) [-]baro_tau: (optional) barometer time constant [s]acc_tau: (optional) accelerometer time constant [s]gyro_tau: (optional) gyroscope time constant [s]fogm_tau: (optional) FOGM catch-all time constant [s]vec_states: (optional) if true, include vector magnetometer statesfogm_state: (optional) if true, include FOGM catch-all bias statek1: (optional) barometer aiding constant [1/s]k2: (optional) barometer aiding constant [1/s^2]k3: (optional) barometer aiding constant [1/s^3]
Returns:
F:nxxnxPinson matrix
Cramér–Rao Lower Bound
MagNav.crlb — Functioncrlb(lat, lon, alt, vn, ve, vd, fn, fe, fd, Cnb, dt, itp_mapS;
P0 = create_P0(),
Qd = create_Qd(),
R = 1.0,
baro_tau = 3600.0,
acc_tau = 3600.0,
gyro_tau = 3600.0,
fogm_tau = 600.0,
date = get_years(2020,185),
core::Bool = false)Cramér–Rao lower bound (CRLB) computed with classic Kalman Filter. Equations evaluated about true trajectory.
Arguments:
lat: latitude [rad]lon: longitude [rad]alt: altitude [m]vn: north velocity [m/s]ve: east velocity [m/s]vd: down velocity [m/s]fn: north specific force [m/s^2]fe: east specific force [m/s^2]fd: down specific force [m/s^2]Cnb: direction cosine matrix (body to navigation) [-]dt: measurement time step [s]itp_mapS: scalar map interpolation function (f(lat,lon)orf(lat,lon,alt))P0: (optional) initial covariance matrixQd: (optional) discrete time process/system noise matrixR: (optional) measurement (white) noise variancebaro_tau: (optional) barometer time constant [s]acc_tau: (optional) accelerometer time constant [s]gyro_tau: (optional) gyroscope time constant [s]fogm_tau: (optional) FOGM catch-all time constant [s]date: (optional) measurement date (decimal year) for IGRF [yr]core: (optional) if true, include core magnetic field in measurement
Returns:
P: non-linear covariance matrix
crlb(traj::Traj, itp_mapS;
P0 = create_P0(),
Qd = create_Qd(),
R = 1.0,
baro_tau = 3600.0,
acc_tau = 3600.0,
gyro_tau = 3600.0,
fogm_tau = 600.0,
date = get_years(2020,185),
core::Bool = false)Cramér–Rao lower bound (CRLB) computed with classic Kalman Filter. Equations evaluated about true trajectory.
Arguments:
traj:Trajtrajectory structitp_mapS: scalar map interpolation function (f(lat,lon)orf(lat,lon,alt))P0: (optional) initial covariance matrixQd: (optional) discrete time process/system noise matrixR: (optional) measurement (white) noise variancebaro_tau: (optional) barometer time constant [s]acc_tau: (optional) accelerometer time constant [s]gyro_tau: (optional) gyroscope time constant [s]fogm_tau: (optional) FOGM catch-all time constant [s]date: (optional) measurement date (decimal year) for IGRF [yr]core: (optional) if true, include core magnetic field in measurement
Returns:
P: non-linear covariance matrix
Extended Kalman Filter
MagNav.ekf — Functionekf(lat, lon, alt, vn, ve, vd, fn, fe, fd, Cnb, meas, dt, itp_mapS;
P0 = create_P0(),
Qd = create_Qd(),
R = 1.0,
baro_tau = 3600.0,
acc_tau = 3600.0,
gyro_tau = 3600.0,
fogm_tau = 600.0,
date = get_years(2020,185),
core::Bool = false,
der_mapS = nothing,
map_alt = 0)Extended Kalman filter (EKF) for airborne magnetic anomaly navigation.
Arguments:
lat: latitude [rad]lon: longitude [rad]alt: altitude [m]vn: north velocity [m/s]ve: east velocity [m/s]vd: down velocity [m/s]fn: north specific force [m/s^2]fe: east specific force [m/s^2]fd: down specific force [m/s^2]Cnb: direction cosine matrix (body to navigation) [-]meas: scalar magnetometer measurement [nT]dt: measurement time step [s]itp_mapS: scalar map interpolation function (f(lat,lon)orf(lat,lon,alt))P0: (optional) initial covariance matrixQd: (optional) discrete time process/system noise matrixR: (optional) measurement (white) noise variancebaro_tau: (optional) barometer time constant [s]acc_tau: (optional) accelerometer time constant [s]gyro_tau: (optional) gyroscope time constant [s]fogm_tau: (optional) FOGM catch-all time constant [s]date: (optional) measurement date (decimal year) for IGRF [yr]core: (optional) if true, include core magnetic field in measurementder_mapS: (optional) scalar map vertical derivative map interpolation function (f(lat,lon)or (f(lat,lon,alt))map_alt: (optional) map altitude [m]
Returns:
filt_res:FILTresfilter results struct
ekf(ins::INS, meas, itp_mapS;
P0 = create_P0(),
Qd = create_Qd(),
R = 1.0,
baro_tau = 3600.0,
acc_tau = 3600.0,
gyro_tau = 3600.0,
fogm_tau = 600.0,
date = get_years(2020,185),
core::Bool = false,
der_mapS = map_itp(zeros(2,2),[-pi,pi],[-pi/2,pi/2]),
map_alt = 0)Extended Kalman filter (EKF) for airborne magnetic anomaly navigation.
Arguments:
ins:INSinertial navigation system structmeas: scalar magnetometer measurement [nT]itp_mapS: scalar map interpolation function (f(lat,lon)orf(lat,lon,alt))P0: (optional) initial covariance matrixQd: (optional) discrete time process/system noise matrixR: (optional) measurement (white) noise variancebaro_tau: (optional) barometer time constant [s]acc_tau: (optional) accelerometer time constant [s]gyro_tau: (optional) gyroscope time constant [s]fogm_tau: (optional) FOGM catch-all time constant [s]date: (optional) measurement date (decimal year) for IGRF [yr]core: (optional) if true, include core magnetic field in measurementder_mapS: (optional) scalar map vertical derivative map interpolation function (f(lat,lon)or (f(lat,lon,alt))map_alt: (optional) map altitude [m]
Returns:
filt_res:FILTresfilter results struct
Run Filter (with additional options)
MagNav.run_filt — Functionrun_filt(traj::Traj, ins::INS, meas, itp_mapS, filt_type::Symbol = :ekf;
P0 = create_P0(),
Qd = create_Qd(),
R = 1.0,
num_part = 1000,
thresh = 0.8,
baro_tau = 3600.0,
acc_tau = 3600.0,
gyro_tau = 3600.0,
fogm_tau = 600.0,
date = get_years(2020,185),
core::Bool = false,
map_alt = 0,
x_nn = nothing,
m = nothing,
y_norms = nothing,
terms = [:permanent,:induced,:eddy,:bias],
flux::MagV = MagV([0.0],[0.0],[0.0],[0.0]),
x0_TL = ones(eltype(P0),19),
extract::Bool = true,
run_crlb::Bool = true)Run navigation filter and optionally compute Cramér–Rao lower bound (CRLB).
Arguments:
traj:Trajtrajectory structins:INSinertial navigation system structmeas: scalar magnetometer measurement [nT]itp_mapS: scalar map interpolation function (f(lat,lon)orf(lat,lon,alt))filt_type: (optional) filter type {:ekf,:mpf}P0: (optional) initial covariance matrixQd: (optional) discrete time process/system noise matrixR: (optional) measurement (white) noise variancenum_part: (optional) number of particles, only used forfilt_type = :mpfthresh: (optional) resampling threshold fraction {0:1}, only used forfilt_type = :mpfbaro_tau: (optional) barometer time constant [s]acc_tau: (optional) accelerometer time constant [s]gyro_tau: (optional) gyroscope time constant [s]fogm_tau: (optional) FOGM catch-all time constant [s]date: (optional) measurement date (decimal year) for IGRF [yr]core: (optional) if true, include core magnetic field in measurementmap_alt: (optional) map altitude [m]x_nn: (optional)NxNfdata matrix for neural network (Nfis number of features)m: (optional) neural network modely_norms: (optional) tuple ofynormalizations, i.e.,(y_bias,y_scale)terms: (optional) Tolles-Lawson terms to use {:permanent,:induced,:eddy,:bias}flux: (optional)MagVvector magnetometer measurement structx0_TL: (optional) initial Tolles-Lawson coefficient statesextract: (optional) if true, extract output structsrun_crlb: (optional) if true, compute the Cramér–Rao lower bound (CRLB)
Returns:
- if
extract = true&run_crlb = truecrlb_out:CRLBoutCramér–Rao lower bound extracted output structins_out:INSoutinertial navigation system extracted output structfilt_out:FILToutfilter extracted output struct
- if
extract = true&run_crlb = falsefilt_out:FILToutfilter extracted output struct
- if
extract = false&run_crlb = truefilt_res:FILTresfilter results structcrlb_P: Cramér–Rao lower bound non-linear covariance matrix
- if
extract = false&run_crlb = falsefilt_res:FILTresfilter results struct
run_filt(traj::Traj, ins::INS, meas, itp_mapS,
filt_type::Vector{Symbol}; ...)Run multiple filter models and print results (nothing returned).
Arguments:
filt_type: multiple filter types, e.g., [:ekf,:ekf_online_nn]