在SLAM的後端優化中,比較常用的一種方法是g2o,該圖優化方法在優化時現成可以選用的有2種優化方法。一是Gauss-Newton,另外是LM方法。這裏首先介紹Gauss-Newton方法,其次介紹g2o使用時的一般流程和例程。
Gauss-Newton
Gauss-Newton算法是解決非線性最優問題的常見算法之一.
基本概念定義
非線性方程定義及最優化方法簡述
指因變量與自變量之間的關係不是線性的關係,比如平方關係、對數關係、指數關係、三角函數關係等等。對於此類方程,求解n元實函數f在整個n維向量空間Rn上的最優值點往往很難得到精確解,經常需要求近似解問題。
求解該最優化問題的方法大多是逐次一維搜索的迭代算法,基本思想是在一個近似點處選定一個有利於搜索方向,沿這個方向進行一維搜索,得到新的近似點。如此反覆迭代,知道滿足預定的精度要求爲止。根據搜索方向的取法不同,這類迭代算法可分爲兩類:
- 解析法:需要用目標函數的到函數,
- 梯度法:又稱最速下降法,是早期的解析法,收斂速度較慢
- 牛頓法:收斂速度快,但不穩定,計算也較困難。高斯牛頓法基於其改進,但目標作用不同
- 共軛梯度法:收斂較快,效果好
- 變尺度法:效率較高,常用DFP法(Davidon Fletcher Powell)
- 直接法:不涉及導數,只用到函數值。有交替方向法(又稱座標輪換法)、模式搜索法、旋轉方向法、鮑威爾共軛方向法和單純形加速法等。
非線性最小二乘問題
非線性最小二乘問題來自於非線性迴歸,即通過觀察自變量和因變量數據,求非線性目標函數的係數參數,使得函數模型與觀測量儘量相似。高斯牛頓法解決非線性最小二乘問題的最基本方法,並且它只能處理二次函數。
Unlike Newton’smethod, the Gauss–Newton algorithm can only be used to minimize a sum ofsquared function values
基本數學表達
- 梯度gradient,由多元函數的各個偏導數組成的向量
以二元函數爲例,其梯度爲:
∇f(x1,x2)=(∂f∂x1,∂f∂x2) - Hessian matrix 由多元函數的二階偏導數組成的方陣,描述函數的局部曲率,以二元函數爲例,
H(f(x1,x2))=⎡⎣⎢⎢⎢⎢⎢∂2f∂x21∂2f∂x1∂x2∂2f∂x1∂x2∂2f∂x22⎤⎦⎥⎥⎥⎥⎥ - 雅可比矩陣 Jacobian matrix,是多元函數一階偏導數以一定方式排列成的矩陣,體現了一個可微方程與給出點的最優線性逼近。以二元函數爲例,
J(f(x1,x2))=⎡⎣⎢⎢⎢⎢⎢⎢∂y1∂x1...∂ym∂x1........∂y1∂xn...∂ym∂xn⎤⎦⎥⎥⎥⎥⎥⎥
雅可比矩陣作用,如果
newton method
若非線性目標函數
在極小值點滿足
so we have
如果
如果
牛頓法收斂的速度很快,當
Gauss-Newton
gauss-newton是如何由上述派生的
有時候爲了擬合數據,比如根據重投影誤差求相機位姿(
假設我們研究如下形式的非線性最小二乘問題:
位置殘差爲
如果有大量觀測點(多維),我們可以通過選擇合理的T使得殘差的平方和最小求得兩個相機之間的位姿。機器視覺這塊暫時不擴展,接着說怎麼求非線性最小二乘問題。
若用牛頓法求式3,則牛頓迭代公式爲:
here
用矩陣表示爲
here
看到這裏大家都明白高斯牛頓和牛頓法的差異了吧,就在這迭代項上。經典高斯牛頓算法迭代步長λ爲1.
那回過頭來,高斯牛頓法裏爲啥要捨棄黑森矩陣的二階偏導數呢?主要問題是因爲牛頓法中Hessian矩陣中的二階信息項通常難以計算或者花費的工作量很大,而利用整個
refer
- http://blog.csdn.net/dsbatigol/article/details/12448627
- http://www.voidcn.com/blog/jinshengtao/article/p-6004352.html
g2o
g2o使用舉例
主要步驟
1. SparseOptimizer 是我們最終要維護的東東。它是一個Optimizable Graph,從而也是一個Hyper Graph。一個 SparseOptimizer 含有很多個頂點 (都繼承自 Base Vertex)和很多個邊(繼承自 BaseUnaryEdge, BaseBinaryEdge或BaseMultiEdge)。這些 Base Vertex 和 Base Edge 都是抽象的基類,而實際用的頂點和邊,都是它們的派生類。我們用 SparseOptimizer.addVertex 和 SparseOptimizer.addEdge 向一個圖中添加頂點和邊,最後調用 SparseOptimizer.optimize 完成優化。
2. 在優化之前,需要指定我們用的求解器和迭代算法。從圖中下半部分可以看到,一個 SparseOptimizer 擁有一個 Optimization Algorithm,繼承自Gauss-Newton, Levernberg-Marquardt, Powell’s dogleg 三者之一(我們常用的是GN或LM)。同時,這個 Optimization Algorithm 擁有一個Solver,它含有兩個部分。一個是 SparseBlockMatrix ,用於計算稀疏的雅可比和海塞; 一個是用於計算迭代過程中最關鍵的一步
這就需要一個線性方程的求解器。而這個求解器,可以從 PCG, CSparse, Choldmod 三者選一。
在g2o中選擇優化方法
一共需要三個步驟:
- 選擇一個線性方程求解器,從 PCG, CSparse, Choldmod中選,實際則來自 g2o/solvers 文件夾中定義的東東。
- 選擇一個 BlockSolver 。
- 選擇一個迭代策略,從GN, LM, Doglog中選。
blog
1. http://blog.csdn.net/heyijia0327/article/details/47813405
2. http://www.cnblogs.com/gaoxiang12/p/5304272.html
3. http://www.cnblogs.com/gaoxiang12/p/3776107.html
alse their code and data is available in the github
1. https://github.com/gaoxiang12/g2o_ba_example
2. https://github.com/HeYijia/GraphSLAM_tutorials_code/tree/master/g2o_test