PTAMの改良 - 1 ユーザ操作によるマップ更新

|
PTAMは優れたプログラムですが、問題点もいくつかあります。
その1つは、実行にある程度のスペックを必要とすることです。

現在発売されている通常の価格帯のPCであれば、このスペック不足はほとんど問題ありません。
しかし、PTAMをEeePCのような低価格PCや、w-zero3のような携帯端末で実行しようと、これが大きな問題となります。


そこで、その解決方法のうちの1つとして、別スレッドで実行されている「マップの更新」をスレッドで行わずに、
ユーザーの操作によって発生するイベントとして処理する方法を試してみます。


お気づきの方もいると思いますが、このような処理を行った場合、このプログラムは最早PTAM(Parallel Tracking and Mapping)とは言えず、STAM(Serial Tracking and Mapping)(なんじゃそりゃ)になってしまいます。

なので、本末転倒な気がしますが、たとえマップの更新が自動じゃなくても、その他のPTAMの機能はとても魅力的なものです。
これを携帯端末などで動かすことができれば、楽しいことができそうだと考え、改良してみることにしました。




---- < マップの更新処理に必要なもの > ----

この改良で重要なのが、「マップの更新がどのように行われるか?」ということです。
PTAMの解析でも大まかに説明しましたが、マップに特徴点を追加するにはキーフレームが必要になります。

ここで、キーフレームの決め方には2つ方法があります。
1.マップの初期化時に、ユーザーがスペースキーを押した時のフレーム(2個)が、キーフレームとして保存される。
2.マップをトラッキングしている時に、よりキーフレームに適したフレームが、自動的にキーフレームとして選ばれる。

1で決まった2つのキーフレームでは、特徴点のステレオ計算が行われて、3D座標としてマップに追加されます。
2で決まった1つのキーフレームは行列に入れられ、マップの更新スレッドが実行される度に一つずつマップに追加されます。



---- < キーフレームの追加方法 > ----


ということで、更新を手動で行う場合のキーフレームの追加方法も、2つあるということになります。
それは、ユーザーが決める方法と、自動で決めさせる方法です。

・ユーザーが決める場合: 初期化時と同じように、ユーザーが適切なキーフレームを選べるような手助けをしてあげなくてはいけません。
・自動で決めさせる場合: 適切なキーフレームが選ばれますが、それは現在見ている画像とは違うフレームになります。

さて、どちらを選ぶのがより良いでしょうか?
ちなみにPTAMの初期化作業は結構面倒で、慣れないと失敗します。対して、自動の場合はボタン1回押しで済み、フレームの違いも大きな問題にはなりません。

結果、後者の自動キーフレーム生成を選択しました。
キーフレームが追加できたら、あとは任意のタイミングでマップの更新処理を行ってやるだけです。



---- < ソースの変更点 > ----


では実際に、PTAMを改良していきます。

  • 最初にマップ更新スレッドを切らなくてはいけません。マップ更新のスレッドはMapMakerクラスで行われています。
    このクラスはCVD::Threadを継承しているので、この継承関係をコメントアウトします。

  • 継承を切ってしまうと、そのままコンパイルした時にエラーが出るので、必要ないもの(run()など)もコメントアウトします。

  • ここで、MapMaker::Reset()を行わないようにしてしまうと、マップのリセットなども行われず、プログラムが動きません。
    この関数もどこかで呼ばれるようにしましょう。(MapMaker::RequestReset()が呼ばれる所など)

  • キーフレームをマップに追加する処理は、MapMaker::AddKeyFrameFromTopOfQueue()で行われます。
    これを任意のタイミング(スペースキー押下時など)に実行するようにします。

  • このままだと、マップの修正処理が行われないので、MapMaker::BundleAdjustAll()などのマップ調整関数も、更新後に行われるようにしましょう。
大雑把な変更点はこんな感じになります。プログラミングの知識があり、PTAMの大まかな処理を理解できていれば、さほど難しくないと思われます。


このブログ記事について

このページは、PipeRが2009年3月30日 20:54に書いたブログ記事です。

ひとつ前のブログ記事は「PTAMの解析 - 4 動画の公開」です。

次のブログ記事は「PTAMの改良 - 2 マーカーの認識」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01a