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


    占据栅格地图(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)=log\frac{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 ) log\frac{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=log\frac{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=log\frac{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)=log\frac{p(s=1)}{p(s=0)}=log\frac{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
    
    • 1
    • 2
    • 3

    后续
    详情参考 古月居

  • 相关阅读:
    JavaWeb三大组件以及Tomcat工作机制
    Shell脚本文本三剑客之awk编辑器
    打印由数字组成的金字塔图案——python
    《Secure Analytics-Federated Learning and Secure Aggregation》论文阅读
    pip version 更新
    OSEK标准ISO_17356汇总介绍
    【Git LFS】huggingface 断点续传
    Sqoop实操案例-互联网招聘数据迁移
    Java(102):ES7.14,RestHighLevelClient创建索引时报错 createis deprecated
    定日镜系统风致振动特性检测系统研究
  • 原文地址:https://blog.csdn.net/qq_32761549/article/details/128098111