零基礎(chǔ)讀懂“擴展卡爾曼濾波”——中篇

https://mp.weixin.qq.com/s/cr1u840FeBLalrmtJQs8TQ

本篇文章分上最铁、中、下三篇开缎,上篇從標(biāo)準(zhǔn)卡爾曼濾波開始斤寂,中篇加入更真實的系統(tǒng)模型,下篇從傳感器的數(shù)據(jù)融合中實現(xiàn)擴展卡爾曼濾波诚镰。

8. 一個更真實的模型

現(xiàn)在重新回顧一下描述系統(tǒng)的狀態(tài)方程和觀測方程:
x_k=ax_{k-1}
z_k=x_k+v_k

x_k 表示系統(tǒng)的當(dāng)前狀態(tài)奕坟,x_{k-1}表示系統(tǒng)的前一個狀態(tài);a是一個常量清笨,z_k是系統(tǒng)當(dāng)前狀態(tài)的觀測值月杉;v_k是系統(tǒng)觀測噪聲;

這兩個方程已經(jīng)適用于大多數(shù)系統(tǒng)函筋,但仍然不夠普適性沙合;現(xiàn)在依然以飛機的飛行為例奠伪,我們并沒有考慮到飛行員對飛機的操作和控制跌帐,飛行員操作控制桿向前或向后移動,對飛機輸入控制量绊率,最終對飛機產(chǎn)生控制谨敛。我們將這個控制量稱為u_k,表示飛行員發(fā)送到飛機的控制信號的當(dāng)前值滤否,并且我們對這個控制量加上一個縮放因子b脸狸,因此整個狀態(tài)方程變?yōu)椋?/p>

x_k=ax_{k-1}+bu_k

一般而言,除了噪聲以外的任何信號都可以通過常量進行一定比例的縮放,因此觀測方程也可以這樣表示:

z_k=cx_k+v_k

9. 調(diào)整估計值

通過以上的方程我們更真實的描述一個系統(tǒng)的狀態(tài)和觀測炊甲,由此預(yù)測和更新方程也需要做相應(yīng)的調(diào)整:

預(yù)測:

\hat x_k=a\hat x_{k-1}+bu_k

更新:

g_k=p_kc/(cp_kc+r)
\hat x_k \gets\hat x_k+g_k(z_k-c\hat x_k)
p_k\gets(1-g_kc)p_k

仍然以飛機飛行為例泥彤,我們增加一個控制信號,表示飛行員穩(wěn)步拉回控制桿卿啡,并提高飛機飛行高度吟吝,原始信號為藍色表示,觀測值以紅色表示颈娜,綠色信號為卡爾曼濾波后的值剑逃。

image

10. 向系統(tǒng)中添加速度

現(xiàn)在回想一下飛機下降時飛行高度的原始方程:

altitude_{current}=0.98\times altitude_{previous}

以更通用的方程表示為:

x_k=ax_{k-1}

我們都知道飛機飛行的高度即海拔,可以看做是一種距離官辽,距離總是和速度與時間相關(guān)的:

distance=velocity\times time

再進一步思考蛹磺,當(dāng)前距離和前一時刻的距離的關(guān)系:

distance_{curr}=distance_{prev}+velocity_{prev}\times(time_{curr}-time_{prev})

下標(biāo)curr代表當(dāng)前,prev代表前一個同仆。也就是說萤捆,飛機現(xiàn)在的位置等于前一時刻的位置加上剛剛飛行過的垂直距離。如果按照固定的時間間隔進行計算俗批,比如說1秒鳖轰,或者1分鐘等,那么可以將上式簡化為:

distance_{curr}=distance_{prev}+velocity_{prev}\times timestep

貌似與我們的狀態(tài)方程更接近了一步扶镀,但是還差一些蕴侣,接下來我們引入向量和矩陣。

11. 向量和矩陣

通常情況下系統(tǒng)的狀態(tài)并不是一個變量臭觉,比如飛機的高度和速度昆雀,那么我們就可以使用向量表示系統(tǒng)的狀態(tài):

x_k \equiv \left[ \begin{matrix} distance_k \\ velocity_k \end{matrix} \right]

符號\equiv表示一個定義,系統(tǒng)狀態(tài)定義為一個距離和速度的矢量蝠筑。 當(dāng)我們用一個矩陣去乘以一個向量時得到的結(jié)果依然是一個向量狞膘,比如:

\left[ \begin{matrix} a & b \\ c & d \end{matrix} \right] \left[ \begin{matrix} x \\ y \end{matrix} \right] = \left[ \begin{matrix} ax+by \\ cx+dy \end{matrix} \right]

因此,我們將系統(tǒng)狀態(tài)方程中的常量A定義為一個矩陣什乙,因為系統(tǒng)的狀態(tài)并非是一種:

A= \left[ \begin{matrix} 1 & timestep \\ 0 & 1 \end{matrix} \right]

再次回顧一下系統(tǒng)狀態(tài)方程:

x_k=Ax_{k-1}

將系統(tǒng)狀態(tài)矢量代入:

\left[ \begin{matrix} distance_k\\ velocity_k \end{matrix} \right] = \left[ \begin{matrix} 1 & timestep \\ 0 & 1 \end{matrix} \right] \left[ \begin{matrix} distance_{k-1}\\ velocity_{k-1} \end{matrix} \right] = \left[ \begin{matrix} 1\times distance_{k-1}+timestep\times velocity_{k-1}\\ 0\times distance_{k-1}+1\times velocity_{k-1} \end{matrix} \right] = \left[ \begin{matrix} distance_{k-1}+timestep\times velocity_{k-1}\\ velocity_{k-1} \end{matrix} \right]

從公式中可以清晰的看出距離等于前一刻的距離與速度和觀測時間間隔的乘積之和挽封,而速度和上一時刻的速度相等;這表明飛機是勻速上升或下降的臣镣,但現(xiàn)實中速度不可能做到勻速辅愿。當(dāng)速度是變化的,即系統(tǒng)中還存在一個加速度變量忆某,那么我們的系統(tǒng)狀態(tài)方程可以表示為:

\left[ \begin{matrix} distance_k\\ velocity_k\\ acceleration_k \end{matrix} \right] = \left[ \begin{matrix} 1 & timestep & 0 \\ 0 & 1 & timestep \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} distance_{k-1}\\ velocity_{k-1}\\ acceleration_{k-1} \end{matrix} \right]

12. 再看預(yù)測和更新

系統(tǒng)狀態(tài)的修正公式:

x_k=Ax_{k-1}

x為一個向量点待,A是一個矩陣;大家可能還記得弃舒,這個方程的原始形式是這樣的:

x_k=ax_{k-1}+bu_k

其中u_k是一個控制信號癞埠,b是一個比例因子状原,系統(tǒng)的觀測方程為:

z_k=cx_k+v_k

其中z_k是觀測量,v_k是由于傳感器的不準(zhǔn)確所帶來的噪聲苗踪。那么我們?nèi)绾涡拚@些方程以適應(yīng)新的向量矩陣形式呢颠区?是的,線性代數(shù)讓這些變得尤其簡單通铲。我們使用大寫的字母寫出縮放因子bc瓦呼,使他們成為矩陣,而不是單一的標(biāo)量值:

x_k=Ax_{k-1}+Bu_k
z_k=Cx_k+v_k

然后所有的變量包括狀態(tài)测暗、觀測央串、噪聲、控制等都被認為是向量碗啄,回顧一下我們前面的系統(tǒng)預(yù)測和更新方程:

預(yù)測:

\hat x_k=a\hat x_{k-1}+bu_k
p_k=ap_{k-1}a

更新:

g_k=p_kc/(cp_kc+r)
\hat x_k \gets \hat x_k+g_k(z_k-c\hat x_k)
p_k\gets(1-g_kc)p_k

大家可能會想质和,將這里所有的縮放因子都用大寫表示,然后就可以了稚字。然而事實并非如此饲宿,矩陣的乘法沒有那么簡單,這就是前面提到的為什么是ap_{k-1}a而不是a^2p_{k-1}胆描。A\times B有時候不等于B\times A瘫想,有時候需要轉(zhuǎn)置矩陣,通過在矩陣的旁邊加上一個上標(biāo)^T來表示轉(zhuǎn)置矩陣昌讲。轉(zhuǎn)置矩陣是通過把每一行變成一列国夜,每一列變成一行來實現(xiàn)的《坛瘢看個實際例子:

\left[ \begin{matrix} a & b \\ c & d \end{matrix} \right]^T = \left[ \begin{matrix} a & c \\ b & d \end{matrix} \right]

由此车吹,我們可以重寫我們的預(yù)測方程: (關(guān)于卡爾曼濾波五個公式的由來,我會專門寫一篇文章進行推導(dǎo)與分析)

\hat x_k=A\hat x_{k-1}+Bu_k
P_k=AP_{k-1}A^T

我們已經(jīng)知道A為何是一個矩陣醋闭,但是P_k為何也是一個矩陣呢窄驹?

我們的第二個更新方程可以表示為:

\hat x_k \gets \hat x_k+g_k(z_k-C\hat x_k)

再看增益方程的原始形式:

g_k=p_kc/(cp_kc+r)

它包含一個除法,我們瞬間想到了除法可以用乘法代替:

a\times a^{-1}=1

那么上面的方程可以寫為:

g_k=p_kc(cp_kc+r)^{-1}

我們現(xiàn)在把這些常量替換成矩陣:

G_k=P_kC^T(CP_kC^T+R)^{-1}
P_k=(I-G_kC)P_k

如何計算(CP_kC^T+R)^{-1}呢证逻,求逆矩陣嗎乐埠?是的,一個矩陣乘以它的逆矩陣后結(jié)果為一個單位矩陣

AA^{-1}=I

單位矩陣的定義如下囚企,我們以一個 3x3 的矩陣舉例:

\left[ \begin{matrix} 1 & 0 & 0\\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{matrix} \right]

13. 傳感器融合簡單介紹

現(xiàn)在我們的卡爾曼濾波方程完全以矩陣形式表示丈咐,

模型:
x_k=Ax_{k-1}+Bu_k
z_k=Cx_k+v_k

預(yù)測:

\hat x_k=A\hat x_{k-1}+Bu_k
P_k=AP_{k-1}A^T

更新:

G_k=P_kC^T(CP_kC^T+R)^{-1}
\hat x_k=\hat x_{k}+G_k(z_k-C\hat x_k)
P_k\gets(I-G_kC)P_k

如果想在狀態(tài)變量中添加以下額外的項似乎是一項很艱巨的任務(wù)《床Γ卡爾曼濾波最有價值的地方就是用在傳感器的融合中扯罐。

回到飛機飛行的例子中负拟,飛行員可以訪問更多的信息烦衣,不僅僅是飛機的高度,儀表上可以顯示飛機的水平速度、航向花吟、經(jīng)緯度秸歧、室外溫濕度等信息。想象一下衅澈,假如一架飛機只有三個傳感器键菱,每一個傳感器都有給定的狀態(tài),一個用于測量高度的氣壓計今布,一個用于航向的電子羅盤经备,一個測量空速的空速指示器等。

假設(shè)這些傳感器是完全準(zhǔn)確的部默,即沒有任何噪聲侵蒙。那么我們的觀測方程為:

z_k=Cx_{k-1}+v_k

將會變?yōu)椋?/p>

\left[ \begin{matrix} barometer_k \\ compass_k \\ pitot_k \end{matrix} \right] = \left[ \begin{matrix} 1 & 0 & 0\\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} altitude_{k-1}\\ heading_{k-1} \\ airspeed_{k-1} \end{matrix} \right]

假如我們向系統(tǒng)中加入了一個GPS,同樣用于測量高度傅蹂,那么我們的觀測方程將會變?yōu)椋?/p>

\left[ \begin{matrix} barometer_k \\ compass_k \\ pitot_k \\ gps_k \end{matrix} \right] = \left[ \begin{matrix} 1 & 0 & 0\\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{matrix} \right] \left[ \begin{matrix} altitude_{k-1}\\ heading_{k-1} \\ airspeed_{k-1} \end{matrix} \right]

因此可以將多個傳感器的讀數(shù)結(jié)合起來纷闺,從而推斷出某個狀態(tài)的信息。就比如我們看病一樣份蝴,對于重要的疾病總是尋求多個醫(yī)生的診斷犁功,對于一些重要的事情,最好有多個信息來源婚夫。

本篇先介紹這些浸卦,下一篇會以一個真實的傳感器融合實例開始,并最終實現(xiàn)擴展卡爾曼濾波案糙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镐躲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子侍筛,更是在濱河造成了極大的恐慌萤皂,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匣椰,死亡現(xiàn)場離奇詭異裆熙,居然都是意外死亡,警方通過查閱死者的電腦和手機禽笑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門入录,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人佳镜,你說我怎么就攤上這事僚稿。” “怎么了蟀伸?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵蚀同,是天一觀的道長缅刽。 經(jīng)常有香客問我,道長蠢络,這世上最難降的妖魔是什么衰猛? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮刹孔,結(jié)果婚禮上啡省,老公的妹妹穿的比我還像新娘。我一直安慰自己髓霞,他們只是感情好卦睹,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著方库,像睡著了一般分预。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薪捍,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天笼痹,我揣著相機與錄音,去河邊找鬼酪穿。 笑死凳干,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的被济。 我是一名探鬼主播救赐,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼只磷!你這毒婦竟也來了经磅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤钮追,失蹤者是張志新(化名)和其女友劉穎预厌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體元媚,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡轧叽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刊棕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炭晒。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖甥角,靈堂內(nèi)的尸體忽然破棺而出网严,到底是詐尸還是另有隱情,我是刑警寧澤嗤无,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布震束,位于F島的核電站怜庸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驴一。R本人自食惡果不足惜休雌,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一灶壶、第九天 我趴在偏房一處隱蔽的房頂上張望肝断。 院中可真熱鬧,春花似錦驰凛、人聲如沸胸懈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趣钱。三九已至,卻和暖如春胚宦,著一層夾襖步出監(jiān)牢的瞬間首有,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工枢劝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留井联,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓您旁,卻偏偏與公主長得像烙常,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鹤盒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容