eradicate ukf

This commit is contained in:
ary 2024-01-12 16:37:20 -05:00
parent 0180ec7580
commit 38952fc102
2 changed files with 0 additions and 164 deletions

View File

@ -1,44 +0,0 @@
#pragma once
#include <Eigen/Dense>
#include <Eigen/src/Cholesky/LLT.h>
#include <Eigen/src/Core/Matrix.h>
template<int state_dim, int measure_dim>
class UnscentedKalman
{
public:
void predict();
void update(const Eigen::Vector<double, measure_dim> measurements);
Eigen::Vector<double, state_dim> predict_function_f(Eigen::Matrix<double, 1, state_dim> item); //build this last
Eigen::Vector<double, measure_dim> update_function_h(Eigen::Matrix<double, 1, state_dim> item); //build this last
void unscented_transform_f(Eigen::Matrix<double, 2 * state_dim + 1, state_dim> sigmas); //Add spot for Q and R matricies
void unscented_transform_h(Eigen::Matrix<double, 2 * state_dim + 1, measure_dim> sigmas);
const Eigen::Vector<double, state_dim> get_state() { return state_vector; }
const Eigen::Matrix<double, state_dim, state_dim> get_covar() { return covariance_matrix; }
const Eigen::Vector<double, state_dim> get_state_p() { return state_vector_p; }
const Eigen::Matrix<double, state_dim, state_dim> get_covar_p() { return covariance_matrix_p; }
private:
static const int sigma_dim = 2 * state_dim + 1;
const double kappa = 3 - state_dim;
const double alpha = 1;
const double beta = 2;
const double lambda_ = pow(alpha, 2) * (state_dim - kappa) - state_dim;
Eigen::Matrix<double, 1, sigma_dim> weights_m;
Eigen::Matrix<double, 1, sigma_dim> weights_c;
Eigen::Vector<double, state_dim> state_vector = Eigen::Vector<double, state_dim>::Ones();
Eigen::Matrix<double, state_dim, state_dim> covariance_matrix = Eigen::Matrix<double, state_dim, state_dim>::Identity();
Eigen::Vector<double, state_dim> state_vector_p = Eigen::Vector<double, state_dim>::Ones();
Eigen::Matrix<double, state_dim, state_dim> covariance_matrix_p = Eigen::Matrix<double, state_dim, state_dim>::Identity();
Eigen::Matrix<double, sigma_dim, state_dim> sigma_points = Eigen::Matrix<double, sigma_dim, state_dim>::Ones();
Eigen::Matrix<double, sigma_dim, state_dim> sigma_points_f = Eigen::Matrix<double, sigma_dim, state_dim>::Ones();
Eigen::Matrix<double, sigma_dim, measure_dim> sigma_points_h = Eigen::Matrix<double, sigma_dim, measure_dim>::Ones();
Eigen::Vector<double, state_dim> unscented_x_p = Eigen::Vector<double, state_dim>::Ones();
Eigen::Matrix<double, state_dim, state_dim> unscented_P_p = Eigen::Matrix<double, state_dim, state_dim>::Ones();
Eigen::Vector<double, measure_dim> unscented_x_z = Eigen::Vector<double, measure_dim>::Ones();
Eigen::Matrix<double, measure_dim, measure_dim> unscented_P_z = Eigen::Matrix<double, measure_dim, measure_dim>::Ones();
Eigen::Vector<double, measure_dim> measure_vector = Eigen::Vector<double, measure_dim>::Ones();
Eigen::Matrix<double, state_dim, state_dim> Q = Eigen::Matrix<double, state_dim, state_dim>::Random();
Eigen::Matrix<double, measure_dim, measure_dim> R = Eigen::Matrix<double, measure_dim, measure_dim>::Random();
};

View File

@ -1,120 +0,0 @@
// Kalman_Filter_Test.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <chrono>
#include "UnscentedKalman.h"
#include "SystemSims.h"
template<int state_dim, int measure_dim>
void UnscentedKalman<state_dim, measure_dim>::unscented_transform_f(Eigen::Matrix<double, 2 * state_dim + 1, state_dim> sigmas)
{
for (int i = 0; i < state_dim; ++i)
{
unscented_x_p[i] = weights_m.dot(sigmas.col(i));
}
Eigen::Matrix<double, state_dim, state_dim> temp;
for (int i = 0; i < sigma_dim; ++i)
{
Eigen::Matrix<double, 1, state_dim> Y = sigmas.row(i) - unscented_x_p.transpose();
auto scalar = (weights_c[i] * (Y * Y.transpose())[0]);
temp.fill(scalar);
unscented_P_p = (unscented_P_p + temp);
}
unscented_P_p += Q;
}
template<int state_dim, int measure_dim>
void UnscentedKalman<state_dim, measure_dim>::unscented_transform_h(Eigen::Matrix<double, 2 * state_dim + 1, measure_dim> sigmas)
{
for (int i = 0; i < measure_dim; ++i)
{
unscented_x_z[i] = weights_m.dot(sigmas.col(i));
}
Eigen::Matrix<double, measure_dim, measure_dim> temp;
for (int i = 0; i < sigma_dim; ++i)
{
Eigen::Matrix<double, 1, measure_dim> Y = sigmas.row(i) - unscented_x_z.transpose();
auto scalar = (weights_c[i] * (Y * Y.transpose())[0]);
temp.fill(scalar);
unscented_P_z += temp;
}
unscented_P_z += R;
}
template<int state_dim, int measure_dim>
void UnscentedKalman<state_dim, measure_dim>::predict()
{
weights_m.fill(1 / (2 * (state_dim + lambda_)));
weights_c.fill(1 / (2 * (state_dim + lambda_)));
weights_m(0) = lambda_ / (state_dim + lambda_) + (1 - pow(alpha, 2) + beta);
weights_c(0) = lambda_ / (state_dim + lambda_);
Eigen::LLT<Eigen::Matrix<double, state_dim, state_dim>> U((state_dim + lambda_) * covariance_matrix);
Eigen::Matrix<double, state_dim, state_dim> U_decomposed = U.matrixU();
sigma_points.row(0) = state_vector;
for (int i = 0; i < state_dim; ++i)
{
sigma_points.row(i + 1) = state_vector.transpose() + U_decomposed.row(i);
sigma_points.row(state_dim + i + 1) = state_vector.transpose() - U_decomposed.row(i);
}
for (int i = 0; i < sigma_dim; ++i)
{
sigma_points_f.row(i) = this->predict_function_f(sigma_points.row(i));
}
this->unscented_transform_f(sigma_points_f);
state_vector_p = unscented_x_p;
covariance_matrix_p = unscented_P_p;
}
template<int state_dim, int measure_dim>
void UnscentedKalman<state_dim, measure_dim>::update(const Eigen::Vector<double, measure_dim> measurements)
{
for (int i = 0; i < sigma_dim; ++i)
{
sigma_points_h.row(i) = this->update_function_h(sigma_points_f.row(i));
}
this->unscented_transform_h(sigma_points_h);
Eigen::Matrix<double, state_dim, measure_dim> covariance_x_z;
for (int i = 0; i < sigma_dim; ++i)
{
auto inner1 = (sigma_points_h.row(i) - unscented_x_z.transpose());
auto inner2 = (sigma_points_f.row(i) - state_vector_p.transpose());
auto comp = inner1.transpose() * inner2;
auto temp = weights_c[i] * comp.transpose();
covariance_x_z += temp;
}
auto K = covariance_x_z * unscented_P_z.inverse();
state_vector = state_vector_p + K * (measurements - unscented_x_z);
covariance_matrix = covariance_matrix_p - (K * unscented_P_z * K.transpose());
}
template<int state_dim, int measure_dim>
Eigen::Vector<double, state_dim> UnscentedKalman<state_dim, measure_dim>::predict_function_f(Eigen::Matrix<double, 1, state_dim> item)
{
Eigen::Matrix<double, state_dim, state_dim> F = Eigen::Matrix<double, state_dim, state_dim>::Ones();
return F * item.transpose();
}
template<int state_dim, int measure_dim>
Eigen::Vector<double, measure_dim> UnscentedKalman<state_dim, measure_dim>::update_function_h(Eigen::Matrix<double, 1, state_dim> item)
{
return { 1, 2, 3 };
}
UnscentedKalman<3, 3> filter;
Eigen::Vector<double, 3> test2 = Eigen::Matrix<double, 1, 3>::Random();
Eigen::Vector<double, 3> test3 = Eigen::Matrix<double, 1, 3>::Random();
Eigen::Vector<double, 3> test4 = Eigen::Matrix<double, 1, 3>::Random();
int main()
{
}