3Dカメラでの画像認識処理には、どうしても遅延が生じてしまう。
- 3Dカメラで深度情報を得る前の処理には次の3通りがある。
- 3Dカメラのボードでの電気的な処理結果を深度情報に変換しているもの
- ToFカメラ: ToFカメラでは、光が戻ってくるまでの時間(time of flight)を計測している。 2. 3Dカメラに付随したアクセラレータによって、深度情報に変換しているもの
- 例 RealSenseなどのstructured light方式のカメラ
- 対応点マッチングによって、深度情報を計算させるために、アクセラレータを使用している。
- USBインタフェースでそのカメラを利用する際には、アクセラレータの存在を意識する必要がない。 3. 3Dカメラで取得したデータから、深度情報を算出するには、GPUやCPUを必要とするもの
- 例: StereoLabs ZED2i: NVIDIAのCUDAデバイスが必要
おそらくは、1が遅延時間が少なく、2,3はそれより大きいと推測される。 これらの遅延時間は、取得する画像サイズによって変わってくる。 画像サイズを大きくすると、計算に必要な時間が変わってくる。
- 3Dカメラと検出結果の統合までの遅延時間は、多くの要因の累積となる。
- その時間を計測するのが大事であるが、必ずしも容易ではない。
- 画像取得・画像認識処理の結果を、取得画像にフィードバックする。
- 例:物体検出位置の変化を、レーザーポインタでon/off表示する。
- 対象物の出現を検出して、その結果をレーザーポインタでonを表示する。
- 出現のタイミングと、レーザーポインタでの表示のonへの変化のタイミングとの時間差を各フレームの画像から確認する。
- (ここでは、レーザーポインタのonに関わる時間が1msよりも格段に小さいことを想定している) あるいは、2. 遅延時間を測るには
- 3D計測や画像認識処理への入力の画像サイズを小さくする。
- データのパイプライン設計を改善する。
- CPU、GPU間のデータ転送を減らす。
- モジュールの改善
- メモリのコピーを減らす。
- アクセラレータを使ってCPUの負荷を減らす。
- シングルスレッドによるIOでの待ち時間を減らすために、マルチスレッドにして、IOの部分とデータ処理とを別スレッドにする。
- 別々の検出器を複数動かすのではなく、1つの検出器で兼用させる。
- 例:物体検出とインスタンスセグメンテーションとを同時に実行するライブラリの利用
- encode/decode 処理を減らす。バイナリデータのテキスト化を不要にする。
- 圧縮・展開処理をしない。
- 圧縮・展開処理が必要なときは、利用可能なハードウェアアクセラレータを使う。
- 動き差分を生じないときには、検出処理をスキップする。
- その他、意図しない遅延の原因を取り除く。
- バファファリング処理の改善
通信・画像認識などによる遅延を減らしたうえで、それでも残る問題を減らしていく。 画像認識・画像計測を用いた最新の認識は、以下のような結果
上記の問題に対して、ロボットではカメラ姿勢の問題を生じてしまう。 自分の首の姿勢が変わったときに、やってくる車の動きを世界座標系で適切に判断する。 遅延時間を含んでいるので、現時刻での位置は、過去フレームのデータを含めた予測になる。
このため遅延時間の分の補正を加えて、世界座標での位置を算出する。 この遅延時間の補正分の予測の予測器が、適切であるのかは、ユースケースの中で検証されなくてはならない。
例:渋谷のスクランブル交差点を渡ることを考える。 他の歩行者とぶつからないように歩く。 そこでは、他の歩行者の過去フレームを含めた世界座標系での動きを、ごく近い人に対して追跡している。 数秒先の瞬間も含めてぶつからないようにするためには、他者の動き予測を実施しなければならない。
これらの中で、遅延時間を含めた、他者の動き予測モデル・そこでの自らの行動モデルとを最適化することで、 他者にぶつからないように歩くことができるだろう。
ぶつからないという目的のためには、視覚系のセンサには限界がある。 ガラス(透明物体)や鏡(反射物体)の問題 至近距離での3Dカメラの検出限界の問題 そのため、現時点では視覚センサだけにたよるのではなく、他のセンサを併用する。 例:
- 超音波センサ
- ピンポイント型のToFセンサ これらの場合には遅延時間が短く、フレームレートが高いので、 ぶつからないという目的に利用される。
- 変数のコピー渡しは減らす。
- viewで十分な時に部分配列を使わない。
- 動的に配列をつど確保することを減らす。
- マルチスレッドで実装する。
- バイナリデータをプロセス間で転送するときに、バイナリデータをテキスト化、テキスト化したものをバイナリ化などのオーバーヘッドを生じないように設計する。
- 途中のデータの取りこぼしがあっても、最新のデータが得られやすいのを重視する。
- 使ったこともなく、ROS2を毛嫌いするのは、現実的じゃない。
- ロボットのための制御は、下位の階層と上位の階層とで異なることは珍しくない。μs単位の制御をしたい部分には、それようのマイコンと制御を導入するのがいいだろう。