深度データ、画像データ、およびポーズ データを同時に取得しようとすると、Tango が画像フレームをドロップしているように見えます。
深度と画像フレームをキャプチャして、ポーズ データと同期しようとしています。C point-cloud-jni-example を使用して、ポイント クラウド データをメモリ バッファーにダンプしてからファイルにダンプするコードを追加しました。onFrameAvailable() のコールバックを追加し、画像データをバッファにコピーしてからファイルにコピーしました。画像データは 30 Hz で深度データは ~5 Hz であるため、最新の画像が最新の深度フレームとかなり密接に一致することを素朴に期待していました。タイムスタンプはあまり近くありませんでした。場合によっては、100 ミリ秒以上異なっていました。そこで、onXYZijAvailable()、onFrameAvailable()、および onPoseAvailable() コールバックと対応するデータ タイムスタンプのタイミングを調査し始めました。
各コールバックに logcat ダンプを追加し、システム時間 (std::chrono::system_clock::now()) と返されたデータ (深度、画像、ポーズ) の TangoSystem タイムスタンプを出力しました。これの一部は、タイムスタンプの差分を正確に計算する方法で説明されていますか? .
ここでポーズのタイミングです。sys time は、コールバックが実行されたときの現在のクロック時間です。ポーズのタイムスタンプは、実際のポーズ構造体からのものです。
sys time pose timestamp
TM CLK Pose 10.008419 245.976464
TM CLK Pose 10.025983 246.009791
TM CLK Pose 10.124470 246.043119
TM CLK Pose 10.133542 246.076447
TM CLK Pose 10.147136 246.109774
TM CLK Pose 10.192470 246.143102
TM CLK Pose 10.200370 246.176430
TM CLK Pose 10.225367 246.209757
TM CLK Pose 10.300509 246.243085
TM CLK Pose 10.311827 246.276413
TM CLK Pose 10.335946 246.309740
TM CLK Pose 10.399209 246.343068
TM CLK Pose 10.407704 246.376396
TM CLK Pose 10.426889 246.409723
TM CLK Pose 10.504403 246.443051
ポーズごとの対応する違いをここに示します。ポーズのタイミングは、記録されたタイムスタンプに基づいて 33 ミリ秒と安定しています。おそらくアプリケーションの負荷が原因で、コールバック時間はかなり異なります。
time: 0.017564 pose: 0.033327
time: 0.098487 pose: 0.033328
time: 0.009072 pose: 0.033328
time: 0.013594 pose: 0.033327
time: 0.045334 pose: 0.033328
time: 0.007900 pose: 0.033328
time: 0.024997 pose: 0.033327
time: 0.075142 pose: 0.033328
time: 0.011318 pose: 0.033328
time: 0.024119 pose: 0.033327
time: 0.063263 pose: 0.033328
time: 0.008495 pose: 0.033328
time: 0.019185 pose: 0.033327
time: 0.077514 pose: 0.033328
time: 0.011892 pose: 0.033328
ここでは、いくつかの深度タイミングと対応する違いを示します。タイムスタンプは約 0.2 秒で非常に安定しています。
sys time : xyz timestamp
TM CLK XYZ 10.161695 246.017013
TM CLK XYZ 10.363448 246.216639
TM CLK XYZ 10.595306 246.438693
TM CLK XYZ 10.828368 246.668223
TM CLK XYZ 11.025787 246.890277
TM CLK XYZ 11.233364 247.097379
TM CLK XYZ 11.433941 247.297005
TM CLK XYZ 11.633176 247.496631
TM CLK XYZ 11.830650 247.696257
time: 0.201753 depth: 0.199626
time: 0.231858 depth: 0.222054
time: 0.233062 depth: 0.229530
time: 0.197419 depth: 0.222054
time: 0.207577 depth: 0.207102
time: 0.200577 depth: 0.199626
time: 0.199235 depth: 0.199626
time: 0.197474 depth: 0.199626
time: 0.196935 depth: 0.199626
ここにいくつかの画像のタイミングがあります。「---」と記された行は問題のあるフレームです。
sys time : img timestamp
TM CLK Img 10.041056 246.005896
TM CLK Img 10.074105 246.105709 -----
TM CLK Img 10.106492 246.105709
TM CLK Img 10.142581 246.138980
TM CLK Img 10.176176 246.172251
TM CLK Img 10.241146 246.205522
TM CLK Img 10.274909 246.305335 -----
TM CLK Img 10.317819 246.305335
TM CLK Img 10.361682 246.345225
TM CLK Img 10.397533 246.390139
TM CLK Img 10.472859 246.430886
TM CLK Img 10.514923 246.538175 -----
TM CLK Img 10.551663 246.545651
TM CLK Img 10.585960 246.586398
TM CLK Img 10.626671 246.620526
TM CLK Img 10.705709 246.656249
TM CLK Img 10.734324 246.767705 -----
TM CLK Img 10.774233 246.768562
TM CLK Img 10.808848 246.804285
TM CLK Img 10.847230 246.842580
TM CLK Img 10.927872 246.878303
TM CLK Img 10.957309 246.989759 -----
TM CLK Img 10.991136 246.990616
上記のリストに対応する時差は次のとおりです。
time: 0.033049 image: 0.099813
time: 0.032387 image: 0.000000
time: 0.036089 image: 0.033271
time: 0.033595 image: 0.033271
time: 0.064970 image: 0.033271
time: 0.033763 image: 0.099813
time: 0.042910 image: 0.000000
time: 0.043863 image: 0.039890
time: 0.035851 image: 0.044914
time: 0.075326 image: 0.040747
time: 0.042064 image: 0.107289
time: 0.036740 image: 0.007476
time: 0.034297 image: 0.040747
time: 0.040711 image: 0.034128
time: 0.079038 image: 0.035723
time: 0.028615 image: 0.111456
time: 0.039909 image: 0.000857
time: 0.034615 image: 0.035723
time: 0.038382 image: 0.038295
time: 0.080642 image: 0.035723
time: 0.029437 image: 0.111456
time: 0.033827 image: 0.000857
4 フレームごとに、イメージ時間に大きな遅延 (約 100 ミリ秒) があることに注意してください。これに、同じまたはほぼ同じタイムスタンプを持つ 2 つのフレームが続きます。連続する 2 つの画像のタイムスタンプが同じ場合でも、新しいフレームを示すためにコールバックが発生します。その結果、ビデオの 5 フレームごとに欠落しています。これは、深度と画像データを一致させようとするアプリケーションにとって悪臭を放ちます。
コードから余分な処理を取り除きました。コールバックで発生する唯一のことは、データが静的バッファーにコピーされることです。ポイント クラウドのレンダリングは、通常のレンダリング スレッドで引き続き実行されます。
それで、何が得られますか?Tango デバイスは、同時に実行されている深度、画像、およびポーズのコールバックをすべて処理できませんか? onFrameAvailable() の代わりに UpdateTexture() を使用する必要がありますか?