鍬形です。Jetson Nano Mouseを動かしてみようの連載の第6回です。前回はJetson Nano Mouseのステレオカメラ映像をパノラマ合成しました。今回はステレオカメラ映像でカメラと物体までの距離を推定します。
本連載については第1回の「Jetson Nano Mouseのセットアップ方法」の記事にて紹介していますのでそちらをご覧ください。
紹介するサンプルについて
今回紹介するサンプルはJetson Nano Mouseのステレオカメラ映像を用いてカメラと物体までの距離を推定します。画像右側の映像をカメラと物体までの距離に応じて左側のような白黒(グレースケール)画像に変換します。白いほど距離が遠く、黒いほど距離が近いことを表現しています。このように距離を色や明るさで表現した画像を距離画像または深度画像といいます。
カメラ映像および距離画像の配信にはROSパッケージを使用しています。
Jetson Nano Mouseはアールティの車輪型プラットフォームロボットのひとつです。すでに販売しているRaspberry Pi Mouseの足回り(モータやタイヤなどの走行に関わる駆動部およびそのフレーム)は共通部品で、ソフトウェアインターフェースに関しても概ね同じになるように設計されています。
そのため、Raspberry Pi Mouseのソフトウェアに関してもほぼそのままJetson Nano Mouseで活用することができます。Raspberry Pi Mouseを使っていて「ラズパイをJetsonに置き換えられたらなあ」と思ったときはJetson Nano Mouseを入手するとソフトウェアに大きく手を加えずにJetson Nano Mouseに移行できます。
このサンプルの実行に必要なもの
このサンプルの実行には以下のものが必要です。
- セットアップ済みJetson Nano Mouse
- Jetson Nano Mouse用電源(バッテリでも電源変換ケーブルつきACアダプタでも可)
- 操作用PC(Jetson Nano MouseにSSH接続できるもの)
Jetson Nanoは第1回の記事でセットアップしたOSに第2回前半の記事で紹介した方法でROSがインストールされた環境で動かすことを想定しています。
また今回紹介する例では別売のUSB接続の無線LANアダプタ(TP-Link社のTL-WN725N)を取り付けています。
使用するROSパッケージのインストール
今回扱う内容は前回の続きになります。前回ご紹介した手順に従って歪み補正済みの映像が配信されることを確認できれば本記事で扱う内容の準備も完了しています。

ステレオカメラキャリブレーション
ステレオカメラキャリブレーションによって左右カメラの位置関係を推定し、カメラパラメータをファイルとして出力します。この位置関係が距離推定において重要なパラメータとなるからです。
第5回でカメラ映像の歪み補正を行いましたが、実はこの時点でステレオカメラキャリブレーションも行っていました。そのため第5回の歪み補正サンプルを試された方はすでに距離推定の準備ができています。キャリブレーションを行っていない場合は第5回の手順に従って歪み補正されたカメラ映像が配信されることを確認してから本記事の手順を実行してください。
距離推定の仕組み
カメラから物体までの距離は左右カメラの映像に生じる視差を求めることで得られます。視差とはカメラの位置の違いによって生じる見え方の差です。視差は人間の目でも生じているので、左右交互に目を閉じると微妙に見えるものの位置関係が異なることがわかります。
視差はカメラと物体が近いほど大きく、遠いほど小さくなります。下の画像では遠くの気球より近くのりんごのほうがカメラ映像上の視差が大きくなっていることがわかります。
視差は画像上の見え方の差なので単位はピクセルになります。これをメートルに変換することで距離を得ることができます。ピクセルからメートルに変換するにはカメラの画角や焦点距離、左右のカメラ距離が必要になります。これらのパラメータをステレオキャリブレーションによって推定していたのです。
詳しい求め方や変換処理の実装方法はundistort_stereo.ipynb、undistort_fisheye_stereo.ipynbをご覧ください。Jetson Nano Mouseがなくても閲覧は可能です。詳細はREADMEをご覧ください。
ROSサンプルの実行
Jetson Nano上で距離推定用のノードを起動します。
端末を起動してSSHでJetson Nano Mouseにログインしておきます。
(先程までインストール作業をしていた端末でそのまま作業してもOKです)
ログイン後、以下のコマンドを実行してROSの設定を読み込んでおきます。
cd ~/catkin_ws catkin source
先程ROSの設定を読み込んでおいた端末にて
roslaunch jnmouse_ros_examples stereo_depth_estimation.launch
と実行します。
また下記コマンドを実行するとターミナルに距離画像中央の距離が表示され、配信される距離画像にも目印として黒い円が表示されるようになります。円は距離画像に0を書き込んで描画しているため画像処理に用いることができないことにご注意ください。
roslaunch jnmouse_ros_examples stereo_depth_estimation.launch debug:=true
距離画像が/depth/image_rectというROSトピック名で配信されます。映像はRVizなどを用いて確認することができます。下記動画は画面左側が距離を表示しているターミナル、中央上が距離画像、中央下が歪み補正されたカメラ映像、右側がスマホで撮影した俯瞰映像です。距離画像は特殊なフォーマットなので過去の連載で紹介したrqtを使用するとやや見づらいです。RVizがおすすめです。
推定距離と実測値の比較
距離を推定することができたので簡易的に実測値と比較しました。実測値はJetson Nanoの空き箱からJetson Nano Mouseのアルミフレームの先までの距離とします。
縦軸を推定距離、横軸を実測値にしてグラフにプロットしました。機体1が僕が開発に使用しているJetson Nano Mouseで、機体2はd-satoさんの開発機です。きっちり分析はしませんがなんとなくグラフも右肩上がりでちゃんと距離に応じて推定できてるみたいです。
まとめ
今回はJetson Nano Mouseに搭載されたステレオカメラ映像でカメラと物体までの距離を推定するサンプルを紹介しました。
距離画像を得られればロボットと障害物の衝突を回避したり、検出した物体までの距離を計測したりするアプリケーションを作ることができそうです。Jetson Nano Mouseに搭載されたステレオカメラは距離推定専用のモジュールでないため、物足りなくなった場合は別途RGB-Dカメラを搭載するのもいいかもしれません。
次回はVisual SLAMを予定しています。
この記事でご興味いただけましたらぜひJetson Nano Mouseのご購入をご検討ください。