aloam相比於loam增加了ceres庫自動微分,而不需要手推高斯牛頓,這是非常方便的。
對於aloam原始碼,在laserodometry中,有關ceres的部分:
ceres::lossfunction *loss_function =
new ceres::
huberloss
(0.1);
// 魯棒核
ceres::localparameterization *q_parameterization =
new ceres::
eigenquaternionparameterization()
; ceres::problem::options problem_options;
ceres::problem problem
(problem_options)
; problem.
addparameterblock
(para_q,
4, q_parameterization)
;// 類似於addresidual函式的輸入維度+待優化變數
problem.
addparameterblock
(para_t,3)
;
上述**建立問題,並設定了引數塊。值得注意的是,普通的ceres使用並不用這麼設定,直接最終addresidual就可以了,為什麼在這裡,先使用了ceres::localparameterization,再傳入引數塊(待優化變數)呢?
參考localparameterization
類的作用是解決非線性優化中的過引數化問題。所謂過引數化,即待優化引數的實際自由度小於引數本身的自由度。例如slam中,當採用四元數表示位姿時,由於四元數本身的約束(模長為1),實際的自由度為3而非4。此時,若直接傳遞四元數進行優化,冗餘的維數會帶來計算資源的浪費,需要使用ceres預先定義的quaternionparameterization對優化引數進行重構:
problem.addparameterblock(quaternion, 4);// 直接傳遞4維引數ceres::localparameterization* local_param = new ceres::quaternionparameterization();
problem.addparameterblock(quaternion, 4, local_param)//重構引數,優化時實際使用的是3維的等效旋轉向量,避免計算資源的浪費
// loam尋找當前幀角點對應的上一幀的最近點,需要提前將當前幀角點用上一次的q_last_curr位姿進行變換,這是不精確的,但是也沒有其他辦法......
ceres::costfunction *cost_function = lidaredgefactor::
create
(curr_point, last_point_a, last_point_b, s)
; problem.
addresidualblock
(cost_function, loss_function, para_q, para_t)
;// loss_function是魯棒核
最後進行求解:
ceres::solver::options options;
options.linear_solver_type = ceres::dense_qr;
options.max_num_iterations =4;
// 迭代數量較小,保證運算速度
options.minimizer_progress_to_stdout =
false
; ceres::solver::summary summary;
ceres::
solve
(options,
&problem,
&summary)
;
如果之前加入引數塊的時候直接加入,而不進行重構,就會報錯:problem.addparameterblock(quaternion, 4);
ceres::localparameterization *q_parameterization =
new ceres::
eigenquaternionparameterization()
;
problem.
addparameterblock
(para_q,
4, q_parameterization)
;// 類似於addresidual函式的輸入維度+待優化變數
// problem.addparameterblock(para_q, 4); // 不進行重構,會報錯
problem.
addparameterblock
(para_t,3)
;
ceres的學習筆記
剛剛在專案中使用的到了ceres,從完全不了解 到安裝使用解決問題,花費了整整乙個周的時間。所以使用的時候過程中踩了不少的坑,所以特別想記錄下來。ceres solver 是谷歌開發的一款用於非線性優化的庫,在谷歌的開源雷射雷達slam專案cartographer中被大量使用。ceres的官網比較詳...
基於外掛程式開發的架構研究
最近關注架構問題,從很多方面了解到基於外掛程式開發的優點和方便性。其中乙個典型的例子就是eclipse,允許廣大程式設計師在eclipse的核心框架基礎上進行無限擴充套件。那麼基於外掛程式開發具有哪些好處呢?1 可以將各個功能交給外掛程式完成,那麼對於核心框架來說,其實只需要實現基本事件排程,資料快...
基於live555的rtp rtcp研究
實時傳輸協議rtp realtime transport protocol 在一對一或一對多的傳輸情況下工作,其目的是提供時間資訊和實現流同步。rtp的典型應用建立在udp上,但也可以在tcp或atm協 議上工作。rtp本身只保證實時資料的傳輸,並不能為按順序傳送資料報提供可靠的傳送機制,也不提供流...