优化问题
我们的目标就是找到一组a , b , λ a,b,\lambdaa,b,λ的解,使得式(1)整体值最小,也就是各个点到曲线的距离在y 方向的和最小。
鲁棒核函数
假设现在散点中一个很离谱的错误点
由于右上角那个离谱的点,导致优化时将整个函数被拉偏了(可以对比图3)。
那么怎么解决这种问题呢?g2o中提供了鲁棒核函数来抑制某些误差特别大的点,拉偏整个优化结果。
鲁棒核函数不是g2o独有的,这是非线性优化方法中的一种常用手段!
//构造一个Huber鲁棒核函数 g2o::RobustKernelHuber* robust_kernel_huber = new g2o::RobustKernelHuber; robust_kernel_huber->setDelta(0.3);//设置delta的大小。注意这个要根据实际的应用场景去尝试,然后选择合适的大小 e->setRobustKernel(robust_kernel_huber);//向边中添加鲁棒核函数
加入鲁棒核函数之后,结果明显好转。
信息矩阵
现在来考虑另一种情况,比方说在一次优化中,对于某一次测量,我们有十足的把握,它非常的准确,所以优化时我们希望对于这次测量给予更高的权重。
如上图,假设我们认为左上角那个异常点是一个比较正确的点(只是假设),我们希望拟合的曲线尽量往这个点偏移。那么我们就这可以设置这次测量边的权重更大。
代码如下:
e->setInformation(Eigen::Matrix<double, 1, 1>::Identity() * 10);
因为测量值的维度为1,所以信息矩阵也为1。如果我们把每一条边的信息矩阵都设置为一样,那么在优化时将认为所有边的优化权重是一样的,将不会对某一条边执行过多的优化!
卡方分布(Chi-squared)外点(outlier)剔除
https://zhuanlan.zhihu.com/p/58556978
ORB-SLAM2取
标签:kernel,高斯,openvslam,chi,sq,矩阵,sqrt,huber,优化 From: https://www.cnblogs.com/gooutlook/p/18349180