- 英国がんセンターの「1日100回プッシュアップチャレンジ」に参加するためのアプリを探していたが、自分でプッシュアップ回数を数える面白いものを作ってみることにした
- iOSのCore Motionフレームワークを探求
- センサーデータを活用する方法を模索する中で、
CMHeadphoneMotionManagerを使ってAirPodsの動きデータを活用することにした
- Core Motionは加速度計、ジャイロスコープ、地磁気センサーなどのデータを提供する
- 正確で信頼できる動きと方向の測定に有用
- ユーザーのプライバシー保護のため、データアクセス権限が必要
- AIの活用方法を検討
- ARKitなどのフレームワークを使うアプリはすでに多く存在する
- その代わりに、AIがアイデアの実装を支援できると判断した
- Core Motionについて学習させたGPTを活用し、自然言語で質問して解決策を得た
- アプリのアーキテクチャ設計
- Motion Manager: センサーデータをストリーミングし、デバイスのセンサー更新を処理する
- Pushups Detector: ストリーミングされたデータを分析し、事前定義されたしきい値に基づいてプッシュアップを検知してカウントする
- SwiftUI View: ユーザーがプッシュアップを行う際にリアルタイムで更新されるレスポンシブなUIを提供する
- Motion Managerの実装
- デリゲートパターンを使って更新される値にアクセスする
CMHeadphoneMotionManagerを使ってデバイスのモーションデータを取得する
startUpdates()とstopUpdates()でセンサー更新を開始・停止する
pitchとaccelerationYの値を更新し、デリゲートに通知する
- Pushups Detectorの実装
- 「セッション」の概念を導入し、データストリームの分析を開始・停止する
- 生データを解釈して、ユーザーの姿勢とプッシュアップ実施の有無を判断する
- しきい値を使ってプッシュアップの下降と上昇を検知し、カウントを増やす
MotionManagerDelegateを実装し、加速度とピッチ値の変化を処理する
- SwiftUIでシンプルなビューを実装
- セッション開始/終了ボタンと、プッシュアップ回数を表示する大きな数字で構成される
- ユーザーの姿勢が正しいかどうかを表示するテキストも追加した
- データ分析と可視化
- Swift Chartsを使って生のセンサーデータを可視化し、パターンを特定した
- Y軸加速度で、プッシュアップの下降(-1.0)と上昇(+0.5)のパターンを発見した
- 実際のテストを通じてしきい値を調整し、精度を改善した(+0.4、-0.7)
- リアルタイム追跡の魅力
- AirPodsを装着して開始ボタンを押すと、プッシュアップ回数が自動で更新される
- ユーザーの操作なしでも動作する
- このプロジェクトで学んだこと
- 早期検証と反復的な改善の重要性を再確認した
- 意味のあるものを作る楽しさと満足感を感じた
- UI改善や複数日にわたるプッシュアップのカウントなど、改善の余地もある
- AirPodsによる音声フィードバックを追加し、視覚インターフェース以外でもユーザー体験を向上させた
- 結論
- Core Motion、SwiftUI、AIを組み合わせ、24時間でフィットネストラッキングに新たな次元を加えるアプリを開発した
- 新しい技術を日常の問題にどう適用できるかに挑戦することが重要だ
2件のコメント
改めて、ビッグ3の回数を数えてくれるGalaxy Watchはすごいですね
数年前に、iPhoneの近接センサーを活用した「Thirty」というプッシュアップチャレンジアプリを作ったことがありましたが、AirPodsでやる方法もあるんですね……。近接センサーはDynamic Island追加以降、精度がやや落ちたような気がします(泣)