如何用ceres進行兩幀之間的BA優化

2021-08-16 22:19:15 字數 1376 閱讀 1632

學習高博的書已有很長一段時間了,一直看理論,看**,而沒有自己親自上手,最近在做ba優化,大部分slam是用g2o進行的,而對於ceres用的很少,由於博主根本看不懂g2o的**風格,個人覺得很無語(其實是博主zz),那咋辦?,於是就想乾脆用ceres實現ba優化吧。

而關於ceres,其實主要還是殘差的定義了,然後求解過程都是大同小異,直接上我寫的**

struct cost_function_define

templatebool operator()(const t* const cere_r,const t* const cere_t,t* residual)const

point3d _p1,_p2;

};

主要是用模板類編寫,博主一開始也很不習慣,但是沒辦法,用多了也就這樣了,注意的是需要過載操作符(),然後就可以定義殘差了,相信學過ba優化的同學應該對此不陌生,就是簡單的重投影誤差。需要說明的是,這裡面用到了ceres提供的空間點的旋轉向量,這就很愉快了,因為旋轉向量和旋轉矩陣其實就是我們所說的李代數和李群的關係,這就在迭代優化時,使得旋轉向量在+是封閉的,可以進行求導。

然後就是配置求解器

ceres::problem problem;

for(int i=0;i(new cost_function_define(image2_3d[i],image1_3d[i]));

problem.addresidualblock(costfunction,null,cere_r,cere_t);

} ceres::solver::options option;

option.linear_solver_type=ceres::dense_schur;

//輸出迭代資訊到螢幕

option.minimizer_progress_to_stdout=true;

//顯示優化資訊

ceres::solver::summary summary;

//開始求解

ceres::solve(option,&problem,&summary);

//顯示優化資訊

cout《中間關於空間點的求解博主就省略了,在這裡,我們可以看到其實ceres給人的感覺還是很清晰的,至少不像g2o一樣,而對於優化結果,可是說效果是比較好的,對應3d-3d的icp問題,直接的乙個代數解和用g2o做的優化它們實際上差別不是很大,而ceres的結果就給人感覺轉角變了一些,位移也變了一些,一開始博主以為自己做錯了,但是用反投影發現ceres優化的結果確實要比icp要好很多,對應乙個空間三維點,ceres似乎能更好的接近,博主其實也很奇怪為什麼至少在這裡g2o的效果會沒有ceres好,畢竟乙個是自動求導,乙個是要自己寫雅克比矩陣的。。。

想不出那就算了,博主繼續用ceres做ba優化了。。。

我是如何用Worktile進行敏捷開發的

產品backlog是scrum的核心,也是一切的起源。從根本上說,它就是乙個需求 或故事 或特性等組成的列表,按照重要性的級別進行了排序。它裡面包含的是客戶想要的東西,並用客戶的術語加以描述。一般來說產品backlog需要包含以下幾個重要的屬性 這時候worktile的優勢就體現出來了 workti...

如何在兩個不同的vim檔案之間進行複製貼上

相信我們在使用vim進行編輯的時候,經常碰到怎麼把a檔案的內容拷到b檔案中去。本文教你怎麼使用vim跨檔案進行編輯操作。常規想法是開啟兩個vim,然後進行yy和p操作,但是實踐證明根本是不行的。此時,我們需要分割視窗,然後就可以複製貼上了。步驟如下 假設我要把srv.c檔案的readline函式整體...

如何用類實現不同型別之間的轉換?

include include using namespace std class cstudent cstudent void converttype 型別轉換函式 i 0 string name for i 0 i sizeof name sizeof string i if i sizeof ...