おばかIoTアプリ選手権 2016 Summerにエントリーしていたので技術についてのメモです。
結果としては惜しくも予選落選してしまったのですが、2日間のハッカソン的な製作時間の中で、技術的にはいろいろ試せたのと、前向きな反省点があったので記しておきます。
エントリーネタ
私の作品、おばかIoT選手権 2016 Summer「顔 de ドラゴンスレイヤー ~みんなの顔でやっつけろ~」というネタで、本アプリはドラゴンデバイスをFace API 顔認識を通じてみんなの力でやっつけるアプリです。
Raspberry Pi他で構成されたドラゴンデバイスの持つカメラで撮影された写真から顔認識をして、人数が多いほど攻撃回数がUP!大ダメージが狙える!ドラゴンデバイスがダメージを受けてやられる!という内容となっています。
エントリーの時の動画です。ドラゴンデバイスの倒されるデモを含めた動画となっています。
技術的に面白く進められたところ
Node-RED
今回、ドラゴンデバイスの根幹の仕組みにNode-REDを使いました。ドラゴンへのやられっぷりを表現したいし、ダメージ表示を外部デバイスで出したいというのを、いろいろ素早く試したかった。
随所に、MilkcocoaやlittleBits、Wio Nodeを使いました。
ダメージ表示(Wio Node+CreateJS)
digitの部分はこちらはダメージを受けた際にWio NodeのDigital Displayがダメージ表示させる部分。Pin 5,9のところはドラゴンのダメージ時に首を振らせるlittleBitsへの命令部分。
スマホでも実況確認ができるように、CreateJSで実況表示。
ここはWEBカメラの撮影とFace APIへつなぐための別ローカルサーバーへ内部リクエストをかけることで、Node-REDで煩雑になりそうな難しい処理を分担しています。
Face API
AzureのFace APIのNodeJSのコードは以下のとおり。
var express = require('express'); var app = express(); var oxford = require('project-oxford'), client = new oxford.Client(' アクセストークン '); app.set('port', (process.env.PORT || 5000)); app.use(express.static(__dirname + '/public')); app.get('/', function(request, response) { response.send('Hello World!'); }); app.get('/detect', function(request, response) { client.face.detect({ path: 'public/sample.jpg', // capture.jpg キャプチャ先 analyzesAge: true, analyzesGender: true }).then(function (_response) { //console.log('The age is: ' + response[0].attributes.age); //console.log('The gender is: ' + response[0].attributes.gender); console.log(_response) // Node-REDに結果を返す response.send(JSON.stringify(_response)); }); }); app.listen(app.get('port'), function() { console.log('Node app is running on port', app.get('port')); });
ライブラリも揃ってて便利!簡単に情報が取れてダメージ計算できて楽しかったです。
WEBカメラ
地味につらかったのが、WEBカメラが撮影するたびに応答が怪しくなるので、
memorandum USBカメラでキャプチャできなくなったときはUSBreset コマンドでリセット
の記事を参考にシェルを書きました。
capture.sh
#!/bin/sh cd /home/pi/Desktop/obaka_app_2016/webcam ./webcamreset.sh fswebcam -r 1920x1080 /home/pi/Desktop/obaka_app_2016/server/public/capture.jpg
リセット部分のwebcamreset.sh。
#!/bin/sh ID='046d:0825' # Logitech, Webcam C270 MATCHES=$(lsusb | sed -n 's/Bus \([0-9]*\) Device \([0-9]*\): ID '$ID'.*/\/dev\/bus\/usb\/\1\/\2/p') if [ -z ${MATCHES} ]; then echo "No match found" else sudo ./usbreset $MATCHES fi
capture.shをNode-RED側から叩いて撮影は発動させています。このあたりも気軽に作れました。
戦闘開始ボタン(Wio Node)
ドラゴンのしっぽが戦闘開始ボタンだったのですが、ここもWio Nodeのフローで反応を取っています。
Youtubeの動画エディタでエントリー動画
今回はエントリー自体が動画必須ということで、うまく作れるものはないかなということで、Youtubeの動画エディタを試してみました。
当日すぐ把握できるUIでとっつきやすく、BGMについても豊富にそろっていて、かなり助かりました。
前向きな反省点
2日間での制作は存分に製作できたのですが、試行錯誤の結果、ストローアームを緑の和紙でくるんで作ったドラゴン。
どうもにも、ドラゴンつくるのが楽しくなりすぎて、制作物がおばかさよりも、かわいらしさが全面に出てしまって、えらく工数を消費した反省点でした。楽しかったししょうがない。しかし、悔いなし。
倒すにくさが出てしまった!
おわりに
ということで収穫はいろいろありました。まず、様々な技術を試せたのとNode-REDでつなぎあわせて試行錯誤ができたことです。フロントエンドのフィードバックまでつなげられました。
また、センシングしたデータをただ貯めるだけでなく、機械学習のAPIを通して判断してフィードバックを返すという流れを試してみたかったので、そういった仕組みを作ることができ、IoTと機械学習の可能性に自分で感じることができたのも収穫でした。
今後に活かしていこうと思います!