• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 0,  comments - 5,  trackbacks - 0
              kalman濾波器聽著很深奧的一個東東,其實一點不難。
              我理解的kalman濾波就是通過為對象建立一個特定模型(例如直線勻速運動),來糾正實際觀測到的物體運動軌跡到我們認為的運動模型中。
            其特點就是隨著時間的推移,物體的實際軌跡會逐漸趨近于真實軌跡(與建立的運動模型越來越吻合)。
              一個離散的kalman濾波器可以用2個方程來表示:
              時間更新方程:
             
             空間更新方程:

            其中幾個參數的細微調節(jié)會影響整個濾波器的性能。可以通過嘗試去調節(jié)參數值。
            詳細介紹參看:http://www.cs.unc.edu/~welch/kalman/
            c++實現的代碼如下:
            kalman.h
            #ifndef __KALMAN_H__
            #define __KALMAN_H__

            #include 
            "Matrix.h"

            //discrete kalman filter
            class CKalman  
            {
            public:
                CKalman();
                
            ~CKalman();

            public:
                
            /**************Init the param********************/
                
            void SetA(CMatrix *pm);
                
            void SetB(CMatrix *pm);
                
            void SetH(CMatrix *pm);
                
            void SetQ(CMatrix *pm);
                
            void SetR(CMatrix *pm);

                
            /*****************Input variable******************/
                
            void InputX0(CMatrix *pm);
                
            void InputP0(CMatrix *pm);
                
            void InputUkprev(CMatrix *pm);
                
            void InputZk(CMatrix *pm);

                
            void AssertParam();
            public:
                
            //time refresh equation
                void RefreshTimeVar();

                
            //status refresh equation
                void RefreshStatus();

                
            void OutputResult(double *p);

            private:
                CMatrix 
            *m_pA; //state plus matrix A
                CMatrix *m_pB; //control plus matrix B
                CMatrix *m_pPkPriori; //Priori estimation Pk-
                CMatrix *m_pPkPosteriori; //Posteriori estimation Pk
                CMatrix *m_pPkprev; //Posteriori estimation Pk-1
                CMatrix *m_pH; 
                CMatrix 
            *m_pK; //kalman plus matrix
                CMatrix *m_pQ;
                CMatrix 
            *m_pR;

                CMatrix 
            *m_pXkprev; //Xk-1
                CMatrix *m_pXkPriori; //Priori estimation Xk-
                CMatrix *m_pXkPosteriori; //Posteriori estimation Xk
                CMatrix *m_pUkprev; //control variable;
                CMatrix *m_pZk; //observation variable;


                
            bool m_bHasControlVarible;
                
            }
            ;

            #endif
            kalman.cpp:
            #include "kalman.h"
            #include 
            <assert.h>

            CKalman::CKalman()
            {
                m_pXkprev 
            = NULL; 
                m_pXkPriori 
            = NULL; 
                m_pXkPosteriori 
            = NULL; 
                m_pUkprev 
            = NULL;
                m_pZk 
            = NULL;
                m_pA 
            = NULL; 
                m_pB 
            = NULL; 
                m_pPkPriori 
            = NULL; 
                m_pPkPosteriori 
            = NULL; 
                m_pPkprev 
            = NULL; 
                m_pH 
            = NULL; 
                m_pK 
            = NULL; 
                m_pQ 
            = NULL;
                m_pR 
            = NULL;
                m_bHasControlVarible 
            = false;
            }


            CKalman::
            ~CKalman()
            {
                
            if (NULL != m_pPkPriori)
                
            {
                    delete m_pPkPriori;
                }

                
            if (NULL != m_pPkPosteriori)
                
            {
                    delete m_pPkPosteriori;
                }

                
            if (NULL != m_pXkPriori)
                
            {
                    delete m_pXkPriori;
                }

                
            if (NULL != m_pXkPosteriori)
                
            {
                    delete m_pXkPosteriori;
                }

                
            }


            void CKalman::SetA(CMatrix *pm)
            {
                m_pA 
            = pm;
            }


            void CKalman::SetB(CMatrix *pm)
            {
                m_pB 
            = pm;
            }


            void CKalman::SetH(CMatrix *pm)
            {
                m_pH 
            = pm;
            }


            void CKalman::SetQ(CMatrix *pm)
            {
                m_pQ 
            = pm;
            }


            void CKalman::SetR(CMatrix *pm)
            {
                m_pR 
            = pm;
            }


            void CKalman::AssertParam()
            {
                assert(NULL 
            != m_pXkprev);
                assert(NULL 
            != m_pZk);
                assert(NULL 
            != m_pA);
                assert(NULL 
            != m_pPkprev);
                assert(NULL 
            != m_pH);
                assert(NULL 
            != m_pQ);
                assert(NULL 
            != m_pR);
                
            if (m_bHasControlVarible)
                
            {
                    assert(NULL 
            != m_pUkprev);
                    assert(NULL 
            != m_pB);
                }

            }


            void CKalman::InputX0(CMatrix *pm)
            {
                m_pXkprev 
            = pm;
                
                
            long nWidth = m_pXkprev->getWidth();
                
            long nHeight = m_pXkprev->getHeight();

                m_pXkPriori 
            = new CMatrix(NULL, nWidth, nHeight);
                m_pXkPosteriori 
            = new CMatrix(NULL, nWidth, nHeight);
            }


            void CKalman::InputP0(CMatrix *pm)
            {
                m_pPkprev 
            = pm;

                
            long nWidth = m_pPkprev->getWidth();
                
            long nHeight = m_pPkprev->getHeight();

                m_pPkPriori 
            = new CMatrix(NULL, nWidth, nHeight);
                m_pPkPosteriori 
            = new CMatrix(NULL, nWidth, nHeight);

            }


            void CKalman::InputUkprev(CMatrix *pm)
            {
                
            if (NULL == pm)
                
            {
                    m_bHasControlVarible 
            = false;
                }

                
            else
                
            {
                    m_bHasControlVarible 
            = true;
                    m_pUkprev 
            = pm;
                }

            }


            void CKalman::InputZk(CMatrix *pm)
            {
                m_pZk 
            = pm;
            }


            void CKalman::RefreshTimeVar()
            {
                AssertParam();
                   
                
            if (m_bHasControlVarible)
                
            {
                    
            *m_pXkPriori = (*m_pA)*(*m_pXkprev) + (*m_pB)*(*m_pUkprev);  //1.9
                }

                
            else
                
            {
                    
            *m_pXkPriori = (*m_pA)*(*m_pXkprev);
                }

                
                
            *m_pPkPriori = (*m_pA)*(*m_pPkprev)*(m_pA->Transpose()) + (*m_pQ); //1.10
            }


            void CKalman::RefreshStatus()
            {
                assert(NULL 
            != m_pZk);
                
                CMatrix mPH;
                mPH 
            = (*m_pPkPriori) * (m_pH->Transpose());

                CMatrix mTmp;
                ((
            *m_pH) * mPH + (*m_pR)).GetInverse(mTmp);

                
            long nHeight = mPH.getHeight();
                
            long nWidth = mTmp.getWidth();
                CMatrix mK(NULL, nWidth, nHeight);

                m_pK 
            = &mK;
                
            *m_pK = mPH * mTmp; //1.11
                *m_pXkPosteriori = *m_pXkPriori + (*m_pK) * (*m_pZk - (*m_pH)*(*m_pXkPriori)); //1.12
                
                CMatrix mUnit(m_pK
            ->getHeight());
                
            *m_pPkPosteriori = (mUnit - (*m_pK)*(*m_pH))*(*m_pPkPriori); //1.13

                
            //recursion
                m_pPkprev = m_pPkPosteriori;
                m_pXkprev 
            = m_pXkPosteriori;
                m_pZk 
            = NULL;
            }


            void CKalman::OutputResult(double *p)
            {
                m_pXkPosteriori
            ->GetValue(p);
            }
            其中的matrix實現代碼可以參考我以前的文章。
            懶了就寫到這兒吧
            posted on 2011-01-05 15:20 saha 閱讀(667) 評論(0)  編輯 收藏 引用

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿

            文章分類

            文章檔案

            收藏夾

            搜索

            •  

            最新評論

            国产精品美女久久久久网| 日本道色综合久久影院| 狠狠色丁香久久婷婷综合蜜芽五月 | 久久国产成人午夜aⅴ影院| 久久夜色精品国产www| 久久人人爽人人爽人人片AV麻烦| 色综合久久久久综合体桃花网| 丁香五月网久久综合| 国产女人aaa级久久久级| 久久人人爽人人爽人人片av麻烦| 亚洲成色WWW久久网站| 国产亚洲美女精品久久久| 亚洲精品无码成人片久久| 久久久免费观成人影院| 久久成人国产精品| 亚洲人成网站999久久久综合| 91精品国产9l久久久久| 国产精品久久久久久久久软件| 久久精品毛片免费观看| 久久久国产99久久国产一| 久久本道久久综合伊人| 久久亚洲sm情趣捆绑调教| 久久99精品国产麻豆| 久久婷婷五月综合国产尤物app | 亚洲成色WWW久久网站| 国产综合免费精品久久久| 精产国品久久一二三产区区别| 99久久免费国产精精品| 久久精品国产亚洲AV不卡| 久久精品中文闷骚内射| 久久91亚洲人成电影网站| 久久综合伊人77777麻豆| 伊人久久精品无码av一区| 91精品国产91久久久久福利| 久久综合久久性久99毛片| 久久久久成人精品无码中文字幕| 国产精品一区二区久久精品| 伊色综合久久之综合久久| 久久99久久99小草精品免视看| 国产精品久久久久a影院| 99久久精品国产综合一区|