2019年5月17日金曜日

RAPIRO完全無線化 ー完結編(ソフトウエア)ー

大分時間が空いてしまいました。他の事で時間が取られてしまって書いている時間が取れませんでした。
さて、RAPIROの完全無線化についてハードウエアの方は完了したので、ソフトウエアの設定を行いたいと思います。と言っても、各パーツについてはすでに動作確認が終わっているので、それらを統合して簡単に使えるようにするだけです。

なお、以下の作業はRAPIROに組み込んだRaspberry Pi Zero B+(以下 PiZero)での作業になるので、まずは、sshでログインしてください。

Step1:カメラ画像のストリーミング


カメラ画像のストリーミングについてはこちらに投稿しておきましたが、PiZeroの電源を入れたら自動的にストリーミングを始めるようにサービス化しておきます。

まず、/home/pi/streaming/streaming.shとして以下を作成します。
#! /bin/sh
export LD_LIBRARY_PATH=/usr/local/lib/mjpg-streamer
mjpg_streamer -o "output_http.so -w /usr/local/share/mjpg-streamer/www" -i "input_raspicam.so -fps 5 -x 480 -y 320"
次に、/usr/lib/systemd/system/streaming.serviceとして以下を作成します。
[Unit]
Description=Mjpg-Streamer

[Service]
ExecStart =/home/pi/streaming/streaming.sh
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target
以下のコマンドで作成したサービスをsystemdに登録します。
$ sudo systemctl enable streaming.service

Step2:RAPIROコントローラ(Python)


Bottle + PythonでRAPIROを外部から制御できるようにします。HTTPでコマンドを受け取ると、シリアル通信でRAPIROへコマンドを投げるという簡単な仕組みです。
Python用軽量Webフレームワークとしては他にFlaskもあり、どちらも簡単にREST風アプリが作れますが、私はBottleを利用しています。

Pythonのソース(本体)とindex.html、RAPIROのサーボモータをOFFにする機能をつけたスケッチをGitHubに上げてあるのでそちらを参照してください。詳細はソースを見ていただければすぐにわかると思います。
index.htmlではmjpg_streamerの提供するCSSファイル等をstaticフォルダ経由で利用しているので注意してください。又、python3、bottleについてはインストール済みであるとします。
$ cd ~
$ git clone https://github.com/KeiIchimaru/rapiroctl.git
$ cd rapiroctl
$ ln -s /usr/local/share/mjpg-streamer/www static
スケッチについてはRAPIROへの書き込みを行っておいてください。
あとはサービスとして登録する作業になります。
/usr/lib/systemd/system/rapiroctl.serviceとして以下を作成します。
[Unit]
Description=RAPIRO Controller

[Service]
ExecStart =/home/pi/rapiroctl/rapiroctl.py
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target
以下のコマンドで作成したサービスをsystemdに登録します。
$ sudo systemctl enable rapiroctl.service
以上で、PiZeroのポート80でHTTPリクエストを待ち受けているので、ブラウザでアクセスするとサンプルの画面が表示されます。サンプルではカメラからのストリーミングも表示しているので、RAPIROに搭乗して操縦しているような感覚が得られると思います。(移動すると、画面が左右に大きく揺れるので酔いやすい方はご注意くださいw)

Step3:shutdownスイッチ


PiZeroはRAPIROの頭部に組み込まれているので、shutdownする場合は外部からsshでログインする必要があります。その為にPCを立ち上げるのも面倒なので、ハードウエア編で触れていますが、こちらのサイトを参考にshutdown用タクトスイッチを付けることにしました。利用したGPIOはBCM23(P16:物理ピン番号)とGND(P14)を使い、組み立てる時にタクトスイッチから配線しておきました。

PythonのプログラムはGitHubに上げてあるので、すでにダウンロードしてあるはずですのでサービスとして登録するだけです。
/usr/lib/systemd/system/shutdownbuttond.serviceとして以下を作成します。
[Unit]
Description=Shutdown by Button Daemon

[Service]
ExecStart =/home/pi/rapiroctl/shutdownd.py
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target
以下のコマンドで作成したサービスをsystemdに登録します。
$ sudo systemctl enable shutdownbuttond.service

Step4:動かしてみて


以上で、全て完了したので動作確認です。
PiZeroの電源をONにすると、しばらくしてカメラが赤く光って起動が終了したことがわかりますので、その後RAPIRO本体の電源を入れて準備完了です。

ブラウザからPiZeroにアクセスすると下のような画面が出てきます。どう動くかは、各自試してみてくだサイ。ノートパソコンやスマフォからだと画面からはみ出て使いずらいと思いますので、各自自由にカスタマイズして使いやすい画面にして頂ければ幸いです。


rapiroctl.pyそのものはhttpサーバとして動いているだけなので、スマフォアプリを作成するなど応用は色々あると思います。

画面下部の「Play」はaudioフォルダ内の.wavファイルを再生する機能です。アンプが組み込んであるのでRAPIROを喋らせることができます。「Say」は指定されたテキストを音声合成して喋らせようとしたのですが、処理に時間がかかるので現在は使っていません。この辺りのこともそのうち時間ができたら投稿したいと思います。

電源を切るときは、タクトスイッチを長押しするとshutdownプロセスが開始されるので、しばらくしてカメラのランプが消えたら、PiZeroの電源を切って、最後にRAPIRO本体の電源を切ってください。


0 件のコメント:

コメントを投稿

Edisonが故障した一件

 最近またEdisonで遊んでいます。 教育用のデバイスとしてよく出来ているなと思っている Edison ですが、現在3台を所有しています。 最近このうちの1台が調子が悪くなってしましました。具体的にはBeep用のデバイスが壊れたようです。購入時にチェックをしたつもりですが今回久...