00001 #ifndef _BAYES_FILTER_CI 00002 #define _BAYES_FILTER_CI 00003 00004 /* 00005 * Bayes++ the Bayesian Filtering Library 00006 * Copyright (c) 2002 Michael Stevens 00007 * See accompanying Bayes++.htm for terms and conditions of use. 00008 * 00009 * $Id: CIFlt.hpp 562 2006-04-05 20:46:23 +0200 (Wed, 05 Apr 2006) mistevens $ 00010 */ 00011 00012 /* 00013 * Covariance Intersection Filter Scheme. 00014 * 00015 * References 00016 * [1] "A Non divergent Estimation Algorithm in the Presence of Unknown Correlations" 00017 * Simon J Julier, Jeffrey K Uhlmann 00018 * 00019 * CI provides a generalised consistent method to combine mean and covariances 00020 * of two estimates. The combination can be optimised by chosing a norm of the 00021 * combined correlations. The norm (omega) is restrict to 0..1 inclusive an effectively 00022 * scales the combination 00023 * Here is CI with a predict and obeserve model to form a filter. 00024 * 00025 * The Omega norm chosen here is the fixed value of 0.5 00026 * The Omega function should be overloaded to produce more useful results 00027 * 00028 * The filter is operated by performing a 00029 * predict, observe 00030 * cycle derived from the Extended_filter 00031 */ 00032 #include "bayesFlt.hpp" 00033 00034 /* Filter namespace */ 00035 namespace Bayesian_filter 00036 { 00037 00038 class CI_scheme : public Extended_kalman_filter 00039 { 00040 public: 00041 CI_scheme (std::size_t x_size, std::size_t z_initialsize = 0); 00042 CI_scheme& operator= (const CI_scheme&); 00043 // Optimise copy assignment to only copy filter state 00044 00045 void init (); 00046 void update (); 00047 Float predict (Linrz_predict_model& f); 00048 Float observe_innovation (Linrz_uncorrelated_observe_model& h, const FM::Vec& s); 00049 Float observe_innovation (Linrz_correlated_observe_model& h, const FM::Vec& s); 00050 00051 virtual Float Omega(const FM::SymMatrix& Ai, const FM::SymMatrix& Bi, const FM::SymMatrix& A) 00052 // Determine norm Omega 0..1 for the CI combination 00053 // Default norm is the fixed value 0.5 00054 { 00055 return 0.5; 00056 } 00057 00058 public: // Exposed Numerical Results 00059 FM::SymMatrix S, SI; // Innovation Covariance and Inverse 00060 00061 protected: // allow fast operation if z_size remains constant 00062 std::size_t last_z_size; 00063 void observe_size (std::size_t z_size); 00064 }; 00065 00066 00067 }//namespace 00068 #endif
1.4.6