Yahoo! Hack Day 2017 に参加しました。
12月9日〜10日の2日間、秋葉原のUDXで行われたYahoo主催のハッカソンに参加してきました。
ハッカソン概要 - Yahoo! JAPAN Hack Day 10th Anniv.
土曜日の昼12時に開発開始し、翌日昼12時に開発終了するというガチ24hのハッカソン。
しかもYahoo主催で10周年だから人も規模もデカイことデカイこと。
でも、HackDayはテーマ自由なのでみんな全力で遊べる。
まさに大人の(金と技術力とボケ・ツッコミ力を掛けた)文化祭という感じでした。
チームについて
メンバー構成は男性が3人、女性が3人という、こんなハッカソン見たことないという内訳。わーい。
作品について
クラッピー(パチパチトールくん)をふんだんに使ったロボットです。
ロボットとクラッピーと人間の3者でダルマさんが転んだや鬼ごっこをできる一人遊びソリューションを作りました。
コンセプト等全体の説明は発表スライドをどうぞ。(Kyuyouさん ありがとうございます。)
Yahoo!HackDay_onepark_20171210.pdf - Google ドライブ
ハードウェア周りの構成図
- タミヤの カムプログラムロボット工作セット : 脚と土台(物理)
- ESP32 + モータードライバ + NeoPixel : BLEでコマンド受け取ってカムプログラムロボットのモーターや飾りを制御
- iPhone X : 画像認識, BLEでESP32と接続してコマンド送信, Google Home miniから命令受け取り
- Google Home mini + node-red : 「ダルマさんが転んだ」を音声認識して命令
ロボット周り
ロボットのベースはタミヤの カムプログラムロボット工作セットです。
カムプログラムロボットにはユニバーサルプレートを設置する為のスペースとパーツが付属していて、マイコン等が簡単に設置できるようになっています。
メインのマイコンとしては、スイッチサイエンスさんの ESPr Developer 32 を使いました。
ESP32でBLE動かすところは実際にやった事無かったので、この辺り見て把握しました。
今回、タミヤのカムプログラムロボットを使ったわけですが、モーターが普通のDCモーターなのでPWM制御が必要。
と言うことで、秋月で売ってた TB6612のモータードライバモジュール を買ってきて事前に制御できるか確認したんですが、
ピッチ変換的な事をした pic.twitter.com/b5oL7c4aqy
— ウズキアオバ (@uzuki_aoba) 2017年12月7日
早速傷物にしてしまいましたが、
TB6612の使い方を把握した pic.twitter.com/MafZElR10g
— ウズキアオバ (@uzuki_aoba) 2017年12月7日
こんな感じで制御までは事前に確認できました。
あとは、BLEのGATT Profileをザクっと設計して、実際のESP32の制御と、カムプログラムロボット周りのハードウェアの物理的な改造(頭にクラッピー乗っけたり、NeoPixel乗っけたり)はM.Y氏にお願いしました。
丸投げ!!
夜中の3、4時くらいにやっとiOSアプリのBLE制御、ESP32、カムプログラムロボットの疎通が取れて終わりが見えた(かのように思えた)頃の我々の席の様子。
M.Y氏の霊圧がそろそろ消えそう。。。
iOSアプリ周り
iOS上で画像認識が動作している感じはこんなの。
やっている事自体はシンプルで、クラッピーの画像をかき集めて、ラベル付けした教師データをつくって、みんな大好き TinyYOLO で学習させて、CoreMLに突っ込んだ感じ。
CoreML(VNCoreMLRequest) から認識した結果は、ざっくり言うと 認識したクラスのIndex
、 確率
、 認識した物体の範囲(CGRect)
で受け取れる。
なので、この辺りを参考にしてCGRectの組み込み関数で、CGRectの重なり具合を見ていって、擬似的に物体追尾ができるようにした。
CGRectのメソッド色々メモ 比較編(iOS SDK) | ふぁのれこそは半角カタカナで
前後のフレームでの認識結果を比較していき、移動量が閾値を超えたら「動いた」と判断して、そちらの方向に移動する。
そこまで作り込む時間無かったので、動いたクラッピーの居る位置を 右側 or 左側 しか判定してないけど、実際に動かしたら結構それっぽく動いたのでOK。
画像認識まわりの話はこっちに書きました。
でも、今回はiOSアプリ側に 画像認識+同一物体認識+移動量判定、BLE制御、WebSocket制御 って、やるべきテーマがたくさんあったので、結構しんどかった。。。
今のところチームのクリティカルパスなので、あと7時間で追い込みがんばるぞい pic.twitter.com/nlvm3GkgFQ
— ウズキアオバ (@uzuki_aoba) 2017年12月9日
余談ですが、 Vision framework も、CoreBluetooth も、何かと UIViewController
上でないと動かない(動かしずらい)部分が多いのでちゃんと構造化しようとすると面倒ですが、そこはSwiftのメリットを生かして、 extension
でうまいこと用途別に swiftファイルを分ける事でなんとか可読性を維持しました。
ハッカソンの場合は きれいに実装できるか よりも 短時間にローコストで如何に確実に動かすか が大事だと思って居るので、コンテキスト等の問題でOSの縛りが強いこの辺りの機能の実装で可読性を保持するには、別クラス化せずにファイル単位に別けられるので、ほんと役に立ちました。
音声認識周り
Google Home mini + Actions on Google + node-red制御 はK.T氏が無双して作って下さった感じ。
キャーカッコイー
一番早く出来上がったのですが、IBM Bluemix上の node-red の WebSocketエンドポイントに socket.io-client for swfit で接続しようとしたら Invalid HTTP upgrade
エラーが出て接続できす。
ATSで全部許可したけどだめ。
node-redでエンドポイントのプロトコルに ws
しか準備できなくて、 wss
で接続できなかったので、そのせいのような気がするけど、これ悩んでる時点で すでに開発終了まで4時間という微妙なライン だったので、Google Homeの使用は諦めることに。
緊急手段としてESP32にマニュアル操作用のボタンを追加して「ダルマさんが転んだ」って言ったらボタン押して認識開始させることにしました。
無念&K.T氏ほんとすみません。。。。
発表準備まわり
エンジニアのみでハッカソンに行くと、結構な感じでおろそかになるorやるつもりはあるけど時間無くなってグダグダになるのが最終発表のプレゼン準備や、プレゼンで使用する小道具類、衣装の準備な訳ですが、今回はチームの女性陣がその辺りを超絶リードしてくださったので、ウルトラ安心できました。
発表資料や運営との調整、そしてステージ発表でのメインプレゼンターは全部 K.Kさんがやってくれました。
一応私リーダーだったのですが、開発サイドで精一杯だったので、そんな私のダメさを察して、空気読んで全部いい感じに準備して頂いて超感謝です!
ロボットだけだと発表が地味になるのは分かってたので、発表用の衣装・小物の制作や、食料調達・買い出しなどのロジスティック周りは L.Sさん、M.Kさんがいい感じにしてくださいました!
クラッピーの被り物とか、クラッピーTシャツとか、あっという間に結構たくさんアイテム作ってくれて大変賑やかになりました。
( 色々あったのに、後半色々出しきってて写真撮るの忘れてました。。。ごめんなさい。。。)
成果発表
ステージ発表での様子はこちら。
我々のチームは49:50あたりから。
ステージ発表では残念ながらデモが上手くいかず。
原因としては、ESP32に使っていた電源&USBケーブルが若干不安定だったのと、ステージのライティング的に画像認識的には最悪のコンディションだったからだと思われ。
また、作品展示中もそうだったのですが、ずっと動作させ続けているとESP32が結構発熱して、 LED等ステータス的には起動しているはずなのにBLEのAdvertisementが全く吹いていないという辛い状況が発生。
もしかしたらサーボ制御とか諸々はもう一個マイコン追加してそっちで制御した方が良かったかも。
発表後は自分たちの開発スペースに戻って、他の組の発表の様子をモニターで見ながら、作品展示を行いました。
この時間は一般開放されるので、参加者ではない普通のお客さんもチラホラ。
ロボットの方も、不安定な部分をhotfixして、 鬼ごっこするだけのモードに組み直したらあとは絶好調だった!
https://twitter.com/Carnival1022/status/939762731388829702
会場の様子、その他
土曜日に行われたステージの下見の様子。
それにしてもデカイ。
大量のレッドブル
他にも、透明なミルクティーなど、差し入れたくさーん。
記念グッズで初音ミクコラボも。ちゃんともらったよー
Hack Day&初音ミク、10周年限定コラボグッズは、本日も会場でプレゼントしてます!お早めにどうぞ( #iXima ミクさん)https://t.co/EjewCm5tqp#初音ミク #hackdayjp#イベント #秋葉原 pic.twitter.com/BBCipyU3uj
— Hack Day / ヤフー株式会社(12/15-16イベント@秋葉原) (@hackdayjp) 2017年12月10日
開発中の様子がフリック!ニュースさんにウォッチされてました!
blog.sideriver.com
テクノロジーの無駄遣い感がすごいですが、昨夜の時点で、ちゃんとクラッピーを画像認識してました。
アザマス!最高の褒め言葉です!
発表会の様子などのレポートはこちら。
成果物について
ちょっとGithubにまとめてから、ソースコード公開します。
追記しました。(2017/12/12)
- ESP32側(Arduino) : GitHub - TakuroFukamizu/esp32-ble-with-tb6612
- iOS側(Swift) : GitHub - TakuroFukamizu/yhd2017-ai-ios
念のためクラッピーについて
散々クラッピーって書いてますけど、使ったのはパチパチトールくんで、クラッピーはそのオリジナルです。
詳しいことはこっちをぜひ見て〜