d-satoです。Jetson Nano Mouseを動かしてみようの連載の第4回です。前回はJetson Nano MouseをスマホVRのインターフェース経由で操作する方法を紹介しました。今回はJetson Nano Mouseのカメラを使ってライントレースをする方法を紹介します。
この連載については第1回の「Jetson Nano Mouseのセットアップ方法」の記事にて紹介していますのでそちらをご覧ください。
紹介するサンプルについて
今回紹介するサンプルは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アダプタでも可)
- 操作用ノートパソコン
- サンプルコース
Jetson Nanoは第1回の記事でセットアップしたOSに第2回前半の記事で紹介した方法でROSがインストールされた環境で動かすことを想定しています。
また今回紹介する例では別売のUSB接続の無線LANアダプタ(TP-Link社のTL-WN725N)を取り付けています。
使用するコースの準備
コースには白地に黒のラインであればどのような形状のものでも問題ありませんが、ループ形状のものをおすすめします。
サンプルのコース用のPDFデータを以下のページに公開しているので、「とりあえずやってみたい」という方はぜひご利用ください。
(フチ無し印刷が可能なプリンタ以外で印刷するとコースの線が途切れますが、多少途切れるぐらいであれば問題ありません。)
https://github.com/rt-net/jnmouse_ros_examples/wiki
走行させる床が黒に近い色の場合はラインのない白い部分を多めに取るようにすることをおすすめします。
使用する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
以上でROSパッケージのインストールは完了です。
ROSサンプルの実行
ライントレース用ノードを起動
Jetson Nano上でライントレース用のノードを起動します。
端末を起動してSSHでJetson Nano Mouseにログインしておきます。
(先程までインストール作業をしていた端末でそのまま作業してもOKです)
ログイン後、以下のコマンドを実行してROSの設定を読み込んでおきます。
cd ~/catkin_ws catkin source
次にロボットを自律移動させるためのプログラムを起動するのですが、
起動したらすぐに走り始めてしまうため、ここで本体のモータのスイッチをオフにします。
モータのスイッチがオフになっていることを確認した後に、先程ROSの設定を読み込んでおいた端末にて
roslaunch jnmouse_ros_examples line_following.launch
と実行します。
ライントレース用コースにロボットを設置
line_following.launchがエラーなく起動できることを確認したらコース上にロボットを設置します。
カメラの撮影範囲内にコースが入るとその座標が端末上に出力されます。
ここでrqtを使って配信されている画像を確認することもできます。
ROS_MASTER_URI
の設定が必要です。詳しくは第2回前半の記事を参照してください。ライントレース開始
コース上およびコースの周辺に障害物がないことを確認したらモータのスイッチをオンにして走行を開始します。
使用するROSサンプルの説明
今回使用するサンプルについて少し説明します。
大きく分けてロボット本体を制御用のノードと自律移動させるための指令を出す用ノードに分けることができます。
line_follower.launch
を読むと全体の構成が見えてくると思いますので、このlaunchファイルについて少し紹介します。
<?xml version="1.0"?> <launch> <!-- robot control nodes --> <arg name="initial_motor_power" default="off" /> <node pkg="raspimouse_ros_2" name="motors" type="motors" required="true" output="screen" args="$(arg initial_motor_power)" /> <node pkg="raspimouse_ros_2" name="buzzer" type="buzzer.py" required="true" /> <node pkg="raspimouse_ros_2" name="leds" type="leds" required="true" /> <node pkg="raspimouse_ros_2" name="buttons" type="buttons" required="true" /> <!-- camera node --> <include file="$(find jetson_nano_csi_cam)/launch/jetson_csi_cam.launch" /> <!-- line following node --> <node pkg="jnmouse_ros_examples" name="line_following" type="line_following.py" required="true" output="screen" /> </launch>
以下の部分でモータ等ロボットの各インターフェイスを起動しています。
ロボット本体のブザーやボタン等は使用しませんが、自律移動させるためのプログラムを改造すれば「ボタンを押したらスタート」など変更を加えられます(詳しくは後述します)。
カメラに関してはjetson_csi_cam.launch
を読み込むようにしています。
<!-- robot control nodes --> <arg name="initial_motor_power" default="off" /> <node pkg="raspimouse_ros_2" name="motors" type="motors" required="true" output="screen" args="$(arg initial_motor_power)" /> <node pkg="raspimouse_ros_2" name="buzzer" type="buzzer.py" required="true" /> <node pkg="raspimouse_ros_2" name="leds" type="leds" required="true" /> <node pkg="raspimouse_ros_2" name="buttons" type="buttons" required="true" /> <!-- camera node --> <include file="$(find jetson_nano_csi_cam)/launch/jetson_csi_cam.launch" />
以下の部分で自律移動させるためのノードを起動しています。
このノードが画像受信し、その画像を処理してラインを検出し、移動指令を出しています。
ここで起動しているline_following.py
を改造すれば、「ボタンを押したらスタート」「ラインを見失ったら止まってブザーを鳴らす」などを実現することもできます。
直進・左右の旋回以外の複雑な動作をしないのでこれで問題ありませんが、広角カメラの映像に少し歪みがあり、環境によってはラインを検出しにくい場合もあります。
<!-- line following node --> <node pkg="jnmouse_ros_examples" name="line_following" type="line_following.py" required="true" output="screen" />
まとめ
Jetson Nano Mouseに搭載されたカメラを使ってライントレースをする例を紹介しました。
今回の例では楕円状のコースを走行し、スタートとストップはモータのスイッチを使って切り替えました。
ライントレースのためのプログラムを改造すれば「ボタンを押したらスタート」「ラインを見失ったら止まってブザーを鳴らす」なども実現ができます。
広角カメラの映像に少し歪みがあり、環境によってはラインを検出しにくい場合もあります。ライントレースをするぐらいであれば問題はありませんが、
複雑な画像処理をする際にはカメラから配信される映像の歪みを補正しておいたほうがよさそうです。
次回は歪み補正をしながらライントレースする方法を紹介する予定です。
ぜひご購入をご検討ください!