00001
00002
00003
00004
00005
00006
00007
00008 #include "KalmanFilter.h"
00009
00010 #include <boost/numeric/ublas/matrix_expression.hpp>
00011 #include <uvsim/utilities/utilities.h>
00012 #include <iostream>
00013
00014 using namespace boost::numeric::ublas;
00015
00016 namespace uvsim
00017 {
00018
00019 KalmanFilter::KalmanFilter(LinearModel * model, vector<double> *y, matrix<double> *P) :
00020 model(model), y(y), P(P)
00021 {
00022 }
00023
00024 KalmanFilter::~KalmanFilter()
00025 {
00026
00027 }
00028
00029 void KalmanFilter::update()
00030 {
00037 *P = prod(model->Ad, *P, trans(model->Ad)) + prod(model->Ed,trans(model->Ed));
00038 *(model->x) = prod(model->Ad,*(model->x)) + prod(model->Bd,*(model->u));
00039
00048 matrix<double> S;
00049 S = prod(model->C, *P, trans(model->C)) + prod(model->L,trans(model->L));
00050 K = prod(*P, trans(model->C), inv(S));
00051 *P = *P - prod(K, model->C, *P);
00052 *(model->x) = *(model->x) + prod(K, *y - prod(model->C,*(model->x)));
00053
00054 }
00055
00056 void KalmanFilter::print()
00057 {
00058 std::cout << "x: " << *(model->x) << std::endl;
00059 std::cout << "P: " << *P << std::endl;
00060 std::cout << "K: " << K << std::endl;
00061
00062 }
00063
00064 }
00065
00066