aptitude で落下速度を測定している様子

aptitude – スマホの気圧センサだけで「落下速度」を推定する実験アプリ

「スマホに内蔵された気圧センサだけで、どこまで物理量を測れるだろう?」 aptitude は、加速度センサに頼らずに気圧だけから落下速度を推定することに挑戦した、 実験用の Android アプリです。

作品の説明

一般的には、「落下速度」を測るとき、加速度センサやジャイロを使うことが多いです。 しかし本アプリではあえて、スマホの気圧センサ(barometer)だけに頼り、 高度の変化から落下速度を推定することを目指しました。

建物の上階からスマホをパラシュート付きで落とし、 落下中に記録された気圧データから「高度 vs 時間」を復元。 そこから時間微分(数値微分)とフィルタリングを行うことで、 速度・加速度の推定を試みています。

  • ① スマホの気圧センサを 50–200 Hz 程度でサンプリング
  • ② 気圧→高度変換の式で「高さ vs 時間」を算出
  • ③ Savitzky–Golay などの平滑化フィルタでノイズを抑える
  • ④ 数値微分(Δh / Δt)で瞬間的な落下速度を推定
  • ⑤ 速度プロファイルをグラフ表示・CSV 書き出し
  • ⑥ 実測高度との差から誤差を評価

システム概要

aptitude のシステム構成図

Android の SensorManager から気圧センサを購読し、 サンプリングされた気圧データをアプリ内バッファとローカルファイルに保存します。 記録後、アプリ内の数値計算モジュールで高度・速度を計算し、 グラフとして可視化・エクスポートできる構成です。

技術スタック

  • Android / Sensor: Kotlin, SensorManager, TYPE_PRESSURE
  • Math / Physics: 国際標準大気に基づく気圧–高度変換式, 数値微分, 平滑化フィルタ
  • UI: Jetpack Compose(時系列グラフ・速度プロファイル表示)
  • Data: CSV / NDJSON ログ, 単発イベントごとのセッション管理

主要コンポーネント

  • PressureRecorder: 落下開始ボタンから終了までの気圧センサ値を高頻度で記録するモジュール。
  • AltitudeEstimator: 気圧 [hPa] から高度 [m] を求める変換ロジック。
  • VelocityEstimator: 高度時系列を平滑化し、数値微分で速度を推定。最大速度などの指標を計算。
  • SessionViewer: 1 回の落下実験を 1 セッションとして、グラフ表示・ログ書き出しを行う UI コンポーネント。

技術解説

BAROMETRIC MODEL

気圧から高度を推定する

大気圧 P [Pa] と高度 h [m] の関係には、 国際標準大気に基づいた近似式を用います。 海面気圧 P₀ を基準としたとき、 おおよそ h ≒ 44330 × (1 − (P / P₀)^(1/5.255)) のような形で高度を求めることができます(実装では簡易版を使用)。

擬似コード:
val P0 = 1013.25f // hPa
fun pressureToAltitude(pHpa: Float): Float {
 return 44330f * (1f - (pHpa / P0).pow(1f / 5.255f))
}
FILTERING

「1階差分」がノイズに弱い問題と向き合う

高度から速度を求めるには、v ≒ Δh / Δt のように差分を取る必要があります。 しかしそのまま差分を取ると、気圧センサのノイズや一時的な揺れが そのまま速度に増幅されてしまうという問題があります。

aptitude では、移動平均や Savitzky–Golay フィルタなどの平滑化を試し、 「応答の速さ」と「ノイズ低減」のバランスを探る実験を行っています。

NUMERICAL DIFF

中央差分で速度を近似する

単純な片側差分 v[n] = (h[n] − h[n−1]) / Δt ではノイズの影響が大きいため、 中央差分 v[n] = (h[n+1] − h[n−1]) / (2Δt) を採用することで、 多少のノイズ抑制と時間方向の対称性を両立しています。

擬似コード:
for (i in 1 until altitudes.lastIndex) {
 val dh = altitudes[i + 1] - altitudes[i - 1]
 velocities[i] = dh / (2f * dt)
}
CROSS CHECK

あえて「使わない」加速度センサとの比較

実験の途中からは、参考として加速度センサから得られる落下挙動とも比較しています。 目的はあくまで気圧だけでどこまで行けるかを探ることですが、 「加速度から求めた速度」と「気圧から求めた速度」が どれくらい一致するかを見ることで、モデルの妥当性を検証しています。

実験・結果・課題

落下実験の高度・速度プロファイル

建物の 3 階相当の高さから、パラシュート付きスマホを落とし、 その間の気圧データを記録しました。 簡易な高度変換と平滑化を行った結果、以下のようなグラフが得られました(イメージ)。

高度 vs 時間グラフ
(a) 高度 vs 時間(着地までの軌跡)
速度 vs 時間グラフ
(b) 速度 vs 時間(落下速度の推定)

パラシュートありのため最終速度は 5 m/s 前後に収束しており、 簡易に求めた落下距離・時間から計算した平均速度と 大きく矛盾しない範囲に収まりました。

現在の課題

・実験環境の気圧が時間とともに変化する(風・気流・温度差)問題 ・スマホ内部のフィルタリングやセンサ分解能の限界 ・短距離の落下では信号のダイナミックレンジが足りず、  「計測誤差 > 実際の高度変化」になりやすいこと など、 現実の制約が多く残っています。

短距離落下での信頼性不足 長距離・安定気圧環境での追加実験予定

デモ動画

落下ボタンを押してから着地までの間、 グラフがリアルタイムに伸びていく様子や、 着地後に速度プロファイルが確定する様子を撮影したデモ動画です。

aptitude – 気圧センサだけで落下を追いかける

まだできていない部分と今後

「気圧だけでどこまで行けるか」をもう少し攻めたい

aptitude は、現時点ではまだ「遊びに近い実験ツール」です。 それでも、気圧センサ単体の限界や、 フィルタ設計・モデル化の重要性を体感できる教材としての可能性を感じています。

将来的には、気圧+加速度+ジャイロ を組み合わせた 小さなセンサフュージョン実験プラットフォームとして発展させ、 Kalman Filter や Particle Filter などの実験にもつなげていきたいと考えています。

  • 短期: 複数回の落下実験を行い、誤差分布を統計的に評価。
  • 中期: 加速度と気圧を組み合わせた高さ推定との比較。
  • 長期: CanSat ローバーや他のプロジェクトとセンサログを統合し、 1 つの「物理量研究プラットフォーム」としてまとめる。

これからの改善点と開発計画

実験アプリとして、物理モデル・実験手順・UI の 3 つをバランス良く整えていきます。

  • 物理モデル: 気温補正・基準気圧の自動キャリブレーション。
  • 実験手順: 落下開始・終了の検出を半自動化し、再現性を改善。
  • UI: 実験ガイド表示、グラフの注釈(最大速度・到達高度)の自動描画。
17
18
19
20
21
22
23
24
25
26
27
28
29
30
気圧→高度変換・温度補正の実装
フィルタ・数値微分ロジックのチューニング
実験ガイド UI とグラフ注釈の追加

このプロジェクトを通して

感じていること

「スマホに入っているセンサだけで、どこまで物理現象を測れるか?」 という問いは、子どもの頃の工作にも近い感覚があります。 aptitude を作る中で、物理モデル・計測ノイズ・実験手順が すべて繋がって初めて“それっぽい答え”になることを、改めて体験しました。

一方で、「気圧だけで落下速度を測る」というのは、 正確さを追求するには少し無茶な挑戦でもあります。 それでもこのアプリを通じて、 スマホのセンサでできること / できないことを 自分の手で確かめられたのは、大きな収穫でした。

今の自分へのメモ

  • ・無茶な条件設定でも、一度やってみることで見える「限界」もある。
  • ・物理モデルと実験の両方をきちんとノートに残しておくこと。

リファレンス & リンク

リファレンス

  • 国際標準大気モデル(気圧–高度関係の近似式)
  • Android Developers – SensorManager / TYPE_PRESSURE
  • 数値解析入門 – 差分法・Savitzky–Golay フィルタ

リンク