我是靠谱客的博主 自由大叔,最近开发中收集的这篇文章主要介绍机器人导航必备的栅格地图数学模型及使用占据栅格地图(Occupancy Grid Map),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

机器人导航必备的栅格地图数学模型及使用

  • 占据栅格地图(Occupancy Grid Map)
    • 占用栅格地图基础概念
    • 占据栅格地图的数学模型
    • ROS中使用OccupancyGrid

占据栅格地图(Occupancy Grid Map)

占用栅格地图基础概念

在这里插入图片描述
在这里插入图片描述

上图就是一个ROS中的占据栅格地图显示

栅格地图定义 :栅格地图就是用一个个栅格组成的网格来代表地图. 栅格里可以存储不同的数值, 代表这个栅格的不同含义.

ROS的栅格地图使用

  • 白色代表空闲,也就是可通过区域,其存储的值为 0;
  • 黑色代表占用,也就是不可通过区域,其存储的值为 100;
  • 灰色代表未知,就是说目前还不清楚这个栅格是否可以通过,其存储的值为 -1.

占据栅格地图的数学模型

占据率(Occupancy)
在通常的尺度地图中,对于一个点,它要么有(Occupied状态)障碍物,要么没有(Free状态)障碍物
在占据栅格地图中,对于一个点,用 p ( s = 0 ) p(s=0) p(s=0)来表示它是Free状态的概率;

p ( s = 1 ) p(s=1) p(s=1)来表示它是Occupied状态的概率.两者的和为1

引入两者的比值来作为点的状态: O d d ( s ) = p ( s = 1 ) p ( s = 0 ) Odd(s)=frac{p(s=1)}{p(s=0)} Odd(s)=p(s=0)p(s=1)

对于一个点,新来了一个测量值,之后我们需要更新它的状态,假设测量值来之前,该点的状态为 O d d ( s ) Odd(s) Odd(s)
我们要更新它为: O d d ( s ∣ z ) = p ( s = 1 ∣ z ) p ( s = 0 ∣ z ) Odd(s|z)=frac{p(s=1|z)}{p(s=0|z)} Odd(sz)=p(s=0z)p(s=1z)
这种表达方式类似于条件概率,表示在发生z的条件下s的状态。

根据贝叶斯公式,我们有:
p ( s = 1 ∣ z ) = p ( z ∣ s = 1 ) p ( s = 1 ) p ( z ) p(s=1|z)=frac{p(z|s=1)p(s=1)}{p(z)} p(s=1z)=p(z)p(zs=1)p(s=1)
p ( s = 0 ∣ z ) = p ( z ∣ s = 0 ) p ( s = 0 ) p ( z ) p(s=0|z)=frac{p(z|s=0)p(s=0)}{p(z)} p(s=0z)=p(z)p(zs=0)p(s=0)

带入 O d d ( s ∣ z ) Odd(s|z) Odd(sz)中得到
O d d ( s ∣ z ) = p ( s = 1 ∣ z ) p ( s = 0 ∣ z ) = p ( z ∣ s = 1 ) p ( s = 1 ) / p ( z ) p ( z ∣ s = 0 ) p ( s = 0 ) / p ( z ) = p ( z ∣ s = 1 ) p ( z ∣ s = 0 ) O d d ( s ) Odd(s|z)=frac{p(s=1|z)}{p(s=0|z)}=frac{p(z|s=1)p(s=1)/p(z)}{p(z|s=0)p(s=0)/p(z)}=frac{p(z|s=1)}{p(z|s=0)}Odd(s) Odd(sz)=p(s=0z)p(s=1z)=p(zs=0)p(s=0)/p(z)p(zs=1)p(s=1)/p(z)=p(zs=0)p(zs=1)Odd(s)

对两边取对数得:

l o g O d d ( s ∣ z ) = l o g p ( z ∣ s = 1 ) p ( z ∣ s = 0 ) + l o g O d d ( s ) logOdd(s|z)=logfrac{p(z|s=1)}{p(z|s=0)}+logOdd(s) logOdd(sz)=logp(zs=0)p(zs=1)+logOdd(s)

这样,含有测量值的项就只剩下了 l o g p ( z ∣ s = 1 ) p ( z ∣ s = 0 ) logfrac{p(z|s=1)}{p(z|s=0)} logp(zs=0)p(zs=1)称这个比值为测量值的模型,标记为 l o m e a s lomeas lomeas
测量值的模型只有两种 l o f r e e = l o g p ( z = 0 ∣ s = 1 ) p ( z = 0 ∣ s = 0 ) lofree=logfrac{p(z=0|s=1)}{p(z=0|s=0)} lofree=logp(z=0s=0)p(z=0s=1) l o o c c u = l o g p ( z = 1 ∣ s = 1 ) p ( z = 1 ∣ s = 0 ) looccu=logfrac{p(z=1|s=1)}{p(z=1|s=0)} looccu=logp(z=1s=0)p(z=1s=1)

这样,如果我们用 O d d ( s ) Odd(s) Odd(s)来表示位置s的状态S的话,我们的更新规则就进一步简化成了: S + = S − + l o m e a s S^+=S^-+lomeas S+=S+lomeas
其中 S + S^+ S+ S − S^- S分别表示测量值之后和之前的状态。

另外,在没有任何测量值的初始状态下,一个点的初始状态 S i n i t = l o g O d d ( s ) = l o g p ( s = 1 ) p ( s = 0 ) = l o g 0.5 0.5 = 0 S_{init}=logOdd(s)=logfrac{p(s=1)}{p(s=0)}=logfrac{0.5}{0.5}=0 Sinit=logOdd(s)=logp(s=0)p(s=1)=log0.50.5=0

经过这样的建模,更新一个点的状态就只需要做简单的加减法了。

例如
假设我们设定 l o o c c u = 0.9 looccu=0.9 looccu=0.9 l o f r e e = − 0.7 lofree=-0.7 lofree=0.7
那么, 一个点状态的数值越大,就表示越肯定它是Occupied状态,相反数值越小,就表示越肯定它是Free状态。
在这里插入图片描述
上图就展示了用两个激光传感器的数据更新地图的过程。在结果中,一个点颜色越深表示越肯定它是Free的,颜色越浅表示越肯定它是Occupied的。

ROS中使用OccupancyGrid

在ros中的数据格式定义如下:(官网链接)

std_msgs/Header header
nav_msgs/MapMetaData info
int8[] data

后续
详情参考 古月居

最后

以上就是自由大叔为你收集整理的机器人导航必备的栅格地图数学模型及使用占据栅格地图(Occupancy Grid Map)的全部内容,希望文章能够帮你解决机器人导航必备的栅格地图数学模型及使用占据栅格地图(Occupancy Grid Map)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(85)

评论列表共有 0 条评论

立即
投稿
返回
顶部