Mashup Awards 2017 2nd Battle で AR りんごひろいや課長を作って敗退してきた

Mashup Awards 2017 で下記の2作品を作っていた。

- [生産管理部業務効率課 進捗課長](https://hacklog.jp/works/50565)
- [ARりんごひろい for pepper](https://hacklog.jp/works/52143)

どちらも幸い 2nd に勝ち進むことができたけど、どちらも 2nd で負けてしまった。
これは、普段の業務で一切触らない Pepper, Unity, Alexa などの知見と MA の思い出が、昨日始めたゼルダの追加パックに上書きされる前に、カッシーワの古の詩レベルのものは残そうと書き殴ったものである。
なお AR りんごひろいの話がメイン。

## ARりんごひろい

### 概要

- Pepper に VR マーカーを貼り付けて、そのマーカー上に箱を表示させる。
- Pepper を左右キーで操作し、その箱の中にりんごをうまく落とせたら得点。
- うっかり毛虫を拾ってしまったら Pepper が暴れだす。暴れてる間は操作不能＆ポイントが入らない。 Pepper の頭を触れば復帰できる。
- 残り時間が18秒になると巨大なりんごが落ちてくる。 Pepper を画面上の赤丸まで移動させて、手の甲のセンサーを触ると、りんごを拾う準備完了。巨大なりんごが所定の場所まで落ちる前に、準備が完了していれば5ptが手に入る。
- タイトル画面で2を押すと stage 2 モードになる
- stage 2 では pepper の前に表示してる箱に、UFOとブラックな背景が追加される（実は pepper と一緒に背景も動いてる)
- stage 2 ではりんごや毛虫のアセットが変更され、カプセルに入っている見た目になる
- stage 2 では 18 秒経過した時に巨大な毛虫が出現する。画面に表示された早口言葉の発射コードを alexa に向かって正確に話すことでミサイルが発射され、毛虫を退治できる。退治できたら 5pt

### Pepper と Unity

- Pepper と Unity は UDP で相互に通信している
    - Unity からは左右の移動やりんごをとった・毛虫をとった等の情報を送信
    - Pepper からは頭を触られた・手を触られた等の情報を送信
- UDP で送るコマンドを省略しすぎてよく分からない
    - `k` とか `a` とか `0` とか一文字送るだけで pepper が動く。よく分からない

### Pepper

- python ボックスで UDP の送受信コードを書いて動かすまでが若干手探りだったけど、あとは UDP で飛んできた情報を元に ALMotion の moveTo とか ALTextToSpeach の say なんかを呼び出すだけ
- say はこんな感じで非同期に呼び出さないとそこでコードが止まるので注意→ `qi.async(tts.say, "うわーけむしー")` 
- [Pepper を直接触ってポーズを付けられる](https://qiita.com/Atelier-Akihabara/items/7847aa3fb10069e0f2aa#pepper%E3%81%AB%E3%82%88%E3%82%8B%E3%83%9D%E3%83%BC%E3%82%BA%E4%BD%9C%E6%88%90) のを知ったときは革命だった
- 本格的な pepper アプリを作るなら、ポージングは GUI でやってロジックは全部 Python ボックスで直接書いちゃう方が良さそう

### Unity

（俺のコードが）しんどい

- Vuforia 使ったマーカー有りの AR はめっちゃ簡単。うちの子用にアンパンマン召喚するやつ作りたい。
- Pepper 前の箱は Pepper に合わせて動かなきゃならないが、りんごや毛虫は Pepper と一緒に動いちゃいけない　というのをどう実現すればいいのかで詰まる
    - 結論、りんごや毛虫の上下左右(x,y)は **カメラの位置と相対** で動いて、前後(z)は **pepper の位置と相対** で動かすということをした。
        - 奥行きはPepperと相対にしないと、Pepperを左右に移動させまくるとだんだん前後に移動してしまうので、りんごが箱に入らなくなってしまう
- 普通なら GameScene とか分けてタイトル、リザルトなんかを分けるんだろうけど、 GameScene 切替時に Vuforia のカメラがロードし直しになるのでやめた。（タイトル画面の時点で Pepper の位置を調整したかったので）
- Unity も C# もよく分からんけどノリで書いた
    - 結果ほとんどが Manager.cs に集約された :poop: 
    - この程度のゲームを簡単に作れるのは事実だけど、保守性高いコードにするのはめっちゃ難易度高そうな気がした。少なくとも俺はこのりんごひろいゲームを保守できる自信がない

### Alexa

2nd ステージで追加した巨大毛虫の退治に使う。

- 12/5: Alexa が届く。その日のうちにスキルを作ってみて「これは使える」となる
- 12/7: Alexa に早口言葉を言うとミサイル発射するの面白くね？　と思いつく
- 12/9: スキルを作成。動いた

と急ピッチな割に本番でデモが成功したので、 MA 2017 でもっともアドレナリンが出た実装だったように思う。
ポイント↓

- Pepper へ UDP 飛ばすのが手元マシンからしかできない
    - Alexa が発火した Lambda で手元マシンに立てたサーバを叩くことにした
        - 手元マシンのサーバが、 Pepper へ UDP 飛ばす
    - 手元マシンのサーバを叩くのに [ngrok](https://ngrok.com/) を使った。課金してホスト固定した。解約のリマインドを Alexa に登録した
- [Amazon.com のアカウント問題](https://dev.classmethod.jp/voice-assistant/solution-of-a-problem-amazon-com-account-conflict/) が一番時間食った。 re:build でも話題になってたけど、このアカウントの仕組み複雑すぎやしないか。自分は amazon.com のメアドを変えて対処したが、何故か AWS のメアドまで変わってしまった。なんでや

### アナログ

- 最初はマーカーをタブレットに映してたけど、小さいと 1,800 くらいの安物 web カメラでは認識できなかったので、ダンボールでマーカーを物理的に大きくした。
- 三脚とカメラを固定してたやつは借り物（ありがとうございます）

## 課長

りんごひろいで得た pepper の知見を活かして作ったので、実は目新しいことをしていない。

### 概要

- 会社の人が寝てたり背伸びしたりめっちゃ捗ってたりしたら、そばによっていって気遣ってくれる Pepper
- 雑談ついでに進捗を聞いて回り、一番進捗良くなかった人をフォローするよう促してくれる
- 隣の人にコーヒー買ったりできる

### Pepper

- ハッカソンで勝った時のコードを全部捨てた。正解だった
    - ハッカソンやったあとに AR りんごひろい作って知見を得たのが大きい
- ハッカソンではタブレットの JS で色々やってたけど、作り直した方は python で色々やることにした
    - 多分正解。タイムラインがわかりやすくなったし onInput とかで書かず ALMemory で頑張ってたのでかなりごっちゃごちゃになってたのがスッキリした。
- Pepper に有線で繋いだときと Wi-Fi で繋いだときとでロードアベレージが変わる（もちろん Wi-Fi 時が高い
    - それで動画のフレームレートが変わる……

## その他の知見とか感想とか

- 福井の産業情報センターのコワーキングに pepper が置かれていたのだが、ここが平日21:00までオープンしてて、しかも無料なので助かった
    - とはいえ 20:00 ごろまでに仕事終えないと作業できないんで結構キツくて、頑張った感がいつもよりあった
- 実はプレゼンバトルで 2nd いったのは初めてだったので嬉しかった
    - ハッカソンで勝つかテーマ賞もらうかって感じでしか無かったので。
- テーマ賞・企業賞を狙いにいかないやつを個人で作ったのも初めてだった
    - 個人で作るなら狙ったほうが良いかもしれないと思った :sunglasses: 
- 2nd 当日、セットアップとかめっちゃ助けてもらった。 Pepper 使った作品の準備一人でやるのはキッツイなーと思った
- 行きも帰りも高速バスだったので旅費はだいぶ節約できた :muscle: 
- ~~ネコになりたいと思った。アレはそのうち非合法になるだろう~~
- **楽しかった！**