pub struct Kalman2D { /* private fields */ }
Expand description
Implementation of Discrete Kalman filter for case when there are two variables: X and Y.
Implementations§
Source§impl Kalman2D
impl Kalman2D
Sourcepub fn new(
dt: f32,
ux: f32,
uy: f32,
std_dev_a: f32,
std_dev_mx: f32,
std_dev_my: f32,
) -> Self
pub fn new( dt: f32, ux: f32, uy: f32, std_dev_a: f32, std_dev_mx: f32, std_dev_my: f32, ) -> Self
Creates new Kalman2D
Basic usage:
use kalman_rust::kalman::Kalman2D;
let dt = 0.1; // Single cycle time
let ux = 2.0; // Control input for X
let uy = 2.0; // Control input for Y
let std_dev_a = 0.25; // Standart deviation of acceleration
let std_dev_mx = 1.2; // Standart deviation of measurement for X
let std_dev_my = 1.2; // Standart deviation of measurement for Y
let mut kalman = Kalman2D::new(dt, ux, uy, std_dev_a, std_dev_mx, std_dev_my);
Sourcepub fn new_with_state(
dt: f32,
ux: f32,
uy: f32,
std_dev_a: f32,
std_dev_mx: f32,
std_dev_my: f32,
x: f32,
y: f32,
) -> Self
pub fn new_with_state( dt: f32, ux: f32, uy: f32, std_dev_a: f32, std_dev_mx: f32, std_dev_my: f32, x: f32, y: f32, ) -> Self
Creates new Kalman2D
with initial state
Why is it needed to set the initial state to the actual first observed coordinates of an object (sometimes)? When the first state vector is initialized with zeros, it assumes that the object is at the origin and the filter needs to estimate the position of the object from scratch, which can result in some initial inaccuracies. On the other hand, initializing the first state vector with the actual observed coordinates of the object can provide a more accurate estimate from the beginning, which can improve the overall tracking performance of the filter
Basic usage:
use kalman_rust::kalman::Kalman2D;
let dt = 0.1; // Single cycle time
let ux = 2.0; // Control input for X
let uy = 2.0; // Control input for Y
let std_dev_a = 0.25; // Standart deviation of acceleration
let std_dev_mx = 1.2; // Standart deviation of measurement for X
let std_dev_my = 1.2; // Standart deviation of measurement for Y
let ix = 1.0; // Initial state for X
let iy = 5.0; // Initial state for Y
let mut kalman = Kalman2D::new_with_state(dt, ux, uy, std_dev_a, std_dev_mx, std_dev_my, ix, iy);
Sourcepub fn predict(&mut self)
pub fn predict(&mut self)
Projects the state and the error covariance ahead Mutates the state vector and the error covariance matrix
Basic usage:
use kalman_rust::kalman::Kalman2D;
let dt = 0.1; // Single cycle time
let ux = 2.0; // Control input for X
let uy = 2.0; // Control input for Y
let std_dev_a = 0.25; // Standart deviation of acceleration
let std_dev_mx = 1.2; // Standart deviation of measurement for X
let std_dev_my = 1.2; // Standart deviation of measurement for Y
let mut kalman = Kalman2D::new(dt, ux, uy, std_dev_a, std_dev_mx, std_dev_my);
let measurements = vec![(1.0, 2.0), (2.0, 3.0), (3.0, 4.0)];
for x in measurements.iter() {
// get measurement
kalman.predict();
// then do update
}
Sourcepub fn update(&mut self, _zx: f32, _zy: f32) -> Result<(), Kalman2DError>
pub fn update(&mut self, _zx: f32, _zy: f32) -> Result<(), Kalman2DError>
Computes the Kalman gain and then updates the state vector and the error covariance matrix Mutates the state vector and the error covariance matrix.
Basic usage:
use kalman_rust::kalman::Kalman2D;
let dt = 0.1; // Single cycle time
let ux = 2.0; // Control input for X
let uy = 2.0; // Control input for Y
let std_dev_a = 0.25; // Standart deviation of acceleration
let std_dev_mx = 1.2; // Standart deviation of measurement for X
let std_dev_my = 1.2; // Standart deviation of measurement for Y
let mut kalman = Kalman2D::new(dt, ux, uy, std_dev_a, std_dev_mx, std_dev_my);
let measurements = vec![(1.0, 2.0), (2.0, 3.0), (3.0, 4.0)];
for (mx, my) in measurements.iter() {
kalman.predict();
kalman.update(*mx, *my).unwrap(); // assuming that there is noise in measurement
}
Sourcepub fn get_velocity(&self) -> (f32, f32)
pub fn get_velocity(&self) -> (f32, f32)
Returns the current velocity (only Vx and Vy, not X and Y)
Sourcepub fn get_predicted_position(&self) -> (f32, f32)
pub fn get_predicted_position(&self) -> (f32, f32)
Returns prediction without mutating the state vector and the error covariance matrix
Sourcepub fn get_position_uncertainty(&self) -> f32
pub fn get_position_uncertainty(&self) -> f32
Returns position uncertainty from P matrix
Sourcepub fn get_vector_state(&self) -> SVector<f32, 4>
pub fn get_vector_state(&self) -> SVector<f32, 4>
Returns the current state (both (X, Y) and (Vx, Vy))
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Kalman2D
impl RefUnwindSafe for Kalman2D
impl Send for Kalman2D
impl Sync for Kalman2D
impl Unpin for Kalman2D
impl UnwindSafe for Kalman2D
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.