资源简介
使用EKF算法(拓展卡尔曼滤波)来估计机器人的位置信息,并实现可视化展示。该EKF算法还与里程计模型和GPS模型估计进行对比,来判断其估计效果。(运行时记得把.m文件改成英文,否则无法运行)
代码片段和文件信息
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
[zxTruthxOdomu]=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 xPredPxEkf);
convQ=(eye(3)-PxEkf*H)*convQ;
% -----------------------------
% Simulation estimation
estimation.time=[estimation.time; time];
estimation.xTruth=[estimation.xTruth; xTruth‘];
estimation.xOdom=[estimation.xOdom; xOdom‘];
estimation.xEkf=[estimation.xEkf;xEkf‘];
estimation.GPS=[estimation.GPS; z‘];
estimation.u=[estimation.u; u‘];
% Plot in real time
% Animation (remove some flames)
if rem(iremoveStep)==0
%hold off;
plot(estimation.GPS(:1)estimation.GPS(:2)‘*m‘ ‘MarkerSize‘ 5);hold on;
plot(estimation.xOdom(:1)estimation.xOdom(:2)‘.k‘ ‘MarkerSize‘ 10);hold on;
plot(estimation.xEkf(:1)estimation.xEkf(:2)‘.r‘‘MarkerSize‘ 10);hold on;
plot(estimation.xTruth(:1)estimation.xTruth(:2)‘.b‘ ‘MarkerSize‘ 10);hold on;
axis equal;
grid on;
drawnow;
%movcount=movcount+1;
%mov(movcount) = getframe(gcf);% アニメーションのフレームをゲットする
end
end
close
finalPlot(estimation);
end
% control
function u = robotControl(time)
global endTime;
T = 10; % sec
Vx = 1.0; % m/s
Vy = 0.2; % m/s
yawrate = 5; % deg/s
% half
if time > (endTime/2)
yawrate = -5;
end
u =[ Vx*(1-exp(-time/T)) Vy*(1-exp(-time
相关资源
- 雷达目标识别问题的MATLAB代码
- Matlab信号平滑处理-五点滑动平均法
- BPSK扩频误码率曲线MATLAB仿真
- 各种体制雷达信号MATLAB仿真
- matlab编写信道容量
- matlab2009a破解版链接
- id3算法实现
- The DIPUM Toolbox Version 2 m文件
- matlab图像处理算法
- 盒维数MATLAB计算程序
- 用GUI设计神经网络-matlab
- pHog纹理识别 matlab程序
- 金融风险VaR模型研究\\蒙特卡罗算法与
- 免疫算法MATLAB程序
- 小波变换进行语音增强的matlab代码
- MATLAB 计算空间桁架
- 蜂群算法源程序
- 如何用matlab绘制电机效率map图或发动
- 滑动平均值求解Matlab程序).txt
- 在matlab下,验证码识别部分,字符分
- matlab实现神经网络的数字识别,有训
- 字母识别,基于matlab的神经网络.zip
- 弹性光网络中的KSP-FF-RSA算法Matlab代码
- 基于matlab的DEABCC模型
- QC-LDPC码的校验矩阵构造
- zw_clud12345-7946299-matlab实现.zip
- matlab计算光栅衍射效率
- 基于MATLAB的离网型风力发电系统建模
- BP神经网络关于空气污染物含量预测
- 批处理最小二乘Matlab代码
评论
共有 条评论