1、资料链接
1-1 SlamCN
可以完全按照SlamCN上的教程进行学习。
1-2-1 SLAM资料整理
1-2-2 SLAM论文阅读和分类整理
1-3 ROS包navigation学习:
https://blog.csdn.net/sonictl/article/details/51518492
1-4 特别全的slam资料
2、相关算法知识
2-2 梯度下降法、牛顿法等优化算法:
个人总结:对于下面的最小二乘问题,若F(x)是线性函数,可以直接另其一阶导数为0,求出最优参数。若误差函数是非线性的,一般要使用迭代方法来寻求最优解。
非线性函数求解最小二乘步骤:
1)选择一个合理的初值,选择的好的话迭代次数会少;
2)使用各种方法比如:梯度下降、牛顿、高斯牛顿、LM等方法,求得;
3)若足够小、或者超过迭代次数,则停止;否则到2)步,一直迭代。
这里的各种方法其实就是将非线性函数在当前x状态下近似为线性的方法,求得的是该线性函数的。具体来说:
梯度下降法:对F(x)在处进行一阶泰勒展开,将系统在处近似为线性系统,有,J是关于x的雅克比矩阵,那么只要取,让x向梯度的反方向走,就能达到最小地方。该方法优点是一直寻找变化最大的地方行进。
牛顿法:牛顿法是为了求解非线性函数根点(与x轴的交点)的方法。因为在当时数学家发现对于很多非线性函数(这里指那些确有根点的函数)来说求解=0是很难的,牛顿发现非线性函数的切线和曲线有一定的联系,甚至在切点附近的一定区域内,切线函数可以近似为曲线函数。并且牛顿发现,切线的根点肯定是向的根点方向靠近的,那么只要每次求取切线根点,作为下次观测G的输入,然后在这个新的点(,)上再做切线,求该切线根点,然后再更新非线性函数的新的点(,),一直到G逼近到0,最终求得x。对于最小二乘问题,我们可以做个转换,求,即是求,因为是非线性函数,所以我们用牛顿法不断迭代更新来求的根点。具体过程:
1)已知(,),以及此点处的斜率;
2)那么根据切线公式y=kx+b,有:
可以很容易求得 ,然后去迭代更新,最终求得x使。
上式说明更新x需要使用F的一节和二阶导数,J(雅克比矩阵)和H(海森矩阵)。所以我们对泰勒展开到二阶,如下:
展开到二阶说明,我们用一个常值+一次函数+二次函数来近似表示,那么对其关于求导,就是一条直线了,也就是求出了我们切线的表达式。我们求这条切线的根点,即,然后不断迭代。