タイムスタンプは、ポーズ、画像、およびポイント データの double 値として取得されます - これらは常に整列しているわけではありません - 2 つのタイム スタンプ間の時間的距離を計算するにはどうすればよいですか? はい、2 つの double を減算する方法は知っていますが、デルタが時間にどのように対応するかはまったくわかりません。
2 に答える
正確に答えなくても、あなたの質問に光を当てる興味深いタイムスタンプ データがいくつかあります。多くの人がこの Tango タグで投稿しているように、深度フレームと画像フレームを一致させようとしています。データが正確に一致せず、射影行列と点の再射影に問題があると考えました。次に、深度フレームと画像フレームのタイムスタンプを確認したところ、130 ミリ秒もずれていることがわかりました。多くの!深度フレームが利用できるときはいつでも最新の画像を取得していましたが。そこで、タイムスタンプ データだけをテストするために戻ってきました。
point-cloud-jni-example に基づくコードを使用してネイティブで作業しています。onXYZijAvailable()、onFrameAvailable()、および onPoseAvailable() のそれぞれについて、時間情報をダンプしています。XYZ と Frame のケースでは、返されたデータを後で使用するために静的バッファーにコピーしています。このテストでは、バッファリングされた画像フレームを無視し、サンプル コードの通常の OpenGL 表示ループに XYZ 深度データを表示します。キャプチャされたデータは次のようになります。
callback type : systime : timestamp : last pose
I/tango_jni_example( 3247): TM CLK Img 5.420798 110.914437 110.845522
I/tango_jni_example( 3247): TM CLK XYZ 5.448181 110.792470 110.845522
I/tango_jni_example( 3247): TM CLK Pose 5.454577 110.878850
I/tango_jni_example( 3247): TM CLK Img 5.458924 110.947708 110.878850
I/tango_jni_example( 3247): TM CLK Pose 5.468766 110.912178
システム時間は、各コールバック内で実行される std::chrono::system_clock::now() からのものです。(アプリの開始時の開始時間によってオフセットされます。) タイムスタンプは、XYZij、画像、またはポーズ構造体からの実際のタイムスタンプ データです。深度と画像については、最新のポーズのタイムスタンプもリストします (サービスの開始からデバイスまで、指定された時間は 0.0 です)。約 2 分間のサンプル データをすばやく分析すると、次の初期結論が導き出されます。
Pose data is captured at VERY regular intervals of 0.033328 seconds.
Depth data is captured at pretty regular intervals of 0.2 seconds.
Image data is captured at odd intervals
with 3 or 4 frames at 0.033 seconds
then 1 frame at about 0.100 seconds
often followed by a second frame with the same timestamp
(even though it is not reported until the next onFrameAvailable()?)
これは、返された構造体の実際のタイムスタンプ データです。本当の?" コールバック間の経過時間は、はるかに可変です。ポーズのタイムスタンプが 0.033 と安定しているにもかかわらず、ポーズのコールバックは 0.010 ~ 0.079 秒のどこかで発生します。イメージ (フレーム) コールバックは、0.025 から 0.040 の間で 4 回発生し、その後、約 0.065 の長い一時停止を 1 回行います。これは、同じタイムスタンプを持つ 2 つの画像が連続する呼び出しで返される場所です。カメラがフレームをスキップしているように見えますか?
したがって、深度、画像、およびポーズを一致させるには、複数のリターンを対応するタイムスタンプ (リング バッファー?) でバッファリングし、マスターとして必要な値でそれらを一致させる必要があります。ポーズ時間が最も安定します。
注: 返されたポーズが onPoseAvailable() によって指定された値の間で補間されているかどうかを確認するために、特定の「中間」時間のポーズを取得しようとはしていません。
logcat ファイルとさまざまな awk 抽出物が利用可能です。それら(数千行)を投稿する方法がわかりません。
基本的な問題は、ポーズ、奥行き、色の画像データを単一のフレームに同期する方法だと思います。それに答えるには、実際には2つのステップがあります
- ポーズをカラー イメージまたは深度に同期します。これを行う最も簡単な方法は、TangoService_getPoseAtTime関数を使用することです。これにより、基本的に、特定のタイムスタンプでポーズを照会することができます。つまり、使用可能な深度ポイント クラウドがあり、その深度フレームのタイムスタンプが得られる場合、深度ポイント クラウドのタイムスタンプを使用して、対応するポーズを照会できます。
- カラー画像と深度画像の同期: 現在、深度ポイント クラウドまたはカラー画像のいずれかをアプリケーション レベルでバッファリングし、それらのタイムスタンプのいずれかに基づいて、バッファ内の他方のデータをクエリする必要があります。TangoXYZijデータ構造にはフィールド名color_imageがあり、コメントには将来の使用のために予約されていると書かれているため、組み込みの同期機能は将来のリリースで提供される可能性があります。