无人驾驶需要精确的定位。本文将简要介绍无人驾驶定位的相关方法,重点介绍贝叶斯滤波框架进行递归的状态估计。同时附上一维马尔科夫定位的实例及代码。

无人驾驶定位

定位是指在空间中确定自己的位置。

传统的定位方法有GPS(Global Positioning System),但是GPS的误差较大且不稳定(m级)。无人驾驶对定位精度要求较高需要达到cm级的误差,因此需要多传感器融合定位。

定位的数学问题之贝叶斯滤波

定位的目标:记汽车的位置为xx,定位即是求解P(x)P(x)。

那么,为了确定汽车的位置,我们有哪些数据呢?

  • 地图数据mm,包含地图上标志物的位置信息
  • 观测数据zz,包含汽车感知到的标志物与汽车的相对位置信息
  • 控制数据uu,包含汽车的油门转弯等控制信息

定位本身是一种位置不确定性的度量,我们的目标是尽量减少这种不确定性。那么,上面的数据信息是如何帮助我们减少不确定性的呢?

  • Sense:P(x|z)∝P(x)P(z|x)P(x|z) \propto P(x) P(z|x)
  • Move:P(xt+1)=∑P(xt)P(xt+1|xt)P(x_{t+1}) = \sum P(x_t) P(x_{t+1}|x_t)

贝叶斯滤波是一种使用递归进行状态估计的框架。其交替利用Move阶段的prediction和Sense阶段的update,便可以对汽车的位置P(x)P(x)做更精准的描述。

一维马尔科夫定位

一维马尔科夫定位、卡尔曼滤波、粒子滤波都属于贝叶斯滤波的一种,这里将简要介绍一维马尔科夫定位。

数据

这里使用的数据包含以下三种,目的是要获得汽车在tt时刻位置的置信为bel(xt)bel(x_t)。

  • 地图数据mm,包含地图上标志物的位置信息
  • 观测数据zz,包含汽车感知到的标志物与汽车的相对位置信息
  • 控制数据uu,包含汽车的油门转弯等控制信息

动机

记汽车在tt时刻位置的置信为bel(xt)bel(x_t),有

bel(xt)=P(xt|z1:t,u1:t,m)

bel(x_t) = P(x_t| z_{1:t}, u_{1:t}, m)

这里额外提一下,如果求P(xt,m|z1:t,u1:t)P(x_t, m| z_{1:t}, u_{1:t}),那么则从定位问题变成SLAM(simultaneous location and mapping)问题。

容易看到,随着tt的增大,估计bel(xt)bel(x_t)需要的数据越来越大。我们的目标是:

  1. 减少估计所用的数据量
  2. 需要的数据不随时间增加

也就是:

bel(xt)=f(bel(xt−1),zt,ut,m)

bel(x_t) = f(bel(x_{t-1}), z_t, u_t, m )

根据贝叶斯公式,可得:

bel(xt)=P(xt|z1:t,u1:t,m)=P(xt|zt,z1:t−1,u1:t,m)=P(xt|z1:t−1,u1:t,m)P(zt|xt,z1:t−1,u1:t,m)P(zt|z1:t−1,u1:t,m)

\begin{split} bel(x_t) &= P(x_t| z_{1:t}, u_{1:t}, m) \\ &= P(x_t| z_t, z_{1:t-1}, u_{1:t}, m) \\ &= \frac{P(x_t| z_{1:t-1}, u_{1:t}, m) P(z_t| x_t, z_{1:t-1}, u_{1:t}, m) }{P(z_t| z_{1:t-1}, u_{1:t}, m) } \end{split}

上面的公式主要包含两部分,下面将对这两部分分别求解:

  1. motion model(prediction):P(xt|z1:t−1,u1:t,m)P(x_t| z_{1:t-1}, u_{1:t}, m)
  2. observation model(likelihood):P(zt|xt,z1:t−1,u1:t,m)P(z_t| x_t, z_{1:t-1}, u_{1:t},m)

Motion Model

根据马尔科夫假设,可得:

P(xt|z1:t−1,u1:t,m)=∫P(xt−1|z1:t−1,u1:t,m)P(xt|xt−1,z1:t−1,u1:t,m)dxt−1=∫P(xt−1|z1:t−1,u1:t−1,m)P(xt|xt−1,ut,m)dxt−1=∑ibel(xit−1)P(xt|xit−1,ut)

\begin{split}P(x_t| z_{1:t-1}, u_{1:t}, m) &=\int P(x_{t-1}| z_{1:t-1}, u_{1:t}, m) P(x_t| x_{t-1}, z_{1:t-1}, u_{1:t}, m) d x_{t-1} \\ &= \int P(x_{t-1}| z_{1:t-1}, u_{1:t-1}, m) P(x_t| x_{t-1}, u_t, m) d x_{t-1} \\ &=\sum_i bel(x_{t-1}^i) P(x_t| x_{t-1}^i, u_t) \end{split}

P(xt|xit−1,ut)P(x_t| x_{t-1}^i, u_t)被称为transition model,其满足:

P(xt|xit−1,ut)∼N(xt−xit−1:ut,σut)

P(x_t| x_{t-1}^i, u_t) \sim N(x_t -x_{t-1}^i : u_t, \sigma_{u_t})

Observation Model

根据马尔科夫假设,可得:

P(zt|xt,z1:t−1,u1:t,m)=P(zt|xt,m)=P(z1t,z2t,...zkt|xt,m)=∏kP(zkt|xt,m)

\begin{split} P(z_t| x_t, z_{1:t-1}, u_{1:t},m) &= P(z_t| x_t, m) \\ &= P(z_t^1,z_t^2,...z_t^k | x_t, m) \\ &= \prod_k P(z_t^k | x_t, m) \end{split}

其中,

P(zkt|xt,m)∼N(zkt:zkt∗,σzk)

P(z_t^k | x_t, m) \sim N(z_t^k: {z_t^k}^* , \sigma_{z_k})

代码实例

void bayesianFilter::process_measurement(const MeasurementPackage &measurements,const map &map_1d,help_functions &helpers){/*******************************************************************************  Set init belief of state vector:******************************************************************************/if(!is_initialized_){//run over map:for (unsigned int l=0; l< map_1d.landmark_list.size(); ++l){//define landmark:map::single_landmark_s landmark_temp;//get landmark from map:landmark_temp = map_1d.landmark_list[l];//check, if landmark position is in the range of state vector x:if(landmark_temp.x_f > 0 && landmark_temp.x_f < bel_x_init.size() ){//cast float to int:int position_x = int(landmark_temp.x_f) ;//set belief to 1:bel_x_init[position_x]   = 1.0f;bel_x_init[position_x-1] = 1.0f;bel_x_init[position_x+1] = 1.0f;} //end if}//end for//normalize belief at time 0:bel_x_init = helpers.normalize_vector(bel_x_init);//set initial flag to true:is_initialized_ = true ;}//end if/*******************************************************************************  motion model and observation update******************************************************************************/std::cout <<"-->motion model for state x ! \n" << std::endl;//get current observations and control information:MeasurementPackage::control_s     controls = measurements.control_s_;MeasurementPackage::observation_s observations = measurements.observation_s_;//run over the whole state (index represents the pose in x!):for (unsigned int i=0; i< bel_x.size(); ++i){float pose_i = float(i) ;/***************************************************************************  posterior for motion model**************************************************************************/// motion posterior:float posterior_motion = 0.0f;//loop over state space x_t-1 (convolution):for (unsigned int j=0; j< bel_x.size(); ++j){float pose_j = float(j) ;float distance_ij = pose_i-pose_j;//transition probabilities:float transition_prob = helpers.normpdf(distance_ij,controls.delta_x_f,control_std) ;//motion model:posterior_motion += transition_prob*bel_x_init[j];}/***************************************************************************  observation update:**************************************************************************///define pseudo observation vector:std::vector<float> pseudo_ranges ;//define maximum distance:float distance_max = 100;//loop over number of landmarks and estimate pseudo ranges:for (unsigned int l=0; l< map_1d.landmark_list.size(); ++l){//estimate pseudo range for each single landmark //and the current state position pose_i:float range_l = map_1d.landmark_list[l].x_f - pose_i;//check, if distances are positive: if(range_l > 0.0f)pseudo_ranges.push_back(range_l) ;}//sort pseudo range vector:sort(pseudo_ranges.begin(), pseudo_ranges.end());//define observation posterior:float posterior_obs = 1.0f ;//run over current observation vector:for (unsigned int z=0; z< observations.distance_f.size(); ++z){//define min distance:float pseudo_range_min;//check, if distance vector exists:if(pseudo_ranges.size() > 0){//set min distance:pseudo_range_min = pseudo_ranges[0];//remove this entry from pseudo_ranges-vector:pseudo_ranges.erase(pseudo_ranges.begin());}//no or negative distances: set min distance to maximum distance:else{pseudo_range_min = distance_max ;}//estimate the posterior for observation model: posterior_obs*= helpers.normpdf(observations.distance_f[z], pseudo_range_min,observation_std); }/***************************************************************************  finalize bayesian localization filter:*************************************************************************///update = observation_update* motion_modelbel_x[i] = posterior_obs*posterior_motion ;}; //normalize:bel_x = helpers.normalize_vector(bel_x);//set bel_x to belief_init:bel_x_init = bel_x;
};

无人驾驶定位与贝叶斯滤波相关推荐

  1. 【贝叶斯滤波与卡尔曼滤波】 第四讲 连续随机变量的贝叶斯公式

    声明:[贝叶斯滤波与卡尔曼滤波]系列是博主对B站up主:忠厚老实的老王所分享教学内容的学习笔记,并且该系列每篇博客都会将博主听课后总结的纸质版笔记附于文末,供大家参考. B站up主:忠厚老实的老王是一 ...

  2. python实现排列组合公式算法_Python实现卡尔曼滤波算法之贝叶斯滤波

    Python实现卡尔曼滤波算法之贝叶斯滤波 作者:yangjian 卡尔曼滤波器属于贝叶斯滤波器的一种特例,本文主要讲解贝叶斯滤波原理及其算法的python实现. 先来看下贝叶斯公式 贝叶斯公式 :后 ...

  3. 9 概率机器人 Probabilistic Robotics 二值贝叶斯滤波 占据栅格地图 occupancy grid mapping

    文章目录 1 前言 2 二值贝叶斯滤波 2.1 理论基础 2.2 算法流程 2.3 重要公式推导 3 实例:占据栅格地图(occupancy grid mapping) 4 参考文献 1 前言 如果通 ...

  4. 贝叶斯滤波(三)贝叶斯滤波算法推导

    一. 状态估计(state estimation) 状态估计根据可获取的量测数据估算动态系统内部状态的方法. 贝叶斯滤波也就是在已知观测和可选的控制输入的概率分布下,估计出的状态概率分布. 状态随着时 ...

  5. 从贝叶斯滤波理论到容积卡尔曼滤波算法(CKF)详细推导及编程实现常转弯率模型估计。(matlab)

    容积卡尔曼滤波(CKF)是由加拿大学者Arasaratnam和Haykin在2009年提出的.该算法的核心思想是针对非线性高斯系统,通过三阶球面径向容积准则来近似状态的后验均值和协方差,以保证在理论上 ...

  6. 贝叶斯滤波算法(实例)

    基本的贝叶斯滤波算法 Algorithm Bayes_filter(bel(x[t-1], u[t], z[t])):for all x[t] do:bel_transition(x[t]) = ∫p ...

  7. 粒子滤波 particle filter —从贝叶斯滤波到 粒子滤波—Part-III(重要性采样序贯重要性采样SIS)

    粒子滤波 particle filter -从贝叶斯滤波到粒子滤波-Part-III(重要性采样&序贯重要性采样SIS) 原创不易,路过的各位大佬请点个赞 机动目标跟踪/非线性滤波/传感器融合 ...

  8. 滤波估计理论(一)——贝叶斯滤波

    滤波估计理论(一)--贝叶斯滤波(Bayesian Filtering) 估计问题的建模 状态空间模型 概率模型 贝叶斯估计方法 批处理贝叶斯估计 预测,滤波还是平滑? 贝叶斯滤波 状态预测 量测更新 ...

  9. 贝叶斯滤波和贝叶斯平滑(Kalman滤波,RTS平滑)

    文章目录 贝叶斯滤波(*Bayesian filtering equations*) 贝叶斯滤波方程 Kalman滤波 贝叶斯平滑(*Bayesian smoothing*) 贝叶斯最优平滑方程 Ra ...

最新文章

  1. 备份mysql数据库攻略_mysql备份实例攻略
  2. 一个页面区分管理者和普通用户如何设计_产品经理要做的操作权限/数据权限设计...
  3. 可视化工具第一篇(百度Echarts)
  4. SpringCloud-Learning
  5. mysql数据库的安装和配置文件_MySQL 数据库安装与配置详解
  6. Spring MVC:The request sent by the client was syntactically incorrect
  7. Asp.Net 学习资源列表(转)
  8. python 之禅_Python 之禅
  9. 惠普服务器c盘格式化提示win7系统盘,通过U盘重装系统,已经格式化C盘提示如下...
  10. Disallowed Key Characters(转)
  11. Eclipse java SE版本解决无法新建web项目问题
  12. CKfinder中文乱码的解决.
  13. 什么是视图?作用是什么?
  14. 或操作(||)和与操作()的执行顺序以及返回结果
  15. 九九乘法表c语言编程10乘10,C语言编程九九乘法表
  16. 小米3刷android 6.0,安卓6.0版MIUI7曝光:小米3/小米4/小米Note将尝鲜
  17. 鼎信诺虚拟服务器导数,鼎信诺使用手册--自编版.docx
  18. linux 查看硬盘使用率
  19. K-BERT:BERT+知识图谱
  20. 与项目管理专家就软件项目管理专题探讨实录

热门文章

  1. 利用矩阵奇异值分解(SVD)进行降维
  2. CVPR2021 图像匹配挑战赛,双赛道冠亚军方案
  3. 深度隐式表达:为什么不用mesh,点云,体素等表示方法?
  4. 论文简述 | DOT:面向视觉SLAM的动态目标跟踪
  5. linux 安装了tomcat 但是一直访问不了怎么办
  6. CentOS7(64位)下运行IPython3出错解决办法
  7. python csv模块 一次读多行_python中csv模块读取reader只能读取一次
  8. MPB:林科院袁志林组-一种简易的植物组织表面消毒装置
  9. 342.基于高通量技术的微生物组研究实验设计
  10. 中科院遗传发育所发表“重组菌群体系在根系微生物组研究中应用”的重要综述...