こんにちは、15 の nomo ( @nomotech )です。
この記事はrogy Advent Calender 2020 20日目の記事です。
ちょっと諸事情合って記事の公開が遅れました、すみません。
今回から 5 回にわたって連載していきます
まず1回目は基礎知識編です。
近年ロボットや VR などの分野で3次元計測の需要が高まっています。特に静止物体ではなく移動物体の3次元データが欲しいという機会は多いと思います。
皆さんは通常深度情報が欲しいなというときには市販の深度センサを購入して使っていると思いますが、市販されている深度センサは速度面で問題があったり使用用途に対して最適なものになっていなかったりすると思います。
実際ロボットで画像使いたい場合って長距離はLIDERとか使えばいいと思うんですが、ピッキングをする場面などで、近距離の物体の形状を知りたいというときにちょうどいい測定距離のセンサがあんまりなくないですか?
ということで、今回は高速に深度とカラーを得られるRGB-Depthセンサを自作していこうと思います。
概要
今回作成する深度センサは高速カメラとプロジェクタを利用した構造化光法による深度センサです。
構造化光法とはプロジェクタからパターン光を投影して、それをカメラで撮像してパターンを解析することによって深度を計算する手法です。構造化光法はピクセルごとに並列で処理できる手法を使うので、GPUを使って超高速で深度計測ができます。
今回は120fpsのセンサを作ります。
下の画像は今回使うプロジェクタとカメラです、詳しくは次回説明します。
深度センサの種類
深度センサの種類について簡単に紹介します。
市販されているもので代表的なものとその特徴を以下の表にまとめました。
今回作るもの | Kinect v2 | Sony IMX556 | Intel® RealSense™ module D435 | |
---|---|---|---|---|
方式 | 構造化光法 マルチショット |
ToF | ToF | IRステレオカメラ + 構造化光法 |
解像度(pixel) | 1440×1080 | 512×424 | 642×484 | 1280×720 |
フォーマット | RGB-Depth | RGBカメラ + Depth(別撮り) | Depth | RGBカメラ + Depth(別撮り) |
フレームレート(fps) | †120† | 30 | 60 | 90 (RGB-Depth のとき30) |
撮像距離(m) | 0.5 ~ 3.0 | 0.5 ~ 8.0 | 1.5 ~ 6.0 | 0.1 ~ 10.0 |
奥行精度(mm) | 0.1 ~ 3.0 | 10.0 ~ 100.0 | 5.0 ~ 100.0 | 1.0 ~ 100.0 |
メーカーによって工夫して弱点を克服していたりするので一概には言えませんが、ざっくりと説明すると
従来手法の特徴
- ToF は外乱に強いが遅い
- RealSense は赤外線カメラ2台と赤外線パターン投影を使ったステレオカメラと構造化光法のハイブリッドで、深度計測は速く、外乱にも強い
- 解像度が低い
- Kinect V2 も RealSense も深度とカラーで別のセンサを使うので RGB-Depth だと遅い
- 長距離の深度もとれるようにするために近距離の精度がよくない
今回作るものの特徴
- 解像度が高い
- APIで解像度を下げることもでき、解像度を下げればもっと速くなる
- RGBセンサを使って深度の計測をするのでRGB-Depthが超高速で取れる
- RGBカメラを使った構造加光法であり、外乱に弱い
- 複数のパターン光をつかったマルチショット方式なので、残像が残ってしまう欠点がある
- 近距離用のベースラインと焦点の設定をするので近距離で精度がいい
という感じです。
ハードウェアの基礎知識
高速カメラについて
ものつくり界隈で高速カメラを使っている人をあまり見かけないのでここで紹介します。
高速カメラはBasler、Ximea、FLIRなどのメーカがあります。
金額は 5 ~ 10 万円で少し高いですがいろいろな用途に使えるので持っておいて損はないと思います。
大きさは 30 mm 立法くらいでとても小さいです、USB 3.0 でPCと接続します。
sdk が配布されており、プログラムから細かい設定や撮像の制御をすることができます。
どのメーカーのカメラもセンサ自体は大体 Sony 製の同じものを使っているので、メーカーごとの差は sdk や GUI ソフト、ハードウェアのカッコよさとかになります。
個人的に Ximea > FLIR > Basler の順番で値段に比例して使い勝手がいい気がします。
カメラにはグローバルシャッター方式と、ローリングシャッタ―方式のセンサがありますが、高速性の面からグローバルシャッター方式のカメラが適しています。
カラーカメラとモノクロカメラがあり、モノクロカメラだと色が取れない代わりに赤外線まで取れます。
またカラーフィルタに比べてデモザイキングの必要がなく解像度が高いです。
今回は安かったので Basler の USB 3.0 カラーカメラ acA1440-220uc を使ってみました。
プロジェクタについて
今回使う構造化光法では複数種類のパターンを投影する必要があります。映画の映写機のようにフィルムを回転させて切り替える方法であれば超高速にすることができると思いますが、ハードウェアを作るのが面倒だったので今回はプロジェクタで作っていきます(修論が一段落付いたら作る)。
プロジェクタの方式にはいろいろありますが、今回は小型でコントラストが高いDLP方式のプロジェクタを使います。
同期
高速に構造化光法をするためには、高速に切り替わるパターンと同期してカメラで撮像しなければなりません。
産業用カメラには撮像開始のタイミングを外部信号から制御する仕組みがあります。この仕組みはトリガーといいます。
このトリガー機能は Realsense にもついます。この入力ピンから同期信号を入れると、電圧の立ち上がりに合わせて撮像を開始してくれます。
今回使用するカメラにもついています。
この同期信号は別のパルス発生装置などから生成し、センサの動作を同期させるために使われます。今回はプロジェクタの投影のタイミングに合わせてこの信号を出さなければなりません。
同期信号が出せる市販のプロジェクタはなかなかなく、分難に同期プロジェクタを使うならDLPチップ開発モジュールを使うか、それともプロジェクタを魔改造する必要があります。
今回はプロジェクタを魔改造してパルスを取り出す方法を使います。
では早速自作していきます。
続きはこちら
RGB-Depthセンサを自作しよう【1-基礎知識編】
RGB-Depthセンサを自作しよう【2-同期撮像編】
RGB-Depthセンサを自作しよう【3-キャリブレーション編】
RGB-Depthセンサを自作しよう【4-構造化光法編】
RGB-Depthセンサを自作しよう【5-深度計算編】