求解非线性最小二乘问题的常用方法有LM( Levenberg-Marquardt)方法和高斯牛顿法。作者在论文中声称采用了LM方法,但是在程序中却使用了高斯牛顿法。不管用哪种方法,都需要计算目标函数的雅克比矩阵,这个是最繁琐的一步。雅克比矩阵由一阶导数构成,求导数可以采用数值法,也可以用解析法。数值法就是用很小的差分近似表示导数,一般用在函数复杂或者根本无法得到解析解的情况;解析法就是直接用初等函数的求导公式求出复合函数的导数,这样比较精确,作者在程序中就是直接求出导数并组装成雅克比矩阵的,他没有调用第三方的函数库。至于作者是手工求解还是用数学软件我就不知道了。
程序中用OpenCV自带的solve函数求解得到增量matX,不断迭代transform[i] += matX.at(i, 0);得到最优解。
cv::solve(matAtA, matAtB, matX, cv::DECOMP_QR);
在改进版本ALOAM中,后人就图省事直接用了Ceres库,省去了计算雅克比矩阵的工作。Ceres库是Google开发的解最小二乘问题的开源库,被用于自家的SLAM项目Cartographer。