|
17 | 17 | use crate::earth::{METERS_TO_DEGREES, relative_barometric_altitude}; |
18 | 18 | use crate::linalg::matrix_square_root; |
19 | 19 | use crate::{IMUData, StrapdownState, forward, wrap_to_2pi}; |
| 20 | + |
| 21 | +use std::convert::{From, Into}; |
| 22 | +use std::fmt::Debug; |
| 23 | + |
20 | 24 | use nalgebra::{DMatrix, DVector, Rotation3}; |
21 | 25 | use rand; |
22 | | -//use rand_distr::{Distribution, Normal}; |
23 | | -use std::fmt::Debug; |
24 | 26 |
|
25 | 27 | /// Basic strapdown state parameters for the UKF and particle filter initialization. |
26 | 28 | #[derive(Clone, Debug, Default)] |
@@ -50,7 +52,7 @@ pub trait MeasurementModel { |
50 | 52 | } |
51 | 53 | /// GPS position measurement model |
52 | 54 | #[derive(Clone, Debug, Default)] |
53 | | -pub struct GPSPositionMeasurement { |
| 55 | +pub struct GPSPositionMeasurement { // <-- Check this model for degree/radian consistency |
54 | 56 | /// latitude in degrees |
55 | 57 | pub latitude: f64, |
56 | 58 | /// longitude in degrees |
@@ -600,7 +602,21 @@ mod tests { |
600 | 602 | use crate::earth; |
601 | 603 | use super::*; |
602 | 604 | use assert_approx_eq::assert_approx_eq; |
603 | | - use nalgebra::{SVector, Vector3}; |
| 605 | + use nalgebra::Vector3; |
| 606 | + |
| 607 | + const params: StrapdownParams = StrapdownParams { |
| 608 | + latitude: 0.0, |
| 609 | + longitude: 0.0, |
| 610 | + altitude: 0.0, |
| 611 | + northward_velocity: 0.0, |
| 612 | + eastward_velocity: 0.0, |
| 613 | + downward_velocity: 0.0, |
| 614 | + roll: 0.0, |
| 615 | + pitch: 0.0, |
| 616 | + yaw: 0.0, |
| 617 | + in_degrees: false, |
| 618 | + }; |
| 619 | + |
604 | 620 | #[test] |
605 | 621 | fn ukf_construction() { |
606 | 622 | let position = [0.0, 0.0, 0.0]; |
@@ -758,41 +774,41 @@ mod tests { |
758 | 774 | assert_approx_eq!(ukf.mean_state[4], 0.0, 0.1); |
759 | 775 | assert_approx_eq!(ukf.mean_state[5], 0.0, 0.1); |
760 | 776 | } |
761 | | - #[test] |
762 | | - fn ukf_debug() { |
763 | | - let imu_biases = vec![0.0, 0.0, 0.0]; |
764 | | - let measurement_bias = vec![1.0, 1.0, 1.0]; |
765 | | - let n = 9 + imu_biases.len() + measurement_bias.len(); |
766 | | - let covariance_diagonal = vec![1e-3; n]; |
767 | | - let process_noise_diagonal = vec![1e-3; n]; |
768 | | - let alpha = 1e-3; |
769 | | - let beta = 2.0; |
770 | | - let kappa = 1e-3; |
771 | | - let ukf_params = StrapdownParams { |
772 | | - latitude: 0.0, |
773 | | - longitude: 0.0, |
774 | | - altitude: 0.0, |
775 | | - northward_velocity: 0.0, |
776 | | - eastward_velocity: 0.0, |
777 | | - downward_velocity: 0.0, |
778 | | - roll: 0.0, |
779 | | - pitch: 0.0, |
780 | | - yaw: 0.0, |
781 | | - in_degrees: false, |
782 | | - }; |
783 | | - let ukf = UKF::new( |
784 | | - ukf_params, |
785 | | - imu_biases.clone(), |
786 | | - Some(measurement_bias.clone()), |
787 | | - covariance_diagonal, |
788 | | - DMatrix::from_diagonal(&DVector::from_vec(process_noise_diagonal)), |
789 | | - alpha, |
790 | | - beta, |
791 | | - kappa, |
792 | | - ); |
793 | | - let debug_str = format!("{:?}", ukf); |
794 | | - assert!(debug_str.contains("mean_state")); |
795 | | - } |
| 777 | + //#[test] |
| 778 | + //fn ukf_debug() { |
| 779 | + // let imu_biases = vec![0.0, 0.0, 0.0]; |
| 780 | + // let measurement_bias = vec![1.0, 1.0, 1.0]; |
| 781 | + // let n = 9 + imu_biases.len() + measurement_bias.len(); |
| 782 | + // let covariance_diagonal = vec![1e-3; n]; |
| 783 | + // let process_noise_diagonal = vec![1e-3; n]; |
| 784 | + // let alpha = 1e-3; |
| 785 | + // let beta = 2.0; |
| 786 | + // let kappa = 1e-3; |
| 787 | + // let ukf_params = StrapdownParams { |
| 788 | + // latitude: 0.0, |
| 789 | + // longitude: 0.0, |
| 790 | + // altitude: 0.0, |
| 791 | + // northward_velocity: 0.0, |
| 792 | + // eastward_velocity: 0.0, |
| 793 | + // downward_velocity: 0.0, |
| 794 | + // roll: 0.0, |
| 795 | + // pitch: 0.0, |
| 796 | + // yaw: 0.0, |
| 797 | + // in_degrees: false, |
| 798 | + // }; |
| 799 | + // let ukf = UKF::new( |
| 800 | + // ukf_params, |
| 801 | + // imu_biases.clone(), |
| 802 | + // Some(measurement_bias.clone()), |
| 803 | + // covariance_diagonal, |
| 804 | + // DMatrix::from_diagonal(&DVector::from_vec(process_noise_diagonal)), |
| 805 | + // alpha, |
| 806 | + // beta, |
| 807 | + // kappa, |
| 808 | + // ); |
| 809 | + // let debug_str = format!("{:?}", ukf); |
| 810 | + // assert!(debug_str.contains("mean_state")); |
| 811 | + //} |
796 | 812 | //#[test] |
797 | 813 | //fn test_ukf_hover() { |
798 | 814 | // let imu_data = IMUData::new_from_vec(vec![0.0, 0.0, earth::gravity(&0.0, &0.0)], vec![0.0, 0.0, 0.0]); |
@@ -843,16 +859,4 @@ mod tests { |
843 | 859 | // assert_approx_eq!(ukf.mean_state[4], velocity[1], 0.01); |
844 | 860 | // assert_approx_eq!(ukf.mean_state[5], velocity[2], 0.01); |
845 | 861 | // } |
846 | | - #[test] |
847 | | - fn particle_filter_construction() { |
848 | | - let other_states = vec![1.0, 2.0, 3.0]; |
849 | | - let weight = 1.0; |
850 | | - |
851 | | - let nav_state = StrapdownState::new_from_vector(SVector::<f64, 9>::zeros(), false); |
852 | | - let particle = Particle { nav_state: StrapdownState::default(), weight: 1.0 }; |
853 | | - let particles = vec![particle; 10]; |
854 | | - |
855 | | - let pf = ParticleFilter::new(particles); |
856 | | - assert_eq!(pf.particles.len(), 10); |
857 | | - } |
858 | 862 | } |
0 commit comments