スマホの姿勢センサ(加速度・ジャイロ・回転ベクトルなど)から 「姿勢+移動量」をリアルタイムで取得し、画面上に可視化しながら、 一定量たまったところで NDJSON を gzip 圧縮して API Gateway → Lambda → S3 → SageMaker へ送ることを想定したセンサロガーアプリです。
myapplication は、スマホを手軽な IMU(慣性計測ユニット)+ログ端末として使うためのアプリです。 回転ベクトルセンサから得られるクォータニオンや、加速度からの簡易的な移動量推定を 画面にリアルタイム表示しつつ、それらを 10〜60 秒ごとにまとめて NDJSON に変換し、 gzip で圧縮して AWS に送信します。
1 サンプルごとに HTTP を叩くのではなく、 「100 件たまったら送信」「30 秒ごとにバッチ送信」など柔軟な条件で センサログをバッチ化することで、ネットワーク帯域とバッテリーを節約しながら 後から SageMaker 等で学習・解析できるデータセットを作ることを目指しています。
スマホはセンサをサンプリングしつつ、一定間隔で NDJSON を gzip 圧縮して API Gateway に送信します。Lambda が受け取ったバイナリを解凍・バリデーションしたうえで S3 バケットに保存し、その S3 を SageMaker や Athena、 あるいはローカル Jupyter Notebook から分析する想定です。
TYPE_ROTATION_VECTOR から取得できる回転ベクトルを
SensorManager.getRotationMatrixFromVector() 経由で
回転行列・クォータニオン・オイラー角に変換し、画面にリアルタイム描画しています。
加速度は重力成分を除去したうえで時間積分し、簡易的な「移動量」も算出します。
{"t": 1732170000, "qx": 0.1, "qy": 0.0, "qz": 0.0, "qw": 0.99,
"ax": 0.01, "ay": -0.02, "az": 0.98, "dx": 0.05, "dy": 0.00, "dz": 0.00}
センササンプルは、1 行 1 JSON オブジェクトの NDJSON として内部バッファに追記します。 こうしておくことで、後から Athena や Python で「1行1レコード」として扱いやすくなり、 ストリーム処理とも相性の良い形式になります。
buffer.append(jsonString)
buffer.append('\n')
if (buffer.size >= THRESHOLD || elapsed >= MAX_WINDOW) {
flushAndUpload(buffer)
}
バッファが一定サイズに達したら、GZIPOutputStream で圧縮し、
Content-Encoding: gzip を付与して API Gateway に POST します。
これにより、数秒〜数十秒分のログでも通信量を数分の一に抑えられます。
val gzipBytes = gzip(ndjsonBytes)
val request = Request.Builder()
.url(endpoint)
.post(RequestBody.create(MEDIA_TYPE_GZIP, gzipBytes))
.addHeader("Content-Encoding", "gzip")
.build()
Lambda では解凍後の NDJSON をそのまま S3 に保存する想定です。
オブジェクトキーに deviceId/date/hour などを含めておくことで、
SageMaker の Notebook から特定の走行・特定の実験だけを抽出し、
すぐに Python / Pandas / PyTorch で扱えるようにします。
スマホを手に持って歩いたり、止まった状態で回転したり、 カバンに入れて移動してみるなど、いくつかのパターンでログを収集しました。 その結果、クォータニオンと移動量の変化パターンから、 「どのタイミングで加速度の積分誤差が暴れ始めるか」が見えてきました。
・加速度積分による位置のドリフトが大きく、あくまで「移動量の目安」にとどまること ・センササンプリングレートとバッテリー消費のバランス ・回線状況が悪いときのアップロードリトライと、バッファの上限管理 など、長時間の運用に向けて解決したい課題が見えています。
スマホを動かしながら姿勢・移動量がリアルタイムに変化し、 一定時間ごとに NDJSON gzip バッチが送信される様子を撮影したデモ動画です。
myapplication は、単体のアプリというより、 今後の CanSat ローバーや EEG 実験、Rootine などのプロジェクトにまたがる 「センサログ収集基盤」として育てていくイメージを持っています。 ロガー部分と AWS 連携部分をうまくモジュール化できれば、 どのアプリからでも同じ形式でデータを集められるようになります。
ログ品質・アップロード戦略・再利用性の3つの軸で改善していきます。
スマホ単体でも、きちんとログを残す仕組みを作れば、 立派な実験プラットフォームになることを実感しました。 一方で、「その場で便利な表示」と「後から解析しやすいログフォーマット」を 同時に満たす設計は意外と難しく、何度か NDJSON の構造を作り直しています。
しかし、S3 に蓄積されたログを Notebook で眺めていると、 「この時はこう動いていたはずだ」という自分の記憶と、 センサの値が一致した瞬間に、小さな感動があります。 こうした「現実世界の動き」と「データ」が結びつく感覚を、 今後も大事にしていきたいです。