レバノン13日共同

ずっとサバイバル。

Yahoo! Hack Day 2017 に参加しました。

12月9日〜10日の2日間、秋葉原のUDXで行われたYahoo主催のハッカソンに参加してきました。

hackday.jp

ハッカソン概要 - Yahoo! JAPAN Hack Day 10th Anniv.

土曜日の昼12時に開発開始し、翌日昼12時に開発終了するというガチ24hのハッカソン。
しかもYahoo主催で10周年だから人も規模もデカイことデカイこと。

でも、HackDayはテーマ自由なのでみんな全力で遊べる。

まさに大人の(金と技術力とボケ・ツッコミ力を掛けた)文化祭という感じでした。

チームについて

メンバー構成は男性が3人、女性が3人という、こんなハッカソン見たことないという内訳。わーい。

作品について

クラッピー(パチパチトールくん)をふんだんに使ったロボットです。
ロボットとクラッピーと人間の3者でダルマさんが転んだや鬼ごっこをできる一人遊びソリューションを作りました。

f:id:uzuki_aoba:20171212034853p:plain

コンセプト等全体の説明は発表スライドをどうぞ。(Kyuyouさん ありがとうございます。)

f:id:uzuki_aoba:20171212125025p:plain

Yahoo!HackDay_onepark_20171210.pdf - Google ドライブ

ハードウェア周りの構成図

f:id:uzuki_aoba:20181212122409p:plain

  • タミヤの カムプログラムロボット工作セット : 脚と土台(物理)
  • ESP32 + モータードライバ + NeoPixel : BLEでコマンド受け取ってカムプログラムロボットのモーターや飾りを制御
  • iPhone X : 画像認識, BLEでESP32と接続してコマンド送信, Google Home miniから命令受け取り
  • Google Home mini + node-red : 「ダルマさんが転んだ」を音声認識して命令

ロボット周り

ロボットのベースはタミヤの カムプログラムロボット工作セットです。

カムプログラムロボットにはユニバーサルプレートを設置する為のスペースとパーツが付属していて、マイコン等が簡単に設置できるようになっています。

メインのマイコンとしては、スイッチサイエンスさんの ESPr Developer 32 を使いました。

www.switch-science.com

ESP32でBLE動かすところは実際にやった事無かったので、この辺り見て把握しました。

ESP32をBLE通信のPeripheralとして使う

今回、タミヤのカムプログラムロボットを使ったわけですが、モーターが普通のDCモーターなのでPWM制御が必要。

と言うことで、秋月で売ってた TB6612のモータードライバモジュール を買ってきて事前に制御できるか確認したんですが、

早速傷物にしてしまいましたが、

こんな感じで制御までは事前に確認できました。

あとは、BLEのGATT Profileをザクっと設計して、実際のESP32の制御と、カムプログラムロボット周りのハードウェアの物理的な改造(頭にクラッピー乗っけたり、NeoPixel乗っけたり)はM.Y氏にお願いしました。

丸投げ!!

f:id:uzuki_aoba:20171211233017p:plain

夜中の3、4時くらいにやっとiOSアプリのBLE制御、ESP32、カムプログラムロボットの疎通が取れて終わりが見えた(かのように思えた)頃の我々の席の様子。

M.Y氏の霊圧がそろそろ消えそう。。。

iOSアプリ周り

iOS上で画像認識が動作している感じはこんなの。

f:id:uzuki_aoba:20171211221409p:plain

やっている事自体はシンプルで、クラッピーの画像をかき集めて、ラベル付けした教師データをつくって、みんな大好き TinyYOLO で学習させて、CoreMLに突っ込んだ感じ。

pjreddie.com

CoreML(VNCoreMLRequest) から認識した結果は、ざっくり言うと 認識したクラスのIndex確率認識した物体の範囲(CGRect) で受け取れる。
なので、この辺りを参考にしてCGRectの組み込み関数で、CGRectの重なり具合を見ていって、擬似的に物体追尾ができるようにした。

CGRectのメソッド色々メモ 比較編(iOS SDK) | ふぁのれこそは半角カタカナで

前後のフレームでの認識結果を比較していき、移動量が閾値を超えたら「動いた」と判断して、そちらの方向に移動する。
そこまで作り込む時間無かったので、動いたクラッピーの居る位置を 右側 or 左側 しか判定してないけど、実際に動かしたら結構それっぽく動いたのでOK。

画像認識まわりの話はこっちに書きました。

AIQ株式会社

でも、今回はiOSアプリ側に 画像認識+同一物体認識+移動量判定、BLE制御、WebSocket制御 って、やるべきテーマがたくさんあったので、結構しんどかった。。。

余談ですが、 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シャツとか、あっという間に結構たくさんアイテム作ってくれて大変賑やかになりました。
( 色々あったのに、後半色々出しきってて写真撮るの忘れてました。。。ごめんなさい。。。)

成果発表

ステージ発表での様子はこちら。

www.youtube.com

我々のチームは49:50あたりから。

ステージ発表では残念ながらデモが上手くいかず。

原因としては、ESP32に使っていた電源&USBケーブルが若干不安定だったのと、ステージのライティング的に画像認識的には最悪のコンディションだったからだと思われ。

また、作品展示中もそうだったのですが、ずっと動作させ続けているとESP32が結構発熱して、 LED等ステータス的には起動しているはずなのにBLEのAdvertisementが全く吹いていないという辛い状況が発生。
もしかしたらサーボ制御とか諸々はもう一個マイコン追加してそっちで制御した方が良かったかも。

発表後は自分たちの開発スペースに戻って、他の組の発表の様子をモニターで見ながら、作品展示を行いました。
この時間は一般開放されるので、参加者ではない普通のお客さんもチラホラ。

ロボットの方も、不安定な部分をhotfixして、 鬼ごっこするだけのモードに組み直したらあとは絶好調だった!

https://twitter.com/Carnival1022/status/939762731388829702

会場の様子、その他

土曜日に行われたステージの下見の様子。
f:id:uzuki_aoba:20171211232039p:plain

それにしてもデカイ。

大量のレッドブル f:id:uzuki_aoba:20171211232334j:plain

他にも、透明なミルクティーなど、差し入れたくさーん。

記念グッズで初音ミクコラボも。ちゃんともらったよー

開発中の様子がフリック!ニュースさんにウォッチされてました!
blog.sideriver.com

テクノロジーの無駄遣い感がすごいですが、昨夜の時点で、ちゃんとクラッピーを画像認識してました。

アザマス!最高の褒め言葉です!

発表会の様子などのレポートはこちら。

blog.sideriver.com

成果物について

ちょっとGithubにまとめてから、ソースコード公開します。

追記しました。(2017/12/12)

念のためクラッピーについて

散々クラッピーって書いてますけど、使ったのはパチパチトールくんで、クラッピーはそのオリジナルです。
詳しいことはこっちをぜひ見て〜

どうして「パチパチクラッピー」は「100円」で販売されることになったのか – バイバイワールドブログ

byebyeworld.theshop.jp