use crate::extended::builder as extended;
use crate::prelude::*;
use crate::regular::builder as regular;
pub struct TestFilter {
pub filter: regular::KalmanFilterType<3, f32>,
pub control: regular::KalmanFilterControlType<3, 1, f32>,
pub measurement: regular::KalmanFilterObservationType<3, 2, f32>,
}
pub struct ExtendedTestFilter {
pub filter: extended::KalmanFilterType<3, f32>,
pub measurement: extended::KalmanFilterObservationType<3, 2, f32>,
}
#[allow(unused)]
pub fn create_test_filter(delta_t: f32) -> TestFilter {
let builder = regular::KalmanFilterBuilder::<3, f32>::default();
let mut filter = builder.build();
let controls = builder.controls();
let mut control = controls.build::<1>();
let measurements = builder.observations();
let mut measurement = measurements.build::<2>();
filter.state_transition_mut().apply(|mat| {
mat.set_at(0, 0, 1.0);
mat.set_at(0, 1, delta_t);
mat.set_at(0, 2, 0.5 * delta_t * delta_t);
mat.set_at(1, 0, 0.0);
mat.set_at(1, 1, 1.0);
mat.set_at(1, 2, delta_t);
mat.set_at(2, 0, 0.0);
mat.set_at(2, 1, 0.0);
mat.set_at(2, 2, 1.0);
});
filter.state_vector_mut().set_zero();
filter.estimate_covariance_mut().make_scalar(0.1);
control.control_matrix_mut().apply(|mat| {
mat.set_at(0, 0, 0.5 * delta_t * delta_t);
mat.set_at(1, 0, delta_t);
mat.set_at(2, 0, 1.0);
});
control.control_vector_mut().set_zero();
control
.process_noise_covariance_mut()
.make_comatrix(1.0, 0.1);
measurement.observation_matrix_mut().set_all(1.0 / 3.0);
measurement.observation_matrix_mut().apply(|mat| {
mat.set_at(0, 0, 1.0); mat.set_at(0, 1, 0.0);
mat.set_at(0, 2, 0.0);
});
measurement
.measurement_noise_covariance_mut()
.make_identity();
TestFilter {
filter,
control,
measurement,
}
}
#[allow(unused)]
pub fn create_test_filter_ekf(delta_t: f32) -> ExtendedTestFilter {
let builder = extended::KalmanFilterBuilder::<3, f32>::default();
let mut filter = builder.build();
let measurements = builder.observations();
let mut measurement = measurements.build::<2>();
filter.state_transition_jacobian_mut().apply(|mat| {
mat.set_at(0, 0, 1.0);
mat.set_at(0, 1, delta_t);
mat.set_at(0, 2, 0.5 * delta_t * delta_t);
mat.set_at(1, 0, 0.0);
mat.set_at(1, 1, 1.0);
mat.set_at(1, 2, delta_t);
mat.set_at(2, 0, 0.0);
mat.set_at(2, 1, 0.0);
mat.set_at(2, 2, 1.0);
});
filter.state_vector_mut().set_zero();
filter.estimate_covariance_mut().make_scalar(0.1);
measurement
.observation_jacobian_matrix_mut()
.set_all(1.0 / 3.0);
measurement.observation_jacobian_matrix_mut().apply(|mat| {
mat.set_at(0, 0, 1.0); mat.set_at(0, 1, 0.0);
mat.set_at(0, 2, 0.0);
});
measurement
.measurement_noise_covariance_mut()
.make_identity();
ExtendedTestFilter {
filter,
measurement,
}
}