在经典的SLAM中一旦确定了路标点的位置,就可以算作建图完成。但这种没办法完成导航、避障等功能,于是要用到稠密的地图。
建图的需求:定位,导航,避障,重建,交互。
单目稠密重建
问题为:已知每一帧的对应的轨迹(位姿),以第一幅图像为参考帧,计算每个像素的深度。
步骤:1. 假设所有像素的深度满足某个初始的高斯分布
2. 当新数据产生时,通过极线搜索和块匹配确定投影点的位置
3. 根据几何关系计算三角化后的深度及不确定性
4. 将当前的观测融合进上一次的估计中(深度滤波器)。若收敛则停止,否则返回第二步。
极线搜索和块匹配
假设:不同图像间整个小块的灰度值不变(假设性更强了)
计算小块之间的差异:
这里是相关性,接近0表示不相似,接近1表示相似。
由于沿着极线搜索通常会得到非凸函数,非线性优化耗时,所以通常使用深度滤波器。
高斯分布的深度滤波器
则由高斯分布的乘积:
问题是如何计算新数据不确定性:
通过几何关系可以得到:
代码实践:
可优化的部分
问题 | 解决 |
对梯度不明显的地方,使用块匹配时没有区分性 | 书里没有 |
深度的正态分布:实际场景不是对称的结构,近处不到0,但远处有无穷远 | 使用逆深度,即d^(-1) |
当相机发生明显旋转时,块匹配难以成立 | 在块匹配之前把当前帧与参考帧之间的运动考虑进来,算出局部范围内参考帧与当前帧的坐标变换构成的仿射变换 |
稠密深度图的计算费时 | 并行化(GPU) |
因为各像素的计算是完全独立的,可能出现深度图不平滑的情况 | 给深度估计加上空间正则性 |
没有显式地处理外点 | 只要NCC大于一定值就认为出现了成功地匹配 |
R-GBD稠密重建
从点云重建网格![](https://img-blog.csdnimg.cn/20210819103141754.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzU0MjI1ODM0,size_16,color_FFFFFF,t_70)
八叉树地图
优点:灵活、能压缩、能随时更新
在八叉树里,节点中储存是否被占据的信息,当某个方块都被占据或者都不被占据时,就没有必要展开这个节点。
用概率表述是否被占据这件事