SkyWayとRaspberryPi(以下:ラズパイ)を利用したリモートカメラシステム。
LEGOと連動して遠隔からカメラアームを旋回・上下・首振り操作。
旅行中のペット見守りカメラとして開発。
- WEBアプリを通して外出先から自宅のカメラにアクセス
- WEBアプリを途中退室、ブラウザを急に閉じても再度アクセス可能
- ログイン認証付きWEBアプリで安心・安全
- メッセージ入力により、LEDを点灯、消灯操作
- メッセージ入力により、カメラがあるラズパイ側のプログラムをシャットダウン可能
- WEBアプリを通して、カメラの付いたLEGOアームを操作可能
- LEGOアーム操作は、Pan(旋回)、Pedestal(高さ)、Tilt(上下首振り)の3種
- Webアプリ側(frontend): Nuxt.jsにて構築
- ラズパイ側(backend): Pythonにて構築
- LEGOアーム(カメラアーム): LEGO-EV3にてC言語でコンパイルしたファイルを実行
実行環境
- device:Raspberry Pi 3 Model B
- OS: Raspbian GNU/Linux 9 (stretch)
- python:3.5.3
- camera: USBカメラ ELECOM UCAM-C0220FBBK
- Lチカ:LED、抵抗、ジャンパーコード、ブレッドボード
python3.5はすでにサポート終了しているので、上位バージョンをおすすめします。
USBカメラに関しては、古いものや特殊なものを除いて一般的なUSBカメラであれば問題ないと思います。
Lチカ環境はGPIOの21番ピンを使用。グラウンドとLEDの間には適切な抵抗を入れて下さい。
参考サイト:SkyWay WebRTC Gatewayハンズオン
SkyWayを利用して、カメラ映像をストリーミングする
NTTコミュニケーションズが提供する「ビデオ通話、音声通話をかんたんにアプリに実装できる、
マルチプラットフォームなSDK」
公式ページ
上記公式サイトに沿って設定し、APIKeyを取得する。(無料)
SkyWayが提供するIOT端末用のSkyWayEngine
ラズパイで実行するためgateway_linux_arm
をダウンロードする
ダウンロード v0.3.2
Firebase
以下の理由によりFirebaseを利用する
- Wepアプリのデプロイ(Hosting)
- Webアプリにメールアドレスによるログイン機能の実装(Authentication)
- skyway APIKeyを格納(Firestore)
Webアプリのデプロイ先となる。
ログインに利用したいメールアドレスを追加する
ルール
で読み書き権限を認証ユーザーのみに必ず設定すること
SkyWay APIKeyを格納する。
apis > SkyWay > key
こちらにstring形式で入力
Webアプリからの命令をラズパイを通して、LEGO-EV3に伝えて物理アームを制御する。
LEGOとラズパイは変換パーツを使ってシリアル接続。
LEGO-EV3ポートとUSBのシリアル接続パーツ Console Adapter for EV3
使用したLEGO商品 LEGO EV3
LEGO組み立ては、公式ページを参考にパーツを組み合わせて構築
基本セットモデル組立説明書
- メイン部分: ロボットアーム
- カメラの上下首振り: パピーの一部
- 制御パーツEV3に開発プラットフォームEV3RTを環境構築
- EV3RTでのLEGOモジュール制御用にC言語コンパイル
- ラズパイとシリアル通信開設後に、EV3RTからコンパイルされたプログラムを起動
参考:
TOPPERS EV3RT公式ページ
EV3RT C API Reference
工程が多く複雑なため、プリファードネットワークが勧める、アフレルの教材を参考にする。
pfnet-research/chainer-ev3
アフレル 教材ページ こちらのページの、「学習する」をクリックしてIDとパスワードを登録して(無料)教材をダウンロード。
- アフレルの教材を参考にGoogle ColaboratoryでのEV3実行環境構築を行う
- Colaboratoryのノートブック上で、app.cを、
lego/workspace/app.c
に差し替える - 手順に従い、コンパイルしたファイルをEV3にSDカードで読み込ませて起動する
ラズパイ上で実行する
- gateway_linux_armを任意のディレクトリに移し実行権限を付与する
backend
ディレクトリを移す- gstreamerのインストール
# 映像伝送用アプリケーションのインストール
sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
- 必要モジュールをラズパイにインストール
pip3 install -r requirements.txt
- config.pyを設定
#config.pyにリネーム
mv config_sample.py config.py
# 取得したSkyWayのAPIKEYを入力
API_KEY = "**********"
Nuxt.jsにて構築。
npm run generate
にてコンパイル- 生成された
dist
ディレクトリをfirebaseでdeployする
# install dependencies
$ npm install
# serve with hot reload at localhost:3000
$ npm run dev
# build for production and launch server
$ npm run build
$ npm run start
# generate static project
$ npm run generate
#skywayエンジンであるweb_gatewayを起動
./gatway_linux_arm
#制御プログラムを起動
python3 wabrtc_control.py
- Firebaseにデプロイしたサイトにアクセス
- 設定してメールアドレス、パスワードでログイン
- EstablishでPeer確立(skywayにつなぐ)
- ラズパイ側のPeeIDが表示されるので選択(jetcam)
- Callでラズパイと接続
接続が確立すると、映像が表示される
- Messageに入力するとラズパイ側のコマンドに表示される
- onを入力すると、LEDが点灯する
- offを入力すると、LEDが消灯する
- バルスを入力すると、ラズパイ側のプログラムが終了する
- Stopでskywayから切断する
上記で案内されているv0.3.2
を使用して、クラッシュすることは無くなったが、media connectionを完全に開放できていない疑いが残る。2回目以降新たにmedia connectionを作成しようとすると、400エラーにより作成できない。
そのため、通常flowでの処理ではない実装の検討が必要
本コードでは、media connectionが開放されない事を前提として、通常稼働できるように実装した。
ラズパイでのリモートデバッグのススメ。
GPIO使ってLチカ、gateway_linux_arm実行と環境依存があるので、ラズパイ上でのデバッグ開発が便利です。
jetbrainsでのリモートデバッグ利用法
jetbrains 解説
pip3 install pydevd-pycharm
#webrtc_control.py
# jetBrainsリモートデバッグ用モジュール
import pydevd_pycharm
pydevd_pycharm.settrace('192.168.0.20', port=60000,
stdoutToServer=True, stderrToServer=True)
#IPアドレス,portはリモートデバッグ先の任意の値に変更
#リモートデバッグが不要であればコメントアウトする
- akinko
- [email protected]
- Qiita