水平器アプリの仕組み:スマホの加速度センサーを解説
スマホがどちらが下かを知っているのは、MEMS加速度センサーという小さなセンサーが入っているからです。このセンサーは、重力がスマホを3つの方向から同時にどれだけ引っ張っているかを測ります。水平器アプリはこの3つの数値を読み込み、少しだけ三角法を使って、角度を表示します。しかも1秒間に数百回、肉眼ではやっと見えるくらいの小さなチップの中でこれを行っています。この記事では、実際に何が起きているのかを順を追って説明します。
- 加速度センサーは、重力が3つの軸にどう配分されるかを測ります。スマホが静止しているときに動きを測っているわけではありません。
- ピッチとロールは、この3つの重力の値にアークタンジェントの式を当てはめて求めます。
- Spirit Level Proは、生の値を指数移動平均(alpha=0.15)に通し、気泡のちらつきを抑えています。
- MEMSセンサーは温度で値がずれるので、作業する場所でキャリブレーションしてください。
- 面に当ててスマホを静止させて使う分には、加速度センサーだけで足ります。ジャイロスコープは要りません。
MEMS加速度センサーとは
MEMSはMicro-Electro-Mechanical Systems(微小電気機械システム)の略です。スマホの加速度センサーの中で実際に感知している部分は、数百マイクロメートルほどのごく小さなもので、塩の粒より小さいです。普通のチップの回路と同じシリコンの上に、同じ作り方で作られます。だからこのセンサーは安く、ほぼすべてのスマホに入っているのです。
仕組みは、思い浮かべてしまえば単純です。チップに刻まれたシリコンのばねに、小さなおもりがぶら下がっています。チップを傾けると、重力がおもりを少しだけ中心からずらします。この動きが、くしの歯のような金属の指の間の隙間を変え、隙間が変わると指の間の静電容量が変わります。チップはその変化を読み取り、gという単位の加速度の数値に変えます。
ここが水平器を成り立たせている肝心なところです。スマホが静止しているとき、加速度センサーは動きを読んでいるのではありません。重力が3つの軸それぞれをどれだけ引っ張っているかを読んでいます。重力は決まった、わかっている力です。それが3つの軸にどう分かれているかがわかれば、スマホがどう傾いているかを正確に割り出せます。
3軸の加速度センサーはどうやって傾きを測るのか
3軸の加速度センサーは、スマホ自身の方向の基準を持っています。Xは左右、Yは上下、Zは前後です。スマホを机に平らに置くと、重力はほぼすべてZに沿って引くので、Zは約9.81m/s²、XとYはほぼ0を示します。スマホを傾けると重力の分かれ方が変わり、Zが減ってXとYが増えます。その増減は傾きの角度に比例します。
この3つの値を角度に変えるのは、基本的な三角法です。ピッチは前後の傾き、ロールは左右の傾きで、どちらも逆正接(アークタンジェント)で求めます。
この2行が、水平器アプリの計算の核すべてです。3つの生の値を入れて計算すれば、ピッチとロールがラジアンで出ます。180/πを掛ければ度になります。それが画面に出る数字です。
分母がもう一方の1軸ではなく、他の2軸の平方根になっているのはなぜか、と思うかもしれません。こうすると1回転を通じて値が安定するのです。1軸だけで割ると、垂直に近いところで計算が破綻します。その軸が0に近づき、ほぼ0で割ることになるからです。他の2軸を合わせた大きさで割れば、これを避けられます。
Spirit Level Proは、EMAスムージング、5つの許容差プリセット、ワンタップのキャリブレーションで、ピッチとロールの角度をリアルタイムに表示します。ダウンロードは不要です。
Spirit Level Proを無料で試す生のセンサーデータがこんなに荒れているのはなぜか
加速度センサーの生の出力は、思っている以上にばらつきます。スマホをまったく動かさずに置いていても、値は小さく揺れます。一部はセンサー自体の電気的なノイズ、一部は面から伝わる振動、一部はアナログの信号を数値に変えるときの丸め誤差です。この生の値をそのまま画面に出すと、気泡が止まらず震えて、丁寧な作業には使えません。
ノイズの出どころはいくつかあります。熱ノイズは、熱による無作為な電気のゆらぎです。取り除くことはできず、センサーがどこまで静かになれるかの下限を決めます。振動ノイズは、まわりの世界から来ます。冷蔵庫のコンプレッサー、足音、外の交通です。そしてセンサーのゼロ点は、それ自体でゆっくりとずれていきます。それぞれに別の対処が要ります。
よく使うソフト側の対処は、ローパスフィルターです。本当の傾きのようなゆっくりした変化は通し、振動のような速い変化は抑えます。よくあるやり方が指数移動平均、つまりEMAです。新しい値ごとにその一部(alpha)を反映し、残りは前回のフィルター済みの値から引き継ぎます。
Spirit Level Proは、alpha=0.15のEMAを使っています。この値は、いくつもの値を手作業で試したうえで決めました。alpha=0.05だと表示はつるつるに滑らかですが遅く、スマホを動かすと気泡が後れて付いてきました。alpha=0.3だと追従はよいものの、揺れが残って正確な値をとらえにくくなりました。alpha=0.15はその中間です。気泡が神経質にならず、それでいて生きているように動きます。
ジャイロスコープはどんな役割を果たすのか
ジャイロスコープは、スマホがどれだけ速く回っているかを、1秒あたりの度で測ります。スマホがどちらを向いているかは測りません。この違いが大事です。ジャイロスコープだけでは、スマホが水平かどうかはわかりません。回っているかどうかと、その速さがわかるだけです。スマホを静止させて水平を読むだけなら、加速度センサーで足ります。
ジャイロスコープが役に立つのは、スマホが動いているときで、センサーフュージョンによってです。加速度センサーは静止した傾きはよく読みますが、速い動きの間は遅く、荒れます。ジャイロスコープは速い回転はよく追えますが、小さな誤差が積み重なってずれていきます。相補フィルターやカルマンフィルターは、この2つを混ぜ合わせます。速い動きはジャイロスコープが受け持ち、加速度センサーが長い目で見た値を正しいところへ引き戻します。
Spirit Level Proを含め、たいていの水平器アプリはセンサーフュージョンを使いません。用途が静的だからです。スマホを置いて、落ち着いてから、角度を読む。これは加速度センサーだけで問題なくこなせます。センサーフュージョンが効いてくるのは、棚を確かめるときよりも、ドローンが自分の動きを追うような、飛んでいるものの場合です。
キャリブレーションがこんなに大事なのはなぜか
どのMEMSセンサーも、工場から出る時点で小さなずれ(オフセット)を持っています。製造の過程で入る偏りで、どの読み取りでも同じです。決まった量、決まった向きに出ます。だからスマホが本当に平らでも、チップは1度か2度ずれて表示することがあります。これが、水平器アプリを買ったばかりのときに狂って見える、いちばんの理由です。
キャリブレーションは、平らだと信頼できる面でこのずれを測って保存することで直します。Spirit Level Proは、その値をlocalStorageのcalibrationPitchとcalibrationRollに保存します。以降はどの読み取りも、画面に出す前にこの保存した数値を引きます。ずれは消えます。
差は大きいです。キャリブレーションを飛ばすと、1.5度のずれを持つスマホは、何を測っても1.5度狂います。本当は1.5度傾いているのに0.0度と表示することもあります。同じスマホをキャリブレーションすれば、ずれは0.数度まで下がります。数秒しかかからないのに、精度を上げる手としてはこれが一番効きます。
温度は精度にどう影響するのか
MEMSセンサーは温度に反応します。おもりを支えるシリコンのばねが、チップの温まり方・冷え方に応じて伸び縮みし、ゼロ点がずれます。だから暖かい車から寒いガレージにスマホを持ち込むと、センサーが新しい温度に落ち着くまで、値が少しずれます。大きなずれではありませんが、確かにあります。
実際に押さえておくことは単純です。作業する温度でキャリブレーションしてください。暖かいオフィスでとったキャリブレーションは、寒いガレージでは十分には保ちません。ただ、どの作業でも神経質になる必要はありません。絵を掛けたり棚を確かめたりする分には、ずれは見えないほど小さいです。0.数度まで詰める精密な作業なら、大きく温度が変わったあとは、スマホを1〜2分置いて落ち着かせてから、キャリブレーションしてください。
iPhoneとAndroid:センサーのハードウェアは違うのか
違います。そしてそれはアプリの使い心地に表れます。Appleは自前のモーションの仕組みを作っています。6s以降のiPhoneには、センサーデータをメインのCPUとは別に処理するモーションコプロセッサーが載っています。Samsung Galaxyのフラッグシップは、3軸の加速度センサーと3軸のジャイロスコープを1つのダイに載せたSTMicroelectronics製の部品を使っています。Google Pixelは、年によってBoschやTDK InvenSenseのセンサーを使ってきました。
キャリブレーションを済ませれば、フラッグシップのiPhoneとフラッグシップのAndroidはほぼ同じくらいの結果になります。実際に効いてくる差は、フラッグシップと安価なAndroidの間です。安価なスマホは、分解能の低い安いMEMSを使っていて、生の出力がより荒れます。それでもキャリブレーションすれば近づきますし、たいていのDIY作業なら結果は十分です。
水平器アプリでiPhoneを際立たせているのは、加速度センサーというより、あのモーションコプロセッサーです。アプリが前面に出ていないときでも、高い頻度でセンサーデータを集め続けるので、スムージングのフィルターに使えるサンプルが多くなります。紙の上ではAndroidのセンサーも同じくらい良いのに、iPhoneがここで滑らかに感じられるのは、これが大きな理由です。
よくある質問
スマホの水平器アプリはどうやって動いているのですか?
スマホのMEMS加速度センサーを読んでいます。このセンサーは、重力が3つの軸(X・Y・Z)をどれだけ引っ張るかを測ります。スマホを傾けると、重力がその軸の間で配分を変えます。アプリはアークタンジェントの式でピッチとロールを求め、センサーのノイズを抑えるために値を滑らかにし、気泡や数字として表示します。これを1秒間に数百回くり返しています。
水平器として使うとき、スマホの加速度センサーはどのくらい正確ですか?
キャリブレーション済みのフラッグシップなら、0.数度の範囲で読めます。安価なAndroidはキャリブレーションしないと精度が落ちます。センサーが安く、個体差も大きいからです。いちばん効くのはキャリブレーションで、工場出荷時のずれを取り除き、ほぼどのスマホも近いところまで持っていきます。たいていのDIYや現場の作業なら、キャリブレーションした中位のスマホで十分な精度です。
水平器アプリはジャイロスコープを使いますか?
スマホを静止させて使うなら、使いません。加速度センサーだけで傾きの角度がわかります。ジャイロスコープは回転の速さを測るもので、位置は測りません。だからスマホが水平かどうかは判断できず、どれだけ速く回っているかがわかるだけです。動かしながらでも滑らかに読めるよう両方のセンサーを混ぜるアプリもありますが、壁にスマホを当てて角度を読むだけなら、加速度センサーだけで足ります。
平らな面なのに、水平器アプリの表示が少しずれるのはなぜですか?
たいていは工場出荷時のずれです。どのMEMSチップにも小さな偏りが組み込まれていて、スマホが平らでも0以外を示します。信頼できる面でキャリブレーションすれば消えます。ほかにも、温度による変化、スマホケースが片側を持ち上げている、面とスマホの間のほこり、といった原因があります。大きく温度が変わったあとに、きれいなガラスの机でキャリブレーションすれば、たいていは片づきます。
全体像
水平器アプリが成り立つのは、その裏にある物理が当てになるからです。重力は一定で、加速度センサーは常にそれを測り、三角法が3つの数値を角度に変えます。感知する部分から気泡の表示まで、道のりはずっと決まった計算です。あてずっぽうはありません。
ある水平器アプリを別のものより良くしているのは、ハードウェアではありません。フラッグシップのスマホなら、どれも十分すぎるほどのセンサーを最初から積んでいます。差はソフトウェアです。生の値をどれだけうまく滑らかにするか、キャリブレーションをどう保存して当てるか、許容差のプリセットが実際の作業とどう噛み合うか。そこを詰めれば、安いMEMSチップでも、はるかに高い専用の道具に引けを取りません。
センサーの仕組みを知っておくと、使い方もうまくなります。作業する温度でキャリブレーションする。精密に読むときはケースを外す。信頼する前に、数字が1秒ほど落ち着くのを待つ。どれも、ハードウェアが何をしているかを理解することから、そのまま出てくる習慣です。