好久没更新了,最近确实东西有点多有点乱,必要的赶紧来总结一下了
关于SLAM的学习
首先,参考学习了很多关于SLAM的内容,从理论、研究到开源软件甚至于开源的调用库都知道不少,奈何自己在这方面确实尚浅,走了不少弯路。
SLAM是即时定位和地图构建
分为前后端,前端为点云的叠加构建地图,后端为根据位置和移动建图,并用非线性全局优化来修正叠加误差以及进行回环检测。(旧的方法还有涉及EKF的KALMAN滤波,但随着图增大算法会吃不消)
主要的FrameWork:
1.通过RGB+D,反算三角原理计算得到空间坐标系上的点云
2.通过提取特征点和特征点匹配求出转换矩阵,从而将点云合并
3.将摄像机位置作为位姿顶点,转换矩阵作为转换边,得到图G(V,E)
4.利用位置叠加全局优化图G,这是非线性优化的过程
优化数学模型:
模型定义:
其中 $$Mothion: x_p^{x+1} = f(x_p^i,u_i)+w_i$$
$$Observations: z_{i,j} = h(x_p^i,x_L^j)+v_{i,j}$$
求解SLAM前,我们有$u_i,z_{i,j}$分别代表传感器量度以及传感器误差,我们要求$x_p,x_L$
继而误差就是等式左右相减,我们目的用最小二乘全局最优化以下式子:
$$min \phi=\sum_i(e_p^i)^2+\sum_{i,j}(e_L^{i,j})^2$$
所以这是一个非线性和非凸问题,可以通过估计一个起始猜测,然后寻找各个方向上的雅克比和Hessian矩阵进行牛顿迭代等非线性优化方法。由于G的结构是稀疏的,所以可以对SLAM的全局非线性优化进行稀疏求解。(如Sparse Cholesky Decomposition)
这里可以利用到的一些工具包括:ROS、OctoMap、SiftGPU、OpenGL,opencv、eigen、pcl、g2o等等
可以看的书《Multiple View Geometry in CV》和《线性代数该这样读》,还有很多资源,参考下面的LINK,三个阶段:1.基础理论工具学习 2.执行别人的代码和阅读论文 3.阅读并改写改进,突破发论文
这里放一些有用的网站:
Graph Slam Tutorial:g2o