学習する天然ニューラルネット

主に機械学習に関する覚書や情報の整理。競プロ水色→Kaggle Master→?

目的地に案内してくれる魔法の帽子 Gogoal cap

要約

  • 振動で目的地の方向を教えてくれる帽子を作ったよ
  • 音声認識で場所を検索するよ
  • GPS地磁気センサーで場所と向いている方向を取得したよ
  • 実際に使ったよ
  • 機械学習は全く関係ないよ

はじめに

たまには思い出話でも書こうと 思います。趣味ではなく、ある授業の一環で製作したものなのですが、一番工学科っぽいことをしたなぁと思い出になってます。ハードの闇に飲み込まれたり、トランジスタを用いて回路を作ってみたり、初めてPythonを扱ったり、色々大変でした。普通に学科の授業がある中(取る授業減らせばよかった…)で、製作期間は2.5ヶ月ぐらいと忙しすぎて死にかけましたが最後はなんとか形になりました。💦

問題意識

昨今、歩きスマホが問題視されてる中、地図アプリを用いると歩きスマホになってしまう問題があります。それをカバーするために、音声案内という手段も考えられますが、騒音環境ではうまく聞き取れない問題や、そもそも難聴者ではそのような手段が取れない問題があります。

そこで、視覚と聴覚でない感覚を用いれば良いのではないかと考えました。つまり、触覚を用いるのです。今回は頭部の触覚を用いました。

完成品

これが… f:id:aotamasaki:20180424163910p:plain だ。

f:id:aotamasaki:20180424164114p:plain

入力は音声で、目的地の方向が振動として出力される帽子です。 この男の子が手に持ってるリモコンに向かって目的地名を言うと、内部でいろいろ起きて、結果的に帽子に内蔵されたバイブレーターが震えて目的地の方向がわかるという次第です。

また、録音開始、案内終了の操作もリモコンでできます。(ちなみにランプもついていて、プログラムの状態を確認できます、完全にデバッグ用ですが)

なお装着すると見た目がエグいことになります。

f:id:aotamasaki:20180424165046p:plain

システムの概要

次に、どんなアイデアで、"音声"から"目的地方向が振動"までのシステムを作ったか説明します。コードは汚すぎてちょっと見せられたもんじゃありません…

システムフローは以下のアニメーションに示した通りです。Raspberry Piというのは小型のパソコンとでも思ってください。こいつが外部と通信し、情報を処理して、バイブレーターをコントロールしてます。

f:id:aotamasaki:20180424170137g:plain

各段階について軽く説明します。

入力&音声認識

マイクは市販のUSBマイクのガワを引っペリ返し、センサーのみをリモコン内に埋め込みました。

音声認識に関して、Google Speech APIの画像になっていますが、実際に用いたのはdocomo developer supportの音声認識API【Powered by アドバンスト・メディア】というものです。 ここでマイクが聞き取った音声を外部に送信して、次の段階で使うためのテキストデータを取得します。

目的地検索&センサーデータ取得

まず目的地を検索します。用いたのはGoogle Maps Geocoding APIです。目的地名を入力すると、その目的地の緯度経度を返してくれます。

次にセンサーのデータを取得します。帽子のてっぺんに取り付けた地磁気センサーで自分の向いている方向を、GPSセンサーで自分のいる緯度経度(座標)を取得することができます。 (詳細は省きますが、センサーの性質がそれぞれ違うからか、取得したデータから正確な値を計算できず、キャリブレーションに苦労しました。生のセンサーデータを信用するなってのは経験になったかもしれないです。)

目的地の座標と、自分の座標、向きがわかったところで、"自分から見た目的地の方向"を計算することができます。 直感的には、以下の図のイメージ。

f:id:aotamasaki:20180424171815p:plain

  • オレンジ色の矢印が自分→目的地までを示しています。
  • 青い矢印は自分の向きを示しています。
  • 黒い数字は真東を0度をとしたときの向きです。

青い矢印とオレンジ色の矢印の間の角度を取れば、"自分から見た目的地の方向"がわかります。これがオレンジ色の数字です。 上のイメージ図からも極座標変換を駆使すれば計算できることが予想できます。しかし注意したいのは、緯度と経度は直交座標系ではなく球面座標系であるので、工夫が必要です。今回は、自分と目的地の座標の差分が大円距離を描く角度を採用しました。 大遠距離についてはwikipediaから図を拝借したので適当にイメージしてください。

f:id:aotamasaki:20180424173149p:plain

大円距離 - Wikipedia

出力

以上で、音声から目的地の方向を得ることができたので、あとはそれを帽子上のバイブレーターに出力するだけです。

拙い裁縫技術でなんとかバイブレーターを帽子に縫い付け、配線をしました。そしてRaspberryPiのピンに接続し、いざ起動… 動きませんでした。

あれぇ!?おかピーぞ!???

デバッグ用にLEDをダンボールに設置して、ちゃんと出力ができてるか見る。

f:id:aotamasaki:20180424174607g:plain

いや、出力はできてるな。 テスターでいろいろ測ってみた結果、圧倒的にバイブレーターを動かすための電流が足りてませんでした。電圧の規格は確認してたんですけどねぇ…トラップでした。

そこで、外部電源(乾電池)から電流を取ってくるべくトランジスタを用いて制御することにしました。このとき、電子回路を履修していたことに涙を流して感謝しました。

実際につかってみる

さまざまなトラブルを乗り越えて完成したGogoal cap。実際に使ってみました。プライバシーに配慮して、動画をここに載せられませんが、装着者のしらないあるラーメン屋に案内してもらいました。

最初は順調だったのですが、目的地付近で少々迷ってしまいました。想像できていたことですがここは改良が必要そうです。 最終的に、看板を見つけ

f:id:aotamasaki:20180424180048p:plain

ラーメンをいただきました。

f:id:aotamasaki:20180424180159p:plain

ごちそうさまでした。

おしまい