鍬形です。Jetson Nano Mouseを動かしてみようの連載の第5回です。前回はJetson Nano Mouseのカメラ映像を用いてライントレースを行いました。今回はカメラ映像の歪み補正を行います。
この連載については第1回の「Jetson Nano Mouseのセットアップ方法」の記事にて紹介していますのでそちらをご覧ください。
紹介するサンプルについて
今回紹介するサンプルはJetson Nano Mouseのカメラ映像を歪み補正するものです。下記画像左側に写っている白黒のチェスボードはカメラの歪みによって丸みを帯びていますが、この画像を右側のように補正します。ついでに歪み補正したカメラ映像を用いてライントレースを行います。
歪み補正に必要なカメラキャリブレーションはJupyter Notebook、カメラ映像の配信および歪み補正には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アダプタでも可)
- 操作用ノートパソコン
- サンプルコース(前回参照)
- チェスボード
Jetson Nanoは第1回の記事でセットアップしたOSに第2回前半の記事で紹介した方法でROSがインストールされた環境で動かすことを想定しています。
また今回紹介する例では別売のUSB接続の無線LANアダプタ(TP-Link社のTL-WN725N)を取り付けています。
動作が重いときは
今回ご紹介するカメラ映像の歪み補正は比較的負荷の高い処理のため、映像や動作に遅延が生じる場合があります。遅延を感じた際は下記の方法をお試しください。
jetbot_stats.serviceの無効化
JetBotに搭載されているディスプレイはJetson Nano Mouseにないため、jetbot_stats.serviceがディスプレイに接続できずにエラーを出力します。接続できるまで再接続を繰り返すので下記コマンドで終了させます。
sudo systemctl stop jetbot_stats.service
jetbot_stats.serviceは自動起動するように設定されているので下記コマンドで無効化します。これで再起動してもjetbot_stats.serviceが起動しなくなります。
sudo systemctl disable jetbot_stats.service
こちらのGitHubリポジトリにてJetson Nano Mouseの便利な設定をまとめていくのでぜひ開発にお役立てください。
power modeの変更
Jetson Nanoは使用するCPUのパフォーマンスを抑えて省電力にする5Wモードと、パフォーマンスを最大限活用するMAXNモードがあります。MAXNモードを有効化するには下記コマンドを実行します。
sudo nvpmodel -m 0
5Wモードに戻す場合は下記コマンドを実行します。
sudo nvpmodel -m 1
カメラキャリブレーション
Jupyter Notebookを用いてカメラキャリブレーションを行います。キャリブレーションとはカメラの画角など様々なパラメータを推定することを指します。キャリブレーションによってカメラパラメータが推定できると例えばカメラ映像に写る物体がカメラから見てどちらの方向にあるのか正確にわかるようになります。
第1回の「Jetson Nano Mouse用のJupyter Notebookのダウンロードとインストール」の手順に従って使用するNotebookを準備してください。基本的な使用方法は同記事の「Jupyter Notebookの実行」をご覧ください。
今回使用するNotebookは~/Notebooks/camera_undistort
内に入っています。歪み補正や視差推定などの仕組みについて解説もしているので是非ご覧ください。それぞれのNotebookで扱っている内容はcamera_undistortのREADMEにまとめています。解説内容の閲覧のみの場合はNotebookのダウンロード等不要なのでお気軽にアクセスしてください。
チェスボードの準備
キャリブレーションはカメラでチェスボードを撮影し、チェスボード上の市松模様の歪み具合でカメラパラメータを推定します。そこでまずは撮影対象であるチェスボードを準備します。
今回はOpenCVのリポジトリにあるチェスボードを使いました。こちらの画像を保存して紙に印刷するか、スマホやタブレット等のディスプレイで表示できるようにしておいてください。ディスプレイ表示はお手軽ですが反射してカメラに写らない場合もあります。僕は紙に印刷して、紙が曲がらないように板に貼り付けてみました。
キャリブレーション用画像の撮影
チェスボードを撮影するNotebookはundistort_data_collection.ipynbになります。使い方の詳細はNotebook自体に書かれているのでそちらの手順に従って順にセルを実行してください。
最後までセルを実行するとカメラ映像とキャプチャーボタンが表示されます。準備したチェスボードを両方のカメラの画角に入るようにして撮影してください。キャプチャーボタンをクリックすると撮影できます。下記写真は撮影の都合でチェスボードを壁に貼り付けてますが、実際は手で持って様々な角度でチェスボードを撮影します。
Jetson Nano Mouseに搭載されているカメラは広角なのでこれくらい近づけても撮影できます。解像度の都合でカメラとチェスボードが離れすぎるとチェスボードの市松模様をうまく認識できないかもしれません。ご注意ください。
キャリブレーションの実行
撮影した画像を用いてキャリブレーションを行います。キャリブレーション用のNotebookは複数あるのですがのちに使用するROSパッケージの都合で今回はundistort_fisheye_stereo.ipynbを実行します。次回以降のブログでご紹介する視差推定のサンプルも含まれていますが気にせず実行してください。こちらも詳細はNotebookに書かれているので本記事では実行結果をかいつまんでご紹介します。
キャリブレーションの前段階としてチェスボードの格子点を検出します。正常に検出されると下記画像のように格子点がカラフルな線で結ばれます。気分はポップアートの巨匠です。
キャリブレーションによって得られたパラメータを基に歪み補正ができました。画像端が歪む代わりにチェスボードの市松模様がまっすぐになっていることがわかります。このNotebookでは歪み補正以外にも様々なことを行っているのですがそれはのちのブログ記事でご紹介します。
最後までセルを実行すると~/Notebooks/camera_undistort/camera_param/camera_param_fisheye.npz
にカメラパラメータが保存されます。このパラメータを後でご紹介するROSパッケージで使用します。
カメラモデルによる歪み補正の違い
そのほかのNotebookについても簡単にご紹介します。
undistort.ipynbではピンホールカメラモデルをベースとした歪み補正を行っています。下記画像の左が補正前、右が補正後です。非常にシンプルなカメラモデルで、補正できる歪みは小さなものになります。Jetson Nano Mouseに搭載されたカメラは広角で歪みが大きいため、歪みの小さい画像中央付近のみが補正されています。
undistort_fisheye.ipynbでは魚眼カメラモデルをベースに歪み補正を行っています。大きな歪みも補正できるため画像端も補正できていることがわかります。
残りのundistort_stereo.ipynb、undistort_fisheye_stereo.ipynbについては次回以降のブログでご紹介します。お楽しみに。
使用するROSパッケージのインストール
使用するROSパッケージのインストールをします。過去の連載と重複しているので各自の環境に合わせて行ってください。
まずはGitHubから必要なGitリポジトリをダウンロードしてきます。
cd ~/catkin_ws/src git clone https://github.com/rt-net/jnmouse_ros_examples.git git clone https://github.com/rt-net/jetson_nano_csi_cam_ros.git git clone https://github.com/rt-net/gscam.git
次に依存関係にあるソフトウェアをインストールします。
rosdep install -r -y -i --from-paths .
raspimouse_ros_2パッケージも必要ですのでまだインストールしていない場合は第2回前半の記事を参照してください。
ここまで必要なソフトウェアは全てダウンロードできているはずなので、catkin-toolsを使って~/catkin_ws/src
以下のROSパッケージをビルドします。
cd ~/catkin_ws catkin build catkin source
最後にさきほどのNotebookで作成したカメラパラメータcamera_param_fisheye.npzをjnmouse_ros_examples/config
ディレクトリ内にコピーします。動作確認用にすでにパラメータファイルが入っていますが上書きしてください。
以上でROSパッケージのインストールは完了です。
ROSサンプルの実行
歪み補正用ノードを起動
Jetson Nano上で歪み補正用のノードを起動します。
端末を起動してSSHでJetson Nano Mouseにログインしておきます。
(先程までインストール作業をしていた端末でそのまま作業してもOKです)
ログイン後、以下のコマンドを実行してROSの設定を読み込んでおきます。
cd ~/catkin_ws catkin source
先程ROSの設定を読み込んでおいた端末にて
roslaunch jnmouse_ros_examples image_undistortion.launch
と実行します。
補正済み映像が/camera_l/image_rect_color、/camera_r/image_rect_colorというROSトピック名で配信されます。映像はrqtなどを用いて確認することができます。下記画像は左側が補正前、右側が補正後の映像です。
歪み補正済み映像でライントレース
下記コマンドを実行することで歪み補正済み映像を用いてライントレースを行うことができます。モータの電源をONにするとロボットが走り出すので十分気を付けて実行してください。ライントレースの手順や注意事項は過去の記事をご覧ください。
roslaunch jnmouse_ros_examples line_following_undistortion.launch
まとめ
今回はJetson Nano Mouseに搭載されたカメラの映像を歪み補正するサンプルをご紹介しました。カメラのキャリブレーションを行い、歪み補正した映像をROSトピックとして配信しました。
歪み補正をすることでカメラ映像上に写る物体の位置と、実際の物体とカメラの位置関係が正しくなります。今後の連載でご紹介するパノラマ合成や視差推定などの画像処理に欠かせない重要な工程です。
次回はステレオカメラ映像のパノラマ合成を予定しています。
この記事でご興味いただけましたらぜひJetson Nano Mouseのご購入をご検討ください。