• <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濾波器聽(tīng)著很深?yuàn)W的一個(gè)東東,其實(shí)一點(diǎn)不難。
              我理解的kalman濾波就是通過(guò)為對(duì)象建立一個(gè)特定模型(例如直線勻速運(yùn)動(dòng)),來(lái)糾正實(shí)際觀測(cè)到的物體運(yùn)動(dòng)軌跡到我們認(rèn)為的運(yùn)動(dòng)模型中。
            其特點(diǎn)就是隨著時(shí)間的推移,物體的實(shí)際軌跡會(huì)逐漸趨近于真實(shí)軌跡(與建立的運(yùn)動(dòng)模型越來(lái)越吻合)。
              一個(gè)離散的kalman濾波器可以用2個(gè)方程來(lái)表示:
              時(shí)間更新方程:
             
             空間更新方程:

            其中幾個(gè)參數(shù)的細(xì)微調(diào)節(jié)會(huì)影響整個(gè)濾波器的性能。可以通過(guò)嘗試去調(diào)節(jié)參數(shù)值。
            詳細(xì)介紹參看:http://www.cs.unc.edu/~welch/kalman/
            c++實(shí)現(xiàn)的代碼如下:
            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實(shí)現(xiàn)代碼可以參考我以前的文章。
            懶了就寫到這兒吧
            posted on 2011-01-05 15:20 saha 閱讀(672) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理



            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿

            文章分類

            文章檔案

            收藏夾

            搜索

            •  

            最新評(píng)論

            99精品国产在热久久无毒不卡 | 久久婷婷五月综合色高清| 久久免费视频1| 久久久久无码精品国产| 久久精品一区二区国产| 久久99精品国产麻豆不卡| 久久精品一区二区三区AV| 久久久久AV综合网成人| 99久久亚洲综合精品成人| 久久精品国产亚洲αv忘忧草| 国内精品久久久久伊人av| 亚洲综合久久久| 国产一区二区精品久久凹凸 | 亚洲国产成人久久笫一页| 日日噜噜夜夜狠狠久久丁香五月| 国产精品99久久久久久猫咪| 日韩欧美亚洲综合久久 | 久久久久高潮综合影院| 国产99久久久久久免费看| 久久夜色精品国产噜噜噜亚洲AV | 中文字幕无码久久人妻| 国产精品成人99久久久久| 日产精品久久久一区二区| 日韩久久无码免费毛片软件| 精品免费tv久久久久久久| 亚洲综合伊人久久大杳蕉| 亚洲性久久久影院| 久久久久99精品成人片三人毛片 | 久久久久亚洲Av无码专| 中文字幕乱码人妻无码久久| 久久人人超碰精品CAOPOREN| 亚洲国产精品一区二区久久| 国产精品久久波多野结衣| 精品久久久久香蕉网| 国产∨亚洲V天堂无码久久久| 热re99久久精品国99热| 77777亚洲午夜久久多喷| 亚洲精品乱码久久久久66| 亚洲综合熟女久久久30p| 麻豆一区二区99久久久久| 午夜欧美精品久久久久久久|