1.前言
我们已经讲过了单目相机构建稠密地图,当然,对于视觉,这是一个简单有效的办法,对于SLAM系统来讲,它还有很多不足。
> 稀疏地图反而更容易做导航,稠密地图作用一般是三维重建考虑的问题。
主要缺陷有如下几点:
- 像素梯度
- 深度参数
- 图像投影
- 多线程
我们接下来先讨论一下这些缺陷以及他的解决办法。
2.梯度与深度
1.像素梯度
对于极线约束,最简单就是使用单个像素的对比,找到最相似的一个作为匹配,但是这有很多误差,所以,诞生了使用块匹配作为匹配方式,虽然这个已经很大程度降低了他的误匹配率,但是任然不是一个很好的方法和解决方案。
比如,梯度问题,对于纹理明显的区域,他的像素梯度可以非常明显,但是,对于不明显的区域呢,比如白墙,天空等等。
这个问题依然需要更好的解决办法。
2.深度参数
在估计他的深度参数时,我们假设它是服从高斯分布的,但是,在实际系统中,它不一定服从高斯分布。
但是,深度有如下特点:
- 非负性;
- 广域性。
所以,很多研究者根据这两个特点,开发出逆深度这个概念,就是在深度估计时,使用逆深度假设服从高斯分布。
但这只是对于传统SLAM中,这是一个技巧,但是对于深度学习对于其的估计,通常得出的不再是逆深度了。
3.图像变化和多线程
1.图像变化
对于之前的块匹配,我们有一个前提,是只发生变化而没旋转变化,对于发生了旋转变化呢,就需要考虑图像间的变化而不是直接使用极线约束。
这里考虑的图像变化就是旋转矩阵和平移矩阵。
2.多线程
我们知道,上述的各种计算都是大批量的计算,但一个计算线程难以估计如此大规模的计算,对于实时性,这是个挑战。
但是多线程的计算可以大大缓解这个问题。
4.八叉树地图
> 把三维空间建模为许多个小方块(或体素)是一种常见的做法。如果把一个小方块的每个面都平均切成2片,那么这个小块就会变成同样大小的八个小方块。这个步骤可以不断的重复,直到最后的方块大小达到建模的最高精度。在这个过程中,把“将一个小方块分成同样大小的八个”看成”从一个结点展开成八个子节点”,那么整体从最大空间细分到最小空间的过程,就是一颗八叉树。整个大方块可以看成是根节点,而最小的块可以看作是“叶子节点”。于是在八叉树中,当我们由下一层结点往上走一层时,地图的体积就能扩大为原来的八倍。如果叶子结点的方块大小为1平方厘米,那么当我们限制八叉树为10层时,总共能建模的体积大约为8的10次幂立方厘米,也就是1073平方米。这足够建模一间屋子。由于体积与深度呈指数关系,所以当用更大的深度时,建模的体积会增长的非常快。
大家都应该了解二叉树的概念,一个节点,2个分支,而八叉树,顾名思义,就是一个节点,8个分支。
八叉树最大的优点就是它非常节约空间。
5.实践
//八叉树实例
int main( int argc, char** argv )
{
if (argc != 3)
{
cout<<"Usage: pcd2colorOctomap <input_file> <output_file>"<<endl;
return -1;
}
string input_file = argv[1], output_file = argv[2];
pcl::PointCloud<pcl::PointXYZRGBA> cloud;
pcl::io::loadPCDFile<pcl::PointXYZRGBA> ( input_file, cloud );
cout<<"point cloud loaded, piont size = "<<cloud.points.size()<<endl;
//声明octomap变量
cout<<"copy data into octomap..."<<endl;
// 创建带颜色的八叉树对象,参数为分辨率,这里设成了0.05
octomap::ColorOcTree tree( 0.05 );
for (auto p:cloud.points)
{
// 将点云里的点插入到octomap中
tree.updateNode( octomap::point3d(p.x, p.y, p.z), true );
}
// 设置颜色
for (auto p:cloud.points)
{
tree.integrateNodeColor( p.x, p.y, p.z, p.r, p.g, p.b );
}
// 更新octomap
tree.updateInnerOccupancy();
// 存储octomap, 注意要存成.ot文件而非.bt文件
tree.write( output_file );
cout<<"done."<<endl;
return 0;
}
6.小结
这里,我们就讲完了,入门SLAM的最后一个知识点,相信大家对于SLAM系统有了全新的认识,从传感器数据、前端估计、后端优化、回环检测、地图重建。希望这一个系列可以帮助大家深入的理解相关的概念,但是研究人在不断探索,欢迎大家深入SLAM 方向,推动机器人感知领域的科技发展。