g2oのインストールと簡単なサンプルの実行
g2oとは?
- SLAMによく使われるグラフ最適化ライブラリ
グラフ最適化
例
- 曲線フィッティング($y=ax2+bx+c$)
- 頂点
- $a, b, c$
- 辺
- 誤差項
- 頂点
- BA
- 頂点
- 最適化変数
- カメラポーズ
- ランドマーク
- 最適化変数
- 辺
- 誤差項
- カメラのtrajectory
- カメラから観測したランドマークを結んだもの
- 誤差項
- 頂点
- 曲線フィッティング($y=ax2+bx+c$)
g2oのインストール
- https://github.com/RainerKuemmerle/g2o
- 環境はWindows + VIsual Studio 2015
- git cloneしたものをビルドしたらtypes_slam2d_addonsでEigen関連のエラーが出た
- ちゃんとlatest releaseをビルドしたらうまく行きました
- 後はgithubに書いてある通りにビルドすればうまく行った
曲線フィッティングをサンプルとSLAMBOOKにそってほぼ写経したものをgithubに上げました
SLAMBOOKに分かりやすく説明が書かれている 頂点を$a, b, c$のベクトル、辺を各データの誤差としてグラフを考える つまり1つの頂点からその頂点自身に向けてデータ数だけ辺が伸びているグラフになる
実装では頂点はBaseVertex、辺はBaseUnaryEdgeを継承すればいい
頂点ではGNやLMで足していくときの演算の関数oplusimplを定義する これは単純に足し算すればいいだけでなくリー代数のときのような特殊な演算が必要なときがあるから
疑問なのはread()とwrite()がvirtualなんだけどSLAMBOOKとかだと関数の中身は書かずに、実行すると返り値がないとエラーが出てしまうこと これはg2o本家のサンプルを見るととりあえずfalseを返していたのでそれに倣ったら一応動いた まあとりあえずg2oを試すのが目的だから
OpenCV Matxの代入
Matの代入がアドレスで、値をコピーしたいときは.copy()を使用していたけどMatxには無かった
cv::Mat m1 = (cv::Mat_<double>(1, 3) << 4, 5, 6); cv::Mat m2 = m1; m1.at<double>(2) = 10; std::cout << m1 << std::endl; std::cout << m2 << std::endl; cv::Matx13d mx1(4, 5, 6); cv::Matx13d mx2 = mx1; mx1(2) = 10; std::cout << mx1 << std::endl; std::cout << mx2 << std::endl;
結果
[4, 5, 10] [4, 5, 10] [4, 5, 10] [4, 5, 6]