1. 程式人生 > >室內定位系列(五)——目標跟蹤(卡爾曼濾波)

室內定位系列(五)——目標跟蹤(卡爾曼濾波)

進行目標跟蹤時,先驗知識告訴我們定位軌跡是平滑的,目標當前時刻的狀態與上一時刻的狀態有關,濾波方法可以將這些先驗知識考慮進來得到更準確的定位軌跡。本文簡單介紹卡爾曼濾波及其使用。

原理

這裡僅從目標定位跟蹤的角度做一個簡化版的介紹。

定位跟蹤時,可以通過某種定位技術(比如位置指紋法)得到一個位置估計(觀測位置),也可以根據我們的經驗(運動目標常常是勻速運動的)由上一時刻的位置和速度來預測出當前位置(預測位置)。把這個觀測結果和預測結果做一個加權平均作為定位結果,權值的大小取決於觀測位置和預測位置的不確定性程度,在數學上可以證明在預測過程和觀測過程都是線性高斯時,按照卡爾曼的方法做加權是最優的。

擴充套件:在有些應用中,如果不是線性高斯的情況該怎麼辦?可以採用EKF(擴充套件卡爾曼濾波),在工作點附近對系統進行線性化,即使不是高斯也近似成高斯去做。這樣做有點太粗糙了,於是又有了IEKF(迭代卡爾曼濾波,對工作點進行迭代優化),UKF或SPKF(無跡卡爾曼濾波,不做線性化,而是投影做出一個高斯分佈去近似)。或者拋棄各種假設,直接採用蒙特卡洛的方式,假設出很多的粒子去近似分佈,就是PF(粒子濾波)。

步驟

理解下面這個五個方程的含義就可以了:
\[\hat{x}_k^- = A\hat{x}_{k-1} + Bu_{k-1}\]\[P_k^- = A P_{k-1} A^T + Q\]

\[K_k = P_k^- H^T (HP_k^-H^T + R)^{-1}\]\[\hat{x}_k = \hat{x}_k^- + K_k (z_k - H\hat{x}_k^-)\]\[P_k = P_k^{-} - K_k H P_k^-\]

  • 公式(步驟)1:由上一時刻的狀態預測當前狀態,加上外界的輸入。
  • 公式(步驟)2:預測過程增加了新的不確定性\(Q\),加上之前存在的不確定性。
  • 公式(步驟)3:由預測結果的不確定性\(P_k^-\)和觀測結果的不確定性\(R\)計算卡爾曼增益(權重)。
  • 公式(步驟)4:對預測結果和觀測結果做加權平均,得到當前時刻的狀態估計。
  • 公式(步驟)5:更新\(P_k\)
    ,代表本次狀態估計的不確定性。

需要注意的是,在定位中狀態\(x_k\)是一個向量,除了座標外還可以包含速度,比如\(x_k = (座標x,座標y,速度x,速度y)\),狀態是向量而不僅僅是一個標量,上面的幾個公式中的矩陣乘法實際上是同時對多個狀態進行計算,表示不確定性的方差也就成了協方差矩陣。

實踐

下面用matlab動手寫一個卡爾曼濾波:首次使用卡爾曼濾波時先呼叫函式kf_init()對初始化結構體kf_params的各項引數,之後每次濾波時,設定當前的觀測值,呼叫kf_update()進行更新,定位結果包含在返回的引數kf_params中。
Github地址
python版參考http://www.cnblogs.com/rubbninja/p/6256072.html

函式kf_update()

function kf_params = kf_update(kf_params)
    % 以下為卡爾曼濾波的五個方程(步驟)
    x_ = kf_params.A * kf_params.x + kf_params.B * kf_params.u;
    P_ = kf_params.A * kf_params.P * kf_params.A' + kf_params.Q;
    kf_params.K = P_ * kf_params.H' * (kf_params.H * P_ * kf_params.H' + kf_params.R)^-1;
    kf_params.x = x_ + kf_params.K * (kf_params.z - kf_params.H * x_);
    kf_params.P = P_ - kf_params.K * kf_params.H * P_;
end
 

函式kf_init()

function kf_params = kf_init(Px, Py, Vx, Vy)
%% 本例中,狀態x為(座標x, 座標y, 速度x, 速度y),觀測值z為(座標x, 座標y)
 
    kf_params.B = 0; %外部輸入為0
    kf_params.u = 0; %外部輸入為0
    kf_params.K = NaN; %卡爾曼增益無需初始化
    kf_params.z = NaN; %這裡無需初始化,每次使用kf_update之前需要輸入觀察值z
    kf_params.P = zeros(4, 4); %初始P設為0
 
    %% 初始狀態:函式外部提供初始化的狀態,本例使用觀察值進行初始化,Vx,Vy初始為0
    kf_params.x = [Px; Py; Vx; Vy];
 
    %% 狀態轉移矩陣A
    kf_params.A = eye(4) + diag(ones(1, 2), 2); % 和線性系統的預測機制有關,這裡的線性系統是上一刻的位置加上速度等於當前時刻的位置,而速度本身保持不變
 
    %% 預測噪聲協方差矩陣Q:假設預測過程上疊加一個高斯噪聲,協方差矩陣為Q
    %大小取決於對預測過程的信任程度。比如,假設認為運動目標在y軸上的速度可能不勻速,那麼可以把這個對角矩陣的最後一個值調大。有時希望出來的軌跡更平滑,可以把這個調更小
    kf_params.Q = diag(ones(4, 1) * 0.001); 
 
    %% 觀測矩陣H:z = H * x
    kf_params.H = eye(2, 4); % 這裡的狀態是(座標x, 座標y, 速度x, 速度y),觀察值是(座標x, 座標y),所以H = eye(2, 4)
 
    %% 觀測噪聲協方差矩陣R:假設觀測過程上存在一個高斯噪聲,協方差矩陣為R
    kf_params.R = diag(ones(2, 1) * 2); %大小取決於對觀察過程的信任程度。比如,假設觀測結果中的座標x值常常很準確,那麼矩陣R的第一個值應該比較小
end

測試卡爾曼濾波的效果

模擬一條運動軌跡,然後加上高斯觀察噪聲,作為觀測位置軌跡。然後使用卡爾曼濾波得到濾波後的結果。可以分別計算出觀察位置軌跡的定位精度和濾波後軌跡的定位精度。

addpath('./filters');
addpath('./IP_raytracing');
%% 模擬一條運動軌跡,然後加上高斯觀察噪聲,作為觀測位置軌跡。然後使用卡爾曼濾波得到濾波後的結果。
% 速度為均值0.6m標準差0.05的高斯分佈
% 觀測噪聲標準差為2
 
%% 畫出實際的真實路徑
roomLength = 1000;
roomWidth = 1000;
t = 500;
trace_real = get_random_trace(roomLength, roomWidth, t);
figure; 
subplot(1, 3, 1); plot(trace_real(:, 1), trace_real(:, 2), '.');
title('實際的真實路徑');
 
%% 有觀測噪聲時的路徑
noise = 2; %2m的位置波動噪聲
trace = trace_real + normrnd(0, noise, size(trace_real));
subplot(1, 3, 2); plot(trace(:, 1), trace(:, 2), '.');
title('有噪聲時的路徑');
fprintf('卡爾曼濾波之前的定位精度: %f m\n', accuracy(trace, trace_real));

%% 對有噪聲的路徑進行卡爾曼濾波
kf_params_record = zeros(size(trace, 1), 4);
for i = 1 : t
    if i == 1
        kf_params = kf_init(trace(i, 1), trace(i, 2), 0, 0); % 初始化
    else
        kf_params.z = trace(i, 1:2)'; %設定當前時刻的觀測位置
        kf_params = kf_update(kf_params); % 卡爾曼濾波
    end
    kf_params_record(i, :) = kf_params.x';
end
kf_trace = kf_params_record(:, 1:2);
subplot(1, 3, 3); plot(kf_trace(:, 1), kf_trace(:, 2), '.');
title('卡爾曼濾波後的效果');
fprintf('卡爾曼濾波之後的定位精度: %f m\n', accuracy(kf_trace, trace_real));

卡爾曼濾波效果演示

典型的一組測試結果為:
卡爾曼濾波之前的定位精度: 2.424880 m
卡爾曼濾波之後的定位精度: 1.426890 m

在這組測試中,濾波後的軌跡更平滑,而且精度從2.4m提高到1.4m,之所以能到達這樣好的結果,是因為充分使用了先驗知識:目標的運動是連續且基本勻速的。



作者:rubbninja
出處:http://www.cnblogs.com/rubbninja/
關於作者:目前主要研究領域為機器學習與無線定位技術,歡迎討論與指正!
版權宣告:本文版權歸作者和部落格園共有,轉載請註明出處。

相關推薦

室內定位系列——目標跟蹤濾波

進行目標跟蹤時,先驗知識告訴我們定位軌跡是平滑的,目標當前時刻的狀態與上一時刻的狀態有關,濾波方法可以將這些先驗知識考慮進來得到更準確的定位軌跡。本文簡單介紹卡爾曼濾波及其使用。 原理 這裡僅從目標定位跟蹤的角度做一個簡化版的介紹。 定位跟蹤時,可以通過某種定位技術(比如位置指紋法)得到一個位置估計(

OpenCV之Kalman fileter濾波

原理的通俗解釋 用一個網上流傳溫度估計的例子(根據 k-1 時刻的溫度值,估算 k 時刻的是實際溫度值),為了通俗會意,我這裡儘量避免使用專業術語。 假設我們相信溫度是恆定的,所以得到 k 時刻的溫度預測值是跟 k-1 時刻一樣的,假設是23 度,同時該值的高斯噪聲的偏差是 5 度。然後,你

室內定位系列——目標跟蹤粒子濾波

進行目標跟蹤時,先驗知識告訴我們定位軌跡是平滑的,目標當前時刻的狀態與上一時刻的狀態有關,濾波方法可以將這些先驗知識考慮進來得到更準確的定位軌跡。本文簡單介紹粒子濾波及其使用,接著卡爾曼濾波寫,建議先閱讀室內定位系列(五)——目標跟蹤(卡爾曼濾波)。 原理 這裡跟卡爾曼濾波進行對比來理解粒子濾波。 目標

無人駕駛四 擴充套件濾波目標車輛運動狀態識別中的運用python程式

# coding=utf-8 import numpy as np import numdifftools as nd import math dataset = [] # read the measurement data, use 0.0 to stand LI

無人駕駛汽車系統入門——濾波目標追蹤

前言:隨著深度學習近幾年來的突破性進展,無人駕駛汽車也在這些年開始不斷向商用化推進。很顯然,無人駕駛汽車已經不是遙不可及的“未來技術”了,未來10年

cv2使用濾波Kalman Filter捕捉滑鼠運動

本文主要介紹在cv2中使用Kalman濾波捕捉滑鼠運動。 cv2.KalmanFilter(dynamParams=None,#狀態的維度 measureParams=None, #測量的維度 controlParams=None,#控制的維度 type=None)#矩陣的型別

通俗理解濾波及其演算法實現帶例項解析

1.簡介(Brief Introduction) 在學習卡爾曼濾波器之前,首先看看為什麼叫“卡爾曼”。跟其他著名的理論(例如傅立葉變換,泰勒級數等等)一樣,卡爾曼也是一個人的名字,而跟他們不同的是,他是個現代人! 卡爾曼全名Rudolf Emil Kalman,匈牙利數學家,1930年出生於

濾波Kalman Filter原理與公式推導

公式推導 領域 公式 不一定 技術 精度 原理 應用 定性 一、背景---卡爾曼濾波的意義 隨著傳感技術、機器人、自動駕駛以及航空航天等技術的不斷發展,對控制系統的精度及穩定性的要求也越來越高。卡爾曼濾波作為一種狀態最優估計的方法,其應用也越來越普遍,如在無人機、機器人等領

濾波原理及應用

出於科研需要,打算開始學習卡爾曼濾波(Kalmam Filter)。很早之前就聽說過卡爾曼濾波,但一直沒能深入學習,這次終於有機會了,哈哈。 1.卡爾曼濾波的發展過程 卡爾曼濾波的本質屬於"估計"範疇.先介紹下估計,所謂“估計”問題,就是對收到隨機干擾和隨機測量誤差作用的物理系統,按照某種效

濾波—原理介紹轉載

原文連結為:https://blog.csdn.net/heyijia0327/article/details/17487467 這是我看到的寫的比較好的卡爾曼濾波的介紹。 卡爾曼濾波(Kalman filter)是一種高效率的遞迴濾波器(自迴歸濾波器),它能夠從一系列的不完全及包含噪聲的測量中

濾波

舉個例子,上一時刻房間溫度最優值為26度,由於溫度變化緩慢,則可以根據經驗估計本次溫度也為26度,即四式右邊第一項,而此時溫度計讀數為28度,那麼本時刻溫度應該是多少?不知道溫度計精度的情況下,可以對兩個資料求平均,為27度,即T=26+0.5*(28-26)=27。這裡0.5就是本例子中的修正係數,那麼假如

濾波初探

卡爾曼濾波初探 基於時域的線性模型預測 這裡先給出幾個概念(初看的時候很多部落格都沒有這方面說明,若你看到下面懵逼的時候,不妨上來再看看?)  預測:就是根據已有的①經驗、②公式、③以及上一個時間()下檢測物件的狀態的最優估計等資訊,從而得到一個對下一個

無人駕駛汽車系統入門——高階運動模型和擴充套件濾波

前言:上一篇文章的最後我們提到卡爾曼濾波存在著一個非常大的侷限性——它僅能對線性的處理模型和測量模型進行精確的估計,在非線性的場景中並不能達到最優的估計效果。所以之前為了保證我們的處理模型是線性的,我們上一節中使用了恆定速度模型,然後將估計目標的加減速用處理噪聲來表示,這一模

[轉]通俗理解濾波及其演算法實現例項解析

1.簡介(Brief Introduction)在學習卡爾曼濾波器之前,首先看看為什麼叫“卡爾曼”。跟其他著名的理論(例如傅立葉變換,泰勒級數等等)一樣,卡爾曼也是一個人的名字,而跟他們不同的是,他是個現代人!卡爾曼全名Rudolf Emil Kalman,匈牙利數學家,19

濾波Kalman Filter原理理解和測試

Kalman Filter學原理學習 1. Kalman Filter 歷史 Kalman濾波器的歷史,最早要追溯到17世紀,Roger Cotes開始研究最小均方問題。但由於缺少實際案例的支撐(那個時候哪來那麼多雷達啊啥的這些訊號啊),Cotes

通俗理解濾波及其演算法實現例項解析

1.簡介(Brief Introduction)在學習卡爾曼濾波器之前,首先看看為什麼叫“卡爾曼”。跟其他著名的理論(例如傅立葉變換,泰勒級數等等)一樣,卡爾曼也是一個人的名字,而跟他們不同的是,他是個現代人!卡爾曼全名Rudolf Emil Kalman,匈牙利數學家,19

濾波Kalman Filter的通俗解釋

假設你有兩個感測器,測的是同一個訊號。可是它們每次的讀數都不太一樣,怎麼辦? 取平均。 再假設你知道其中貴的那個感測器應該準一些,便宜的那個應該差一些。那有比取平均更好的辦法嗎? 加權平均。 怎麼加權?假設兩個感測器的誤差都符合正態分佈,假設你知道這兩個正態分佈的方差,用這兩個方差值,(此處省略若干數學公式

初學者的卡濾波——擴充套件濾波

簡介   已經歷經了半個世紀的卡爾曼濾波至今仍然是研究的熱點,相關的文章不斷被髮表。其中許多文章是關於卡爾曼濾波器的新應用,但也不乏改善和擴充套件濾波器演算法的研究。而對演算法的研究多著重於將卡爾曼濾波應用於非線性系統。   為什麼學界要這麼熱衷於將卡爾曼濾波器用於非線性系統呢?因為卡爾曼濾波器從一開

慣性導航——擴充套件濾波

對於無人機的慣性導航系統,系統的狀態方程是非線性的,根據擴充套件卡爾曼濾波方程: Predict x^k|k−1Pk|k−1=f(x^k−1|k−1,uk−1)=Fk−1Pk−1|k−1FT

擴充套件濾波EKF

首先進行文件下載 仔細閱讀文件,理解文件中所述內容。 我對文件的matlab程式碼進行了簡單調整如下: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%