blob: 0571cdb4ef6d0cc4b101fc8cbb7913b90e463671 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_BASE_PREDICTION_KALMAN_FILTER_H_
#define UI_BASE_PREDICTION_KALMAN_FILTER_H_
#include "base/component_export.h"
#include "base/macros.h"
#include "ui/gfx/geometry/matrix3_f.h"
namespace ui {
// This Kalman filter is used to predict state in one axles.
class COMPONENT_EXPORT(UI_BASE_PREDICTION) KalmanFilter {
public:
KalmanFilter();
~KalmanFilter();
// Get the estimation of current state.
const gfx::Vector3dF& GetStateEstimation() const;
// Will return true only if the kalman filter has seen enough data and is
// considered as stable.
bool Stable() const;
// Update the observation of the system.
void Update(double observation, double dt);
void Reset();
// Get the predicted values from the kalman filter.
double GetPosition() const;
double GetVelocity() const;
double GetAcceleration() const;
private:
void Predict(double dt);
// Estimate of the latent state
// Symbol: X
// Dimension: state_vector_dim_
gfx::Vector3dF state_estimation_;
// The covariance of the difference between prior predicted latent
// state and posterior estimated latent state (the so-called "innovation".
// Symbol: P
// Dimension: state_vector_dim_, state_vector_dim_
gfx::Matrix3F error_covariance_matrix_;
// For position, state transition matrix is derived from basic physics:
// new_x = x + v * dt + 1/2 * a * dt^2
// new_v = v + a * dt
// ...
// Matrix that transforms current state to next state
// Symbol: F
// Dimension: state_vector_dim_, state_vector_dim_
gfx::Matrix3F state_transition_matrix_;
// A time-varying noise parameter that will be estimated as part of the
// kalman filter process.
// Symbol: Q
// Dimension: state_vector_dim_, state_vector_dim_
gfx::Matrix3F process_noise_covariance_matrix_;
// Vector to transform estimate to measurement.
// Symbol: H
// Dimension: state_vector_dim_
const gfx::Vector3dF measurement_vector_;
// A time-varying noise parameter that will be estimated as part of the
// kalman filter process.
// Symbol: R
double measurement_noise_variance_;
// Tracks number of update iteration happened at this kalman filter. At the
// 1st iteration, the state estimate will be updated to the measured value.
// After a few iterations, the KalmanFilter is considered stable.
uint32_t iteration_count_;
DISALLOW_COPY_AND_ASSIGN(KalmanFilter);
};
} // namespace ui
#endif // UI_BASE_PREDICTION_KALMAN_FILTER_H_