1 EKF原理
EKF是在KF的基础上,增加了对线性要求的拓展,即可以采用非线性函数表示运动方程和观测方程。
EKF的基本思想如下:
2 程序结果
Odometry表示里程计模型。
3 程序代码
function [] = ekf_localization()
close all;
clear all;
disp('EKF Start!')
time = 0;
global endTime; % [sec]
endTime = 60;
global dt;
dt = 0.1; % [sec]
removeStep = 5;
nSteps = ceil((endTime - time)/dt);
estimation.time=[];
estimation.u=[];
estimation.GPS=[];
estimation.xOdom=[];
estimation.xEkf=[];
estimation.xTruth=[];
% State Vector [x y yaw]'
xEkf=[0 0 0]';
PxEkf = eye(3);
% Ground True State
xTruth=xEkf;
% Odometry Only
xOdom=xTruth;
% Observation vector [x y yaw]'
z=[0 0 0]';
% Simulation parameter
global noiseQ
noiseQ = diag([0.1 0 degreeToRadian(10)]).^2; %[Vx Vy yawrate]
global noiseR
noiseR = diag([0.5 0.5 degreeToRadian(5)]).^2;%[x y yaw]
% Covariance Matrix for motion
convQ=eye(3);
% Covariance Matrix for observation
convR=noiseR;
% Other Intial
xPred = [0 0 0]';
F = zeros(3);
H = zeros(3);
% Main loop
for i=1 : nSteps
time = time + dt;
% Input
u=robotControl(time);
% Observation
[z,xTruth,xOdom,u]=prepare(xTruth, xOdom, u);
% ------ Kalman Filter --------
% Predict
xPred = doMotion(xEkf, u);
F = jacobF(xEkf, u);
convQ = F*convQ*F'+ noiseQ;
% Update
H = jacobH(xPred);
PxEkf = convQ*H'*inv(H*convQ*H'+convR);
xEkf= doObservation(z, xPred,PxEkf);
convQ=(eye(3)-PxEkf*H)*convQ;