zoukankan      html  css  js  c++  java
  • 粒子滤波和蒙特卡洛定位

    算法主要过程如下:

    1.根据观测更新粒子权重

    2.根据权重resample,也就是根据权重更新所有粒子位置,并使得所有粒子权重恢复到一样。

    3.利用一个模型让所有粒子随着robot的移动而移动。

    无公式解释粒子滤波(需要翻墙) : https://www.youtube.com/watch?v=aUkBa1zMKv4

    蒙特卡洛定位(继续翻墙):https://www.youtube.com/watch?v=eAqAFSrTGGY

    其中无公式解释粒子滤波的MATLAB开源代码如下:

      1 function [] = PF ()
      2 % Just call PF (without any arguments) to run the animation
      3 % 
      4 % This is the matlab code behind the movie "Particle Filter Explained
      5 % without Equations", which can be found at http://youtu.be/aUkBa1zMKv4
      6 % Written by Andreas Svensson, October 2013
      7 % Updated by Andreas Svensson, February 2013, fixing a coding error in the
      8 % 'propagation-update' of the weights
      9 % andreas.svensson@it.uu.se
     10 % http://www.it.uu.se/katalog/andsv164
     11 % 
     12 % The code is provided as is, and I take no responsibility for what this
     13 % code may do to you, your computer or someone else.
     14 %
     15 % This code is licensed under a
     16 % Creative Commons Attribution-ShareAlike 3.0 Unported License.
     17 % http://creativecommons.org/licenses/by-sa/3.0/
     18 
     19 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     20 %%% Setup and initialization %%%
     21 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     22 
     23 % Setting the random seed, so the same example can be run several times
     24 s = RandStream('mt19937ar','Seed',1);
     25 RandStream.setGlobalStream(s);
     26 
     27 % Some unceratinty parameters
     28 measurementNoiseStdev = 0.1; speedStdev = 1;
     29 
     30 % Speed of the aircraft
     31 speed = 1;
     32 % Set starting position of aircraft
     33 planePosX = -25; planePosY = 4;
     34 
     35 % Some parameters for plotting the particles
     36 m = 1000; k = 0.0001;
     37 
     38 % Number of particles
     39 N = 200;
     40 
     41 % Some variables for plotting
     42 plotVectorSea = -10:0.01:10;
     43 plotVectorMountains = [-40:0.01:-10.01, 10.01:0.01:40];
     44 plotHeight = 5;
     45 
     46 % The function describing the ground
     47 ground = @(x) (x>=10).*((1-(x-10)/30).*sin(x-10)+((x-10)/30).*sin(1.5*(x-10))+0.2.*(x-10).*(x<=20)+2*(x>20))+...
     48     (x<=-10).*((1-(-x-10)/30).*sin(-x-10)+((-x-10)/30).*sin(1.5*(-x-10))+0.2.*(-x-10).*(x>=-20)+2*(x<-20));
     49 
     50 % Plot the environment
     51 area(plotVectorMountains,ground(plotVectorMountains),-1,'FaceColor',[0 0.6 0])
     52 set(gca,'XTick',[]); set(gca,'YTick',[]); hold on
     53 area(plotVectorSea,ground(plotVectorSea),-1,'FaceColor',[0 0 0.8]); axis([-40 40 -1 10])
     54 plane = plotPlane(planePosX,planePosY,1);
     55 measurementLine = line([planePosX planePosX],[ground(planePosX),planePosY],'Color',[1 0 0],'LineStyle',':');
     56 pause(1)
     57 
     58 
     59 %%%%%%%%%%%%%%%%%%%%%%%
     60 %%% Begin filtering %%%
     61 %%%%%%%%%%%%%%%%%%%%%%%
     62 
     63 % Generate particles
     64 particles = rand(N,1)*80-40;
     65 
     66 % Plot particles
     67 particleHandle = scatter(particles,plotHeight(ones(size(particles))),m*(1/N*ones(N,1)+k),'k','filled');
     68 pause(1)
     69 
     70 FirstRun = 1;
     71 
     72 % Initialize particle weights
     73 w = 1/N*ones(N,1);
     74 
     75 for t = 1:60
     76     % Generate height measurements (with gaussian measurement noise)
     77     planeMeasDist = planePosY - ground(planePosX) + randn*measurementNoiseStdev;
     78     
     79     % Evaluate measurements (i.e., create weights) using the pdf for the normal distribution
     80     w = w.*(1/(sqrt(2*pi)*measurementNoiseStdev)*exp(-((planePosY-ground(particles))-planeMeasDist).^2/(2*measurementNoiseStdev^2)));
     81     
     82     % Normalize particle weigths
     83     w = w/sum(w);
     84 
     85     if FirstRun
     86         
     87         % Sort out some particles to evaluate them "in public" the first
     88         % run (as in the movie)
     89         [~, order] = sort(w,'descend');
     90         pmax = order(1);
     91         pmaxi = setdiff(1:N,pmax);
     92         delete(particleHandle)
     93         particleHandle = scatter([particles(pmaxi);particles(pmax)],plotHeight(ones(size(particles))),m*([ones(N-1,1)/N;w(pmax)]+k),'k','filled');
     94         pause(1)
     95         
     96         pmax2 = order(2);
     97         pmaxi2 = setdiff(pmaxi,pmax2);
     98         delete(particleHandle)
     99         particleHandle = scatter([particles(pmaxi2);particles(pmax);particles(pmax2)],plotHeight(ones(size(particles))),m*([ones(N-2,1)/N;w(pmax);w(pmax2)]+k),'k','filled');
    100         pause(1)
    101         
    102         % Plot all weighted particles    
    103         delete(particleHandle)
    104         particleHandle = scatter(particles,plotHeight(ones(size(particles))),m*(w+k),'k','filled');
    105         pause(1)
    106     end
    107 
    108     % Resample the particles
    109     u = rand(N,1); wc = cumsum(w);
    110     [~,ind1] = sort([u;wc]); ind=find(ind1<=N)-(0:N-1)';
    111     particles=particles(ind,:); w=ones(N,1)./N;
    112 
    113     delete(particleHandle);
    114     particleHandle = scatter(particles,plotHeight(ones(size(particles))),m*(w+k),'k','filled');
    115     pause(1)
    116 
    117     % Time propagation
    118     speedNoise = speedStdev*randn(size(particles));
    119     particles = particles + speed + speedNoise;
    120     
    121     % Update weights
    122     % w = w, since the update in the previous step is done using our motion model, so the
    123     % information is already contained in that update.
    124     
    125     % Move and plot moved aircraft
    126     planePosX = planePosX + speed;
    127     delete(plane); delete(measurementLine)
    128     plane = plotPlane(planePosX,planePosY,1);
    129     measurementLine = line([planePosX planePosX],[ground(planePosX),planePosY],'Color',[1 0 0],'LineStyle',':');
    130     
    131     if FirstRun
    132         % Plot updated particles
    133         delete(particleHandle)
    134         particleHandle = scatter(particles,plotHeight(ones(size(particles))),m*(w+k),'k','filled');
    135         pause(1)
    136     end
    137 
    138     FirstRun = 0;
    139 end
    140 end
    141 
    142 function [ h ] = plotPlane( xpos,ypos,fignr )
    143 figure(fignr)
    144 
    145 X = xpos - 0.6 + [-1,     -0.1,   -0.09,    0.3,  0.7, 0.8, 0.7, 0.3, -0.09,  -0.1, -1];
    146 Y = ypos + [-0.05, -0.05, -0.4, -0.05, -0.05,0 0.05, 0.05, 0.4, 0.05, 0.05];
    147 h = fill(X,Y,'k');
    148 end
    View Code
  • 相关阅读:
    enmo_day_07
    enmo_day_04
    enmo_day_05
    数据仓库的模型设计
    Lucene 概念,定义应用场景
    enum 枚举的简单应用
    单例模式&synchronized
    Spark的 DAGschedule & task schedule 区别以及相互联系
    Spark的stage & job & task 到底是什么 ,以及划分原理
    Java基本数据类型&引用类型总结
  • 原文地址:https://www.cnblogs.com/wellp/p/9320548.html
Copyright © 2011-2022 走看看