SLAM非线性优化
经过前面的学习,我们的问题变为如何在有噪声的数据中进行准确的状态估计。
状态估计问题#
经典SLAM模型,由一个运动方程和一个观测方程构成:
这里的就是相机的位姿,可以由(特殊欧氏群,欧氏变换组成的)来描述。观测方程由针孔模型给定。
假如在处对路标进行了一次观测,对应到图像上的像素位置为,那么,观测方程可以表示成:
在运动和观测方程,我们通常假设两个噪声项满足零均值的高斯分布:
其中表示高斯分布,0表示零均值,,为协方差矩阵。
在这些噪声的影响下,我们希望通过带噪声的数据z和u推断位姿和地图y以及他们的概率分布(u是啥?),这就是一个状态估计问题。
目前解决状态估计问题的思路:
- 增量/渐进的方式:滤波器
- 批量的方法
批量状态估计和最大后验估计#
这里我们讨论批量方法,考虑1到N的所有时刻,并假设M个路标点。定义所有时刻的机器人位姿和路标点坐标为
u表示所有时刻的输入,z表示所有时刻的观测数据。则就是求:
特别的,当我们不知道控制输入,只有一张张图片时,即只考虑观测方程带来的数据时,可以转化为:
此问题也称为SfM问题,即如何从许多图像中重建三维空间结构。
利用贝叶斯法则:
称作后验概率,称为似然,称为先验。
直接求后验是困难的,但是求一个状态的最优估计,使得在该状态下后验概率最大是可行的:
与待估计的部分无关,所以可以忽略。
贝叶斯告诉我们最大后验概率等价于最大化似然和先验的乘积。但是我们也可以忽略机器人位姿或路标位置,此时就没有了先验。那么可以求解最大似然(Maximize Likelihood Estimation,MLE)
最大似然可以理解为,“在什么状态下,最可能产生现在观测到的数据”
非线性最小二乘#
f(x)为非线性函数,有些导函数可能形式复杂,我们可以使用迭代的方式来接近局部极值
1.给定初始值x_0
2.对第k次迭代,寻找增量,使得达到极小值
3.若 足够小,则停止
4.否则,令返回第2步
此时,问题从求解导函数为0转变到不断寻找下降增量 的问题。
一阶和二阶梯度法#
泰勒展开:
其中是关于x的一阶导数(也叫梯度、雅可比矩阵);H则是二阶导数(海塞矩阵)
一阶梯度:
方向:
再指定步长,完成下降。
二阶梯度/牛顿法:
右侧对求导,并令为0:
则,
高斯牛顿法#
它的思想是将进行一阶泰勒展开而不是:
求解问题变为:
右侧求导,
则,可得 高斯-牛顿方程:
左边的定义为右边的定义为:
对比牛顿法,其实高斯-牛顿法运用作为牛顿法中二阶Hessian矩阵的近似,从而省略了H的估计。
算法流程:
1.给定初始值
2.对于第k次迭代,求出当前的雅可比矩阵和误差
3.求解增量方程:
4.若\triangle x_k足够小则停止。否则,令,返回第2步
列文伯格-马夸尔特方法#
高斯牛顿法中采用的近似二阶泰勒展开只能在展开点附近有较好的近似效果。我们可以增加信赖区间,在区间范围内可以认为二阶近似是有效的。
算法流程:
1.给定初始值x_0,以及初始优化半径;
2.对于第k次迭代,在高斯牛顿的基础上加上信赖区域:
3.计算
4.若,则设置
5.若,则设置
6.如果\rho大于某阈值,则认为近似可行。令x_k+1=x_k+\triangle x_k;
7.判断算法是否收敛。如不收敛返回第2步,否则结束。
D、求解:
右侧等于0 可得:
简化为
可以理解为,利用参数控制两种方法的比例。
较小时, 占主要位置。列文伯格-马夸尔特方法更接近于高斯牛顿法。
较大时, 占主要位置,列文伯格-马夸尔特方法更接近于梯度下降法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2020-10-10 Leetcode之通配符匹配