您的位置:首页 > 其它

Bayes++ Library入门学习之熟悉UKF相关类

2016-10-28 21:50 441 查看
  UKF-SLAM是一种比较流行SLAM方案。相比EKF-SLAM,UKF利用unscented transform代替了EKF的线性化趋近,因而具有更高的精度。Bayes++库中的unsFlt.hpp中给出了UKF实现的相关类。

namespace Bayesian_filter
39 {
40
41 class Unscented_predict_model : public Predict_model_base
42 /* Specific Unscented prediction model for Additive noise
43  *  x(k|k-1) = f(x(k-1|k-1)) + w(x(k))
44  *
45  * Unscented filter requires
46  *  f the function part of the non-linear model
47  *  Q the covariance of the additive w(x(k)), w is specifically allow to be a function of state
48  */
49 {
50 public:
51     Unscented_predict_model (std::size_t q_size)
52     {
53         q_unscented = q_size;
54     }
55
56     virtual const FM::Vec& f(const FM::Vec& x) const = 0;
57     // Functional part of additive model
58     // Note: Reference return value as a speed optimisation, MUST be copied by caller.
59
60     virtual const FM::SymMatrix& Q(const FM::Vec& x) const = 0;
61     // Covariance of additive noise
62     // Note: Reference return value as a speed optimisation, MUST be copied by caller.
63 private:
64     friend class Unscented_filter;  // Filter implementation need to know noise size
65     std::size_t q_unscented;
66 };
67
68
69 class Unscented_scheme : public Linrz_kalman_filter, public Functional_filter
70 {
71 private:
72     std::size_t q_max;          // Maximum size allocated for noise model, constructed before XX
73 public:
74     FM::ColMatrix XX;       // Unscented form of state, with associated Kappa
75     Float kappa;
76
77     Unscented_scheme (std::size_t x_size, std::size_t z_initialsize = 0);
78     Unscented_scheme& operator= (const Unscented_scheme&);
79     // Optimise copy assignment to only copy filter state
80
81     void init ();
82     void init_XX ();
83     void update ();
84     void update_XX (Float kappa);
85
86     void predict (Unscented_predict_model& f);
87     // Efficient Unscented prediction
88     void predict (Functional_predict_model& f);
89     void predict (Additive_predict_model& f);
90     Float predict (Linrz_predict_model& f)
91     {   // Adapt to use the more general additive model
92         predict(static_cast<Additive_predict_model&>(f));
93         return 1.;      // Always well condition for additive predict
94     }
95
96     Float observe (Uncorrelated_additive_observe_model& h, const FM::Vec& z);
97     Float observe (Correlated_additive_observe_model& h, const FM::Vec& z);
98     // Unscented filter implements general additive observe models
99
100     Float observe (Linrz_uncorrelated_observe_model& h, const FM::Vec& z)
101     {   // Adapt to use the more general additive model
102         return observe (static_cast<Uncorrelated_additive_observe_model&>(h),z);
103     }
104     Float observe (Linrz_correlated_observe_model& h, const FM::Vec& z)
105     {   // Adapt to use the more general additive model
106         return observe (static_cast<Correlated_additive_observe_model&>(h),z);
107     }
108
109 public:                     // Exposed Numerical Results
110     FM::Vec s;                  // Innovation
111     FM::SymMatrix S, SI;        // Innovation Covariance and Inverse
112
113 protected:
114     virtual Float predict_Kappa (std::size_t size) const;
115     virtual Float observe_Kappa (std::size_t size) const;
116     /* Unscented Kappa values
117        default uses the rule which minimise mean squared error of 4th order term
118     */
119
120 protected:                  // allow fast operation if z_size remains constant
121     std::size_t last_z_size;
122     void observe_size (std::size_t z_size);
123
124 private:
125     void unscented (FM::ColMatrix& XX, const FM::Vec& x, const FM::SymMatrix& X, Float scale);
126     /* Determine Unscented points for a distribution */
127     std::size_t x_size;
128     std::size_t XX_size;    // 2*x_size+1
129
130 protected:                  // Permanently allocated temps
131     FM::ColMatrix fXX;
132 };
133
134
135 }//namespace
136 #endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: