基於aloam研究ceres的構建方式

2021-10-10 21:04:54 字數 2553 閱讀 4118

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本身只保證實時資料的傳輸,並不能為按順序傳送資料報提供可靠的傳送機制,也不提供流...