Skip to content

Commit 66ac8a2

Browse files
committed
Convert measurement models to traits
Fixes #24
1 parent c5637fb commit 66ac8a2

1 file changed

Lines changed: 55 additions & 51 deletions

File tree

core/src/filter.rs

Lines changed: 55 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
use crate::earth::{METERS_TO_DEGREES, relative_barometric_altitude};
1818
use crate::linalg::matrix_square_root;
1919
use crate::{IMUData, StrapdownState, forward, wrap_to_2pi};
20+
21+
use std::convert::{From, Into};
22+
use std::fmt::Debug;
23+
2024
use nalgebra::{DMatrix, DVector, Rotation3};
2125
use rand;
22-
//use rand_distr::{Distribution, Normal};
23-
use std::fmt::Debug;
2426

2527
/// Basic strapdown state parameters for the UKF and particle filter initialization.
2628
#[derive(Clone, Debug, Default)]
@@ -50,7 +52,7 @@ pub trait MeasurementModel {
5052
}
5153
/// GPS position measurement model
5254
#[derive(Clone, Debug, Default)]
53-
pub struct GPSPositionMeasurement {
55+
pub struct GPSPositionMeasurement { // <-- Check this model for degree/radian consistency
5456
/// latitude in degrees
5557
pub latitude: f64,
5658
/// longitude in degrees
@@ -600,7 +602,21 @@ mod tests {
600602
use crate::earth;
601603
use super::*;
602604
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+
604620
#[test]
605621
fn ukf_construction() {
606622
let position = [0.0, 0.0, 0.0];
@@ -758,41 +774,41 @@ mod tests {
758774
assert_approx_eq!(ukf.mean_state[4], 0.0, 0.1);
759775
assert_approx_eq!(ukf.mean_state[5], 0.0, 0.1);
760776
}
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+
//}
796812
//#[test]
797813
//fn test_ukf_hover() {
798814
// 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 {
843859
// assert_approx_eq!(ukf.mean_state[4], velocity[1], 0.01);
844860
// assert_approx_eq!(ukf.mean_state[5], velocity[2], 0.01);
845861
// }
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-
}
858862
}

0 commit comments

Comments
 (0)