3/19, 20 に開催された Android Hackathon に参加してきました。参加者は 2 日間いずれかへの参加を選ぶ形式で、僕が参加してきたのは 3/19 のほう。主催は Android SDK Japan(User Group)、会場は Google さんの東京オフィスでした。というわけで、イベント概要やら、そこでつくったものの報告とか、メモとか、感じたこととかを書いておきます。
ところで、Hackathon というのは、Hack + Marathon の造語らしいですが、平たく言うと、お泊まり無し(そうでない場合もあるかもだけど)の開発合宿みたいなものです。で、今回は、Android Hackathon だったので、みんなで Android アプリ/サービスをつくろうぜ、的なイベントだったということになります。
今回の Hackathon では一週間ほど前に事前ミーティングが開かれており、そこで参加者のチーム分けや Ideathon なるアイデア出しの打ち合わせがおこなわれていました。チーム区分は以下の通り。
- Lifestyle & Travel – 日常生活や旅行先で使える便利系アプリ/サービス
- Multimedia – マルチメディアを駆使(?)するもの
- News & Weather – ニュースとか天気とか。RSSフィード使ってごにょごにょとか。
- Specific Device(Feature) – デバイス固有の機能を使ってごにょごにょ
- Tutorial – テーマは決めず、チュートリアル的になんか作ってみる
僕は Specific Device のチームに参加させていただきました。で、Ideathon でいろいろ討議した結果、「端末によるモーションジェスチャを検知する仕組み(ライブラリ)の開発」&「その仕組みを使ってかめはめ波を撃つ」という壮大な目標にチャレンジすることとなったのでした。
さて、Hackathon 当日の成果ですが.. 結果から言うと、「かめはめ波」の捻出には至りませんでした。まだまだ修行が足りなかったようです。残念。
ただ、以下のような見栄えの、「単純なジェスチャの検知」アプリまでは行き着くことができました。
上の画像は、アプリ起動後、端末を上方向に持ち上げたときの画面表示です。とりあえず、端末を平面方向タテヨコナナメに直線に動かした際の8方向について、なんとなくジェスチャが検知できています。ほんとは、ここからこういったシンプルなジェスチャを組み合わせたジェスチャコマンドを認識させ、かめはめ波を撃って、あと、昇竜拳くらいまで行きたかったのですが、残念ながら力及ばず.. でした。
当日開発されたソースコード一式は、以下の hackathon-jp リポジトリから取得できますので、ご興味のある方、どうぞご覧ください(コミット権限はHackathon参加者に限っているようですので、read-onlyにてご了承ください)。
http://code.google.com/p/hackathon-jp/
さて、以下、今回の Hackathon 参加で自分なりにやってみたことや感じたことをメモしておきます。
今回は、事前準備として OpenIntents の Sensor Simulator を動かしてみたり、OpenIntents の trunk にいつのまにか入っていた SensorGestureDetector の実装を読んでみたり、なんとなくヒントがあるんじゃないかと Firefox の All-in-one Gestures の実装を読んでみたりしてました。
また、「ジェスチャを複合して『かめはめ波』のような複雑なジェスチャを組み立てるより、任意のジェスチャパターンを学習させられるようなトレーニングアプリを作って、ジェスチャパターンを数値化していくのが良いんじゃないか」とも考え、ジェスチャ時の各種センサの値をcsv出力するデモアプリを作ってみたりもしました。そんな折に、チームの方から、「HMM(隠れマルコフモデル)による学習/識別が主流らしい」との情報もあり、ググってみて、なんだか難しい論文に行き着いたりしていました。
ただ、Hackathon 当日は、なんだかんだで時間制限に押され、
- ジェスチャで取得できたcsv値も隠れマルコフモデルとかもよくわからん.. 深みにハマりそう
- やっぱしとりあえずはシンプルなジェスチャを認識させるところを作ろう
- どうも加速度センサの値がオカシイ
- 重力加速度の影響を受けてしまっているみたいだ
- 重力加速度をキャンセルできるように、逆向きの加速度を渡してみよう
- 端末のどちら側が地表側を向いているのかを適切に数値化するのが難しい..
- とりあえず、端末の向きは固定で使うってことにしよう
- 端末のどちら側が地表側を向いているのかを適切に数値化するのが難しい..
- 重力加速度をキャンセルできるように、逆向きの加速度を渡してみよう
- 重力加速度の影響を受けてしまっているみたいだ
- Z軸方向のジェスチャの認識を加えると、認識精度が落ちるみたいだ
- とりあえず、今日のところは X-Y 2方向の平面ジェスチャのみでいこう
- 平面でもイマイチ精度が悪い
- 一定時間(回数)以上、同方向の加速度が取れることをジェスチャ認識の条件にしよう
- センサデータ取得時の速度を変更させるオプションがあるらしい => 最高速度(SENSOR_DELAY_FASTEST)に!
と、まあ、こんな感じに試行錯誤の繰り返しに多くの時間を使ってしまっていたような気がします。最後のプレゼンが終わった後になって、他の参加者の方に「重力加速度のキャンセルにはローパスフィルタ使うといいよ!」って教えてもらったり、既に試行錯誤されていた方のエントリを発見したり、という感じで、なんだかんだで準備不足、力不足を痛感したわけでした..
とはいえ、こういった開発は久しぶりに新鮮でした。「時間制限(のプレッシャー)」と「チームでの開発」があったおかげでしょうか。意見交換したり、コード見せ合ったりしながらも、ひとりで深みにハマる前に、上のような「問題の単純化(「あきらめ」ともいう)」や、「仕様の割り切り」「当座の目標決定」を短いサイクルで繰り返し、一日での成果を出すことに集中する、ということができたような気がします。で、しかも、それが、とても楽しかったわけです。良いですね、こういうの。僕、いわゆる「開発合宿」には参加したことが無いんですが、その楽しさの一端が垣間見えたような気がしました。
そんなこんなで、当日の他のチームのプレゼンや飲み会の部まで含めると、とても書き切れないほどの多くが得られた、楽しいイベントでした。同じチームの皆様はじめ、ご参加の皆様、主催や協力の皆様、お疲れさまでした。ありがとうございました。
関連していそうなエントリ:
最近のコメント