d-satoです。Jetson Nano Mouseを動かしてみようの連載の第3回です。前回はROS/ROS 2経由で操作する方法を紹介しました。
今回はJetson Nano MouseをスマホVRのインターフェース経由で操作する方法を紹介します。
この連載については第1回の「Jetson Nano Mouseのセットアップ方法」の記事にて紹介していますのでそちらをご覧ください。
※当初の予定を変更して、第8回に予定していたスマホVRでJetson Nano Mouseを操作する方法を第3回としています。
紹介するサンプルについて
今回紹介するサンプルはスマートフォンにVRグラスを取り付けたスマホVRを使ってJetson Nano Mouseのカメラ映像を取得しながらJetson Nano Mouseを操作するものです。
Jetson Nano上でWebサーバを起動し、スマートフォンのWebブラウザからアクセスします。
カメラ映像の配信および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アダプタでも可)
- 操作用ノートパソコン
- スマートフォン
- スマートフォン用VRグラス
Jetson Nanoは第1回の記事でセットアップしたOSに第2回前半の記事で紹介した方法でROSがインストールされた環境で動かすことを想定しています。
また今回紹介する例では別売のUSB接続の無線LANアダプタ(TP-Link社のTL-WN725N)を取り付けています。
今回はスマートフォン用VRグラスはHomido MINI VRグラスを使用しています。
使用する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サンプルの実行
スマホVR表示用Webサーバを起動
Jetson Nano上にWebサーバを起動します。
まずはとりあえず動かしてみましょう。
端末を起動してそれぞれSSHでJetson Nano Mouseにログインしておきます。
(先程までインストール作業をしていた端末でそのまま作業してもOKです)
ログイン後、以下のコマンドを実行してROSの設定を読み込んでおきます。
cd ~/catkin_ws catkin source
次に
roslaunch jnmouse_ros_examples teleop_vr.launch
と実行します。
このコマンドを実行するとWebサーバが起動し、スマホからの通信を受け付けるようになります。以下のようなログが表示されます。
スマホのWebブラウザからアクセス
この状態で http://jetson-4-3.local:8085/jnmouse_ros_examples/ にアクセスします。
mDNSがうまく機能していない場合はIPアドレスを直接入力する必要があります。その場合は例えば http://192.168.100.4:8085/jnmouse_ros_examples/ などのようになります。
うまくアクセスできれば以下の写真のようにロボットの目の前にあるものがスマホに表示されるはずです。
このときにカメラのズレがあるとVRゴーグルを覗いたときに立体視ができない場合もあるかもしれません。このときはスマホに取り付けたVRゴーグルの位置や向きを少し調整してみてください。
2つのカメラの位置関係や調整については別の記事で紹介予定です。
安全確認とロボットの操作
ここまでできたらモータのハードウェアスイッチをオンにします。動かす前に十分な実験スペースを確保できているか再度よく確認してください。
スイッチの先が外側(基板上スイッチ付近にONと書いてある方)に向いていたらモータのスイッチはオンです。
モータのハードウェアスイッチをオンにした状態で画面下にあるボタンをクリックするとJetson Nano Mouseを動かすことができます。
うまく行かなかったときの対処方法や調整方法
ボタン操作ができない、映像を受信できない
必要なROSのノードが全部起動できる前にブラウザからアクセスするとボタン操作ができなかったり、カメラ映像が受信できなかったりします。
以下の画像のように端末上に「Client connected」と表示されているかどうか確認してみてください。
映像が左右に離れてしまって見にくい
今回はiPhoneで試しましたが、より画面が大きい端末で操作する場合、映像が離れてしまって見にくくなる場合があります。
その場合はwww/css/style.css
を編集してみてください。
.camera_image{ display: inline-block; /* 左右映像の幅調整 */ max-width: 50%; height: 100%; object-fit: cover; }
この値を小さくすれば画面中央に画像を寄せることができますし、50%にすれば画面いっぱいに広げることができます。
映像が全画面表示にならない
映像が全画面表示にならない場合は、以下の手順で全画面表示にすることができます。
- 本体を縦にしてアドレスバーを上にスワイプ
- 本体を横にする
使用するROSサンプルの説明
今回VR用に用いたROSサンプルを少し説明します。
カメラ映像の受信+ロボットへの速度指令の送信ができるWebページをJetson Nanoから配信するようになっています。
teleop_vr.launch
を読むと全体の構成が見えてくると思いますので、このlaunchファイルについて少し紹介します。
<?xml version="1.0"?> <launch> <arg name="width" default="320" /> <arg name="height" default="180" /> <!-- 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" /> <!-- HTTP web server --> <include file="$(find roswww)/launch/roswww.launch" /> <!-- rosbridge server --> <include file="$(find rosbridge_server)/launch/rosbridge_websocket.launch" /> <!-- stream camera image --> <node pkg="web_video_server" type="web_video_server" name="web_video_server" /> <include file="$(find jetson_nano_csi_cam)/launch/jetson_dual_csi_cam.launch"> <param name="width" value="$(arg width)" /> <param name="height" value="$(arg height)" /> </include> <node name="image_republish_l" pkg="image_transport" type="republish" args="raw compressed"> <remap from="in" to="/csi_cam_0/image_raw" /> <remap from="out" to="/csi_cam_0/image_raw" /> </node> <node name="image_republish_r" pkg="image_transport" type="republish" args="raw compressed"> <remap from="in" to="/csi_cam_1/image_raw" /> <remap from="out" to="/csi_cam_1/image_raw" /> </node> </launch>
以下の部分でJetson Nano Mouseのモータやブザー、LEDを操作するためのROSノードを起動しています。
<!-- 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" />
以下の部分ではHTTPアクセスできるWebサーバを起動しています。
jnmouse_ros_examples/www
にあるindex.html等のリソースにアクセスできるようになります。
<!-- HTTP web server --> <include file="$(find roswww)/launch/roswww.launch" />
以下の部分ではrosbridgeサーバを起動しています。WebブラウザからWebSocketでROSのトピックをやりとりするために用います。
<!-- rosbridge server --> <include file="$(find rosbridge_server)/launch/rosbridge_websocket.launch" />
以下の部分でJetson Nano MouseのCSIカメラからの映像を取得し、Webブラウザからアクセスできる形で配信しています。
<!-- stream camera image --> <node pkg="web_video_server" type="web_video_server" name="web_video_server" /> <include file="$(find jetson_nano_csi_cam)/launch/jetson_dual_csi_cam.launch"> <param name="width" value="$(arg width)" /> <param name="height" value="$(arg height)" /> </include> <node name="image_republish_l" pkg="image_transport" type="republish" args="raw compressed"> <remap from="in" to="/csi_cam_0/image_raw" /> <remap from="out" to="/csi_cam_0/image_raw" /> </node> <node name="image_republish_r" pkg="image_transport" type="republish" args="raw compressed"> <remap from="in" to="/csi_cam_1/image_raw" /> <remap from="out" to="/csi_cam_1/image_raw" /> </node>
まとめ
Jetson Nano Mouseに搭載された2つのカメラを使ったスマホVRのアプリケーション例を紹介しました。
今回の例ではロボットの操作は画面上のボタンから行いましたが、スマホのIMUを利用した操作も可能になるはずです。
wwwフォルダの中にあるJavaScriptのファイル等を改造する必要がありますが、rosbridgeやWebサーバとの通信をngrok等のサービスを利用してTLSに対応させることが必要そうです。
次回はライントレースを予定しています。
ぜひご購入をご検討ください!
(好評をいただき、2021年4月現在、予約注文状態になっております。)