こちらの記事について、内容・翻訳・視点・長さなど、皆様のご意見をお送りください。今後の記事製作の参考にしたいと思います。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
こちらの記事の感想をお聞かせください。
チーム: Upside Down Pie
概要
Android 端末をリモコンとして Raspberry Pi と通信し、Raspberry Pi から GPIO を通じてキャタピラ付き小型自走装置(車)を制御する。自走装置にはカメラ・ブザーなどの入出力装置を搭載し、周囲の環境を把握したり警笛を鳴らしたりする。
開発背景
・小型車をスマホから操作して動かしたい
遠隔で小型車を操作し、目的地まで移動させたい。例えば、学校の授業中に隣の教室の友達に秘密の手紙をこっそり届けてみる。この発想から、私たちはこの遠隔操作走行機の開発を始めた。車が遠隔地から簡単に操作でき、かつ障害物を避けながら遠くの場所まで自走できる機能を実現。スマホで操作できればより手軽に遊べると思い、遠隔操作用の Andorid アプリを設計した。遠隔操作によって、日常の中にちょっとした冒険心や驚きをもたらす。
・車からの視点が見たい
操作する車の視点で見てみたいという思いで、カメラを接続した。この走行機に搭載されたカメラは、リアルタイムで映像をスマホに送信し、操作者に普段感じられない視点を提供する。これにより操作者は車からの視点を楽しむことができる。この低い視点からの風景は新鮮であり、操作者をしてミニカーに乗っているかのように体感させ、楽しみを与える。また車を視認できない場所でも操作できるため、探検の幅が広がる。
・安全性を確保するための警笛機能
遠隔操作中に車に接近する人間や小動物に危険を知らせたり、暗がりや物陰などに隠れてしまった車を発見したりするために、走行機に警笛機能を搭載する。警笛を鳴らすことで周囲に注意を促して、いたずらや事故により破壊されることを防ぐ。また室内での利用を見込んで、GPS を利用できない場合でも車の位置を判断できるようになる。これにより、安心して探検を続けることができる。
機能
Android 上で実装したリモコンアプリを通じて装置を制御する。具体的には、進行方向と速度の制御、ならびに警笛の制御を実施する。また、車載カメラの映像を取得し、リモコンアプリ上で映し出す。
* 遠隔操作 -- Android 端末により遠隔操作できる。
* カメラ映像 -- カメラから得た情報により、車周辺の状況を操作者が把握できる。車視点の映像がリアルタイムに見えるため、車自体が見えない時も遠隔操作ができる。
* 警笛 -- 警笛を発し、能動的に環境へ働きかけることで、事故防止に役立てることができる。
設計と実装
図に、RaspCarの構成要素の関係を示す。
システムは、Android 上で動作するコントローラ アプリケーションと、Raspberry Pi 上で動作しコントローラの指示を受け付けるサーバ、およびモータやブザーなどの周辺機器を制御するバックエンド プログラムとで構成される。Android アプリケーションは Kotlin 言語、ほかは Rust 言語で記述し、Android アプリと自走装置の制御サーバとは HTTP を使って通信する。
Android アプリケーションは、次の図のように、起動されると車載カメラの映像を表示する領域、前後左右への移動と警笛に使う入力ボタン、速度調整つまみとを表示する。コントローラの操作によって、Raspberry Pi 上の HTTP サーバへ REST API に基づく POST 要求を送る。移動ボタンを押した時は、速度と移動方向とを表す値を、また離したときは速度 0 を表す値を、共に /api/direction へ送る。速度調整つまみを操作した時、速度を表す値を /api/speed へ送る。警笛ボタンを押した時は警笛を鳴らすフラグを、離したときは警笛を止めるフラグを共に /api/horn へ送る。いずれの場合も、含まれる値は JSON で表現される。自走装置からの映像の取得には REST API を使用しないが、同様に HTTP サーバから配信されるため、それをアプリ内の WebView で表示する。通信状況によって映像取得エラーが起こりうるので、再読み込み用のボタンを置いて映像を適宜再取得できるようにしている。
自走装置の制御サーバは、HTTP による通信を受け付ける。先述の通り REST API を提供しており、パスとそれに含まれる JSON データによって制御内容を判定し、適切な制御信号を GPIO 経由で周辺機器へ送信する。また制御サーバと並列で映像配信サーバが動いている。これは Raspberry Pi へ接続された USB カメラの映像を処理して、配信するサーバである。カメラの検出から配信映像の生成までの過程で OpenCV を利用している。GPIO よりもレイヤの高い USB 接続を扱う点、及び映像を常時配信するという点で REST API による他の通信と馴染まないと判断し、別サーバにより処理している。次の図は、curlコマンドでJSONデータを送信している様子を示す。
周辺機器は、その種類ごとに制御プログラムを記述して、制御サーバから並列可能なモジュールとして読み込む方法をとっている。これにより、複数の周辺機器を並列に操作可能にしている。motion モジュールでは、左右の履帯に 1 つずつ接続するモータの回転を制御する。このモータはパルス幅変調(PWM)によって回転速度を調節可能であり、それを利用して 5 段階の速度調節を提供する。また左右のモータを異なる速度で回転させることにより、左右への方向転換を実現する。speaker モジュールはブザーの制御を司る。鳴動開始指示を受けたらブザーの入力線をアクティブにする。鳴動停止指示を受けたらブザーの入力線を非アクティブにする。
演示
以下に、我々の作品の完成図と演示動画を示す。
(動画埋め込みが表示されない場合、下記URLより参照されたい。)
https://youtube.com/shorts/IYoztCev0bE?feature=share
演示では、Raspberry Pi 上で作成した Wi-Fi ホットスポットに Android をつないで、Raspberry Pi の固定 IP アドレスに通信を飛ばした。車載要素の重量バランスの検討不足で走行が不安定だったため、最も重い携帯電池を手で持ち上げて車に随行している。
今後の展望
モータ制御部分や車両のバランスを改善して、より安定的な前進・後進移動や滑らかな回転を実現したい。ブザーの入力電圧を調整して、多彩な音階による表現力の高いメロディホーンを実現したい。カメラに付属するマイクロフォンを活かせていないので、音声を取得して自走装置周辺の臨場感をより強く感じられるようにしたい。Rust 初心者ばかりだったので、より学習を深めて洗練されたモジュールや並行性の記述を行いたい。
コメント