简单谈谈八叉树地图环境构建

原文我是放在Notion上的,见这个地方

八叉树是干什么的?

八叉树是一种构建环境地图的方法,顾名思义,就是以八叉树的形式来对环境进行建模。下图是一个八叉树表示环境的例子,左图表示构建的环境,右图表示该环境对应的组织形式。看不懂没关系,下面我们将对八叉树进行详细地讲解。


图1:八叉树示意图

八叉树的基本思想

八叉树的基本思想是,递归地把空间分成八个方块,这些方块在内存中以八叉树的形式组织起来,而每个树的节点对应于空间中的一个方块。我们用一个0~1之间的浮点数来描述这个节点被(障碍物)占据的概率,0表示未占据,1表示空闲,0.5表示不确定。当某个节点下的所有子节点的概率都是相同的时候(如都被占据,都是空闲或都是不确定),我们可以将这些子节点通过剪枝修剪掉,只保留父节点,从而节省内存。相对于点云而言,八叉树是一种高效的环境建模方法,大大地减少了内存占用。

说到这里,大家可能对图1的含义有一点粗糙的认识了,其中,根节点对应于最大的立方体,下面八个子节点表示被划分出的八个方块。

在这里插入图片描述

这些白色的方块对应于树中的小点,表示不确定。
在这里插入图片描述

这些灰色的方块对应于树中的白色正方形,表示空闲。

在这里插入图片描述

被进一步递归划分的方块对应于树中的灰色圆,表示有内节点,也就是说,它子节点的概率不是都相等的。
在这里插入图片描述

而黑色的小方块表示的表示被占据。
在这里插入图片描述

节点的概率

那么,我们为什么要用概率来表示这个节点是否被占据呢?

这是因为环境是一直动态变化的,而且有噪声的存在,比如在第1秒的时候地上有只拖鞋,但是在第3秒的时候拖鞋可能被挪走了,在第5秒的时候又被挪回了原位。

假如雷达恰好在第1秒和第3秒的时候扫描到了拖鞋最初放置的位置,那这个地方到底是被占据着还是空闲的呢?说他被占据或者空闲似乎都不太合适,而用概率来描述是一个比较好的办法了。

实际上,在地图构建的过程中,大多数时候出现的误差是由于测量时周围的噪声造成的,少数时候是因为物体被挪动了位置。高中我们就学过,由于噪声等因素,测量是有误差的,其值是服从正态分布的。

那么这个节点的概率是如何计算和更新的呢?根据文献1,公式长这样:

P ( n ∣ z 1 : t ) = [ 1 + 1 − P ( n ∣ z t ) P ( n ∣ z t ) 1 − P ( n ∣ z 1 : t − 1 ) P ( n ∣ z 1 : t − 1 ) 1 − P ( n ) P ( n ) ] − 1 P(n|z_{1:t})=[1+\frac{1-P(n|z_t)}{P(n|z_t)}\frac{1-P(n|z_{1:t-1})}{P(n|z_{1:t-1})}\frac{1-P(n)}{P(n)}]^{-1} P(nz1:t)=[1+P(nzt)1P(nzt)P(nz1:t1)1P(nz1:t1)P(n)1P(n)]1

这是一个条件概率,其中 z 1 : t z_{1:t} z1:t 表示第1次到第t次测量,具体推导过程可以看看文献2。

在实际存储中,我们不存储这个概率 p p p,而是存储其Logit值,其中:

Logit ( p ) = log ⁡ ( p 1 − p ) \text{Logit}(p)=\log(\frac{p}{1-p}) Logit(p)=log(1pp)

其中 p 1 − p \frac{p}{1-p} 1pp叫做优势比(Odds ratio),表示成功的概率是失败概率的多少倍,是一种描述概率的方式。

根据 Logit \text{Logit} Logit 变换后的更新公式如下:

L ( n ∣ z 1 : t ) = L ( n ∣ z t − 1 ) + L ( n ∣ z t ) − L ( n 0 ) L(n|z_{1:t})=L(n|z_{t-1})+L(n|z_t)-L(n_0) L(nz1:t)=L(nzt1)+L(nzt)L(n0)

八叉树的数据结构

下图表示图1所示八叉树对应的存储结构,一个节点由data域和孩子指针域构成,其中data就是节点的Logit值,如果一个节点有内节点,那么该节点的指针域指向一个指针数组,这个指针数组分别又指向对应的节点。
在这里插入图片描述

我们来看看他们的对应关系
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

八叉树的压缩

写不动了,下次再写
To be continue

参考文献

  1. OctoMap: An efficient probabilistic 3D mapping framework based on octrees
  2. 2D栅格-3D八叉树地图及其概率更新_喂-你在楞什么的博客-CSDN博客 (这篇文章的数学推导讲的比较详细)
  3. octomap的入门与学习_qq_42424625的博客-CSDN博客
  4. 游戏场景管理的八叉树算法是怎样的? - 知乎 (zhihu.com)
  5. SLAM拾萃(1):octomap - 半闲居士 - 博客园 (cnblogs.com)
  6. 从logit变换到logistic模型_帅帅de三叔-CSDN博客_logit变换
  7. 优势比_百度百科 (baidu.com)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值