gnss-rtk 0.8.0

GNSS position solver
Documentation
use crate::{
    navigation::State,
    prelude::{Almanac, Epoch, Orbit, Vector3, EARTH_J2000, SPEED_OF_LIGHT_M_S},
    tests::data::gps::J2020_06_25_GPS_EPOCHS,
};

use anise::math::{Vector4, Vector6};
use std::str::FromStr;

#[test]
fn state_initialization() {
    let almanac = Almanac::until_2035().unwrap();
    let frame = almanac.frame_from_uid(EARTH_J2000).unwrap();

    let t0 = Epoch::from_str(J2020_06_25_GPS_EPOCHS[0]).unwrap();

    let coords = Vector3::new(1.0, 2.0, 3.0);

    let mut state = State::from_ecef_m(coords, t0, frame).unwrap();

    assert_eq!(state.pos_m, (1.0, 2.0, 3.0));
    assert_eq!(state.dt.total_nanoseconds(), 0);

    let dx = Vector4::new(1.0, 2.0, 3.0, 4.0);
    state.update(dx);

    assert_eq!(state.pos_m, (2.0, 4.0, 6.0));

    let dt_nanos = (4.0 / SPEED_OF_LIGHT_M_S * 1E9).round() as i128;
    assert_eq!(state.dt.total_nanoseconds(), dt_nanos);

    let pos_vel_km = Vector6::new(1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
    let orbit = Orbit::from_cartesian_pos_vel(pos_vel_km, t0, frame);

    let state = State::from_orbit(&orbit).unwrap();

    assert_eq!(state.pos_m, (1000.0, 2000.0, 3000.0));
    assert_eq!(state.dt.total_nanoseconds(), 0);
}