SVO: Fast Semi-Direct Monocular Visual Odometry
SVO: Fast Semi-Direct Monocular Visual Odometry
http://rpg.ifi.uzh.ch/docs/ICRA14_Forster.pdf
2014年6月の論文です。マイクロクアッドコプターの自己位置推定をリアルタイムで実現しています。
研究室のホームページはこちら
コードが公開されています。
ROSで動作確認
ROSというUbuntuで動作するフレームワーク上で動くようです。
Ubuntu 14.04 LTS、ROS indigoで動作確認できました。
★ ubuntu14.04LTSにROS(indigo)のインストール
★ SVOをWindows上のVirtualBoxのUbuntuで動かす(その1:オフライン編)
ubuntu12.04にROS(hydro)
SVOをWindows上のVirtualBoxのUbuntuで動かす(その1:オフライン編) - cvl-robot's diary
⇒ g2oはなくても動作するようです(というか私の環境ではなぜか入りませんでした)
Win8.1 core i5 のVirtual box上でも動きましたが、動作がおもいです。ハードディスクに直接インストールするとスムーズに動作しました。
エントリポイント
ROSのノードとして起動すると
vo_node.cppのmain関数が呼び出されます。
VoNode::imgCbメソッドが呼び出され、
vo_->addImage(img, msg->header.stamp.toSec());
でメインの処理が行われます。
マップの情報
処理のメインとなるクラスはFrameHandlerMonoです。
マップの実体は継承元であるFrameHandlerBaseクラスの
Map map_;
です。
マップのアップデートは
DepthFilter::updateSeedsメソッド内の
seed_converged_cb_(point, it->sigma2); // put in candidate list
で行われています。
このseed_converged_cb_が難解で、実際には
map_.point_candidates_.newCandidatePoint(point, it->sigma2)
を実行します。(FrameHandlerMono::initialize()でバインドされている)
seed_converged_cb_が呼ばれことでマップ(3次元点)が更新されます。
マップの3次元点は、DepthFilterクラスの
std::list<Seed, aligned_allocator<Seed> > seeds_;
から生成されます。
seeds_はまさに3次元点の種です。
少ない視点情報からは3次元点を1点に確定させず、視点情報が集まってから1点に確定させています。そもため、seed_は幅を持っており(論文のFig.5)、収束したらseed_converged_cb_を呼んでマップの更新を行なっています。