河本の実験室

河本が作ったものを紹介するブログです。こっち(https://kawalabo.blogspot.com/)から移転してきました。

見えない空間データを可視化する「AR Sensor」を作った

(今回から河本の実験室の記事は、こっちに書くことにしました。そのうち過去記事も移転します。)

"AR Sensor"というアプリを作りました。

f:id:kenkawakenkenke:20190105222927p:plain

データをARで投影することで、普通は見えない日常の中の様々な空間データを見えるようにするツールです。

例えばこんなふうに、Wifiルーターから出てくる電波の立体的な強弱を見ることができます(緑は電波が強いところ、赤は電波が弱いところ):

f:id:kenkawakenkenke:20190105181636g:plain

AR Sensorで見るWifiルーターの上の電波強度

なんでこんなの作ったの?

もともとは「週一ぐらいでどこからともなく流れてくる排水口の臭いのもとを突き止めたい」という家庭的な悩みを解決するためにこのツールを作りました。臭いの空間分布を可視化できれば、臭いの元がすぐに見つけられるんじゃないかと。

使っているうちにWifiや磁場などのスマホで測れる様々なデータに応用すると便利+教育的であることに気づいて、汎用的なアプリとしてリリースしました。

なにが測れるの?

バージョン1.0で表示可能なのは「Wifi電波強度」「Bluetooth LE電波強度」「磁場」「気圧」「LTE(携帯)電波強度」の5種類です。それぞれの面白さを紹介していきます。

Wifi電波強度

スマホが繋がっているWifiルーターの電波強度を測定し、空間にプロットしていきます。

f:id:kenkawakenkenke:20190105194138g:plain

AR SensorでみるWifiの電波強度分布

例えば我が家では2階にルーターが置いてあるため、階段の中程でようやく良い信号(緑)になることが見えます。ルーター配置を最適化したり、ホテルのロビーでWifiが捕まる場所を探すのに使いましょう。

Twitterで少し勘違いしている人がいたので明確にしておくと、AR Sensorは「スマホが通った場所のセンサデータを随時記録して表示するツール」なので、上の動画を見るとわかるように通った場所のWifi電波強度しかわかりません。部屋全体を「見」たければ、部屋全体にスマホを動かす必要があります。頑張ってください。

余談ですが、アプリの現バージョンでは測定した点が「いい感じに」緑から赤が分布するように勝手に調整しています。このモードをOFFにしたい場合は設定画面から「色を動的に更新」をOFFにして、手動で最小値(赤)〜最大値(緑)を設定しましょう。

f:id:kenkawakenkenke:20190105194609p:plain

 Bluetooth LE電波強度

Wifiと同じように、Bluetooth LEの電波強度(RSSI)を可視化します。

f:id:kenkawakenkenke:20190105205137p:plain

例えばこれは中心のスマホBluetooth電波強度を測定した結果です。真ん中にアルミホイルの壁を設けてあるせいで、右側は左に比べて電波強度がガクっと下がる(赤くなる)のが見えますね。このように、「シミュレーションでは見たことあるけど実際どうなんだろう」が可視化できるのがこのツールの面白さです。

磁場

スマホには磁気センサー(ようはコンパス)が入っています。地図アプリなどで方角を示すのに使われています。これをAR Sensorで可視化すると:

f:id:kenkawakenkenke:20190105211218g:plain

AR Sensorでみる地磁気

このように、北極に向かって粒子が流れていきます。(地面に向かっているのは、東京では伏角が49°、つまり地面の先に北極があるからです。)

また磁石の周りの磁場も見てみましょう:

f:id:kenkawakenkenke:20190105211904p:plain

頑張れば教科書で見たことのあるような磁力線が立体的に見ることができます。

2つの磁石を並べると、一つの磁石からもう一つの磁石に向かって磁力線が繋がっているのが見えますね。

f:id:kenkawakenkenke:20190105212157g:plain

AR Coreでみる2つの磁石の周りの磁力線

これまでは砂鉄とかを使って二次元的にしか見れなかった磁場を、スマホだけで三次元的に見ることができるようになりました。

気圧センサ

あんま面白くないので割愛します。

LTE電波強度

加筆 (2019/1/6)

携帯の電波強度です。携帯の繋がりにくい居酒屋でベストな席を探すのにご利用ください。

f:id:kenkawakenkenke:20190106124100g:plain

ガスセンサ+Arduino+シリアル通信

AndroidArduinoを繋げるのが物凄く簡単だって知ってましたか?こういうホストケーブルで繋げば普通にSerial通信でデータのやり取りができます。

例えばこんなふうにガスセンサをAR Sensorとくっつければ、お湯を沸かしている時のガス分布を見ることができます。

f:id:kenkawakenkenke:20190105223758j:plain  f:id:kenkawakenkenke:20190105224005p:plain

これを使えば、スマホに搭載されているセンサ以外にもなんでも組み合わせられるということです。何か測ったら面白いもののアイディアがあったら是非教えてください。

ちなみに今回は面倒だったのでAR Sensorのリリース版にはシリアル通信機能は含めていません。そのうち作ります。

実装の話

今回初めてARCoreとSceneformを使ってアプリを作ってリリースしました。これからAR開発をしてみようと思っている人向けに、開発の流れをメモしておきます。

なんでSceneform?

Sceneformは面倒なOpenGLに触れなくても3DアプリがかけるJavaの3Dフレームワークです。僕はUnityのような現代的な開発環境がよく分からない古いエンジニアなので、Javaだけでゴリゴリ開発できるSceneformが好適でした。

学ぶ

Sceneformが提供するサンプルプロジェクトがとても簡単なので、特に迷わないと思います。

hellosceneformで基本的なセットアップに必要なもの(ArFragment, AnchorNodeなど)の取扱いを学びましょう。

solarsystemで変形やアニメーションを学びましょう。完全に余談ですが、天王星の向きがおかしいバグを見つけたのでPRを出してみました。練習に使うなら気が狂わないようにこっちの修正版を使いましょう。

次のステップ

次にこんな機能作ります。Twitterで「これがほしい!」といってくれれば作るかもです。

・ シリアル通信のデータを読み込む機能をリリース版にもいれる

・Cloud Anchorでデータの共有ができるようにする。例えば教室で先生が磁石の周りでグリグリしているのを生徒たちが自分のデバイスで見れたら素敵じゃない?

 さいごに

「位置情報とセンサデータを3Dで取得して表示するツール」というのは10年ぐらい前からずっと作りたかったものなんですが、今までは位置情報の取得が面倒で躊躇っていました。「環境に設置した複数のカメラで位置を測る」とか「QRコードを部屋中に貼る」とか「Kinectで右手の位置を測る」とか、やればできるけど実装+環境構築コストが少し大きい手段しかなかったからです。AR Core(に搭載されたSLAM)が優秀なおかげで面倒な位置情報処理のコードを一行も書かずにシステム構築でき、センシングから位置取得から表示までスマホ一台で完結できたことが一番の驚きでした。是非皆さん(特に今回Pixelを買った人)には手元のスマホの力を感じてもらいたいです。

Get it on Google Play

追記1 (2019/1/6):用語がよくわからなかったので「磁力」と書いてました。正しくは「磁場」ですね。直しました。