paroponの日記

興味のある技術の覚え書きです

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月の論文です。マイクロクアッドコプターの自己位置推定をリアルタイムで実現しています。

 

研究室のホームページはこちら

Robotics and Perception Group

 

コードが公開されています。

uzh-rpg/rpg_svo · GitHub

 

ROSで動作確認

ROSというUbuntuで動作するフレームワーク上で動くようです。

 

Ubuntu 14.04 LTS、ROS indigoで動作確認できました。

 

★ ubuntu14.04LTSにROS(indigo)のインストール

ROS 使い方メモ --1.ROSのインストール

 

★ SVOをWindows上のVirtualBoxUbuntuで動かす(その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_を呼んでマップの更新を行なっています。