はじめに

前回は数年前に自作した Garminアプリを、Gemini、Gemini Code Assistを使って新たに環境構築、既存コードの解析をしてみました。
今回は Gemini CLI も使ってみることにしました。

コードレビューと改修

とりあえずPCに Gemini CLI をセットアップし、VSCodeのターミナルからでも使えるようにしました。(この辺もGeminiに聞きました)

早速 Gemini CLI で、ソースコード一式のレビューをしてもらいました。(Gemini 2.5 Pro)
すると、体裁的なものに加え、現在の速度を表示する部分において、リアルタイムな値では急な変化が起こる可能性があるので平均的な数値にした方が良い、と修正の提案がありました。
この部分、カルマンフィルタというのを使って誤差を減らすような処理を入れたく、後でやろうと思って未実装のままコメントを残していたのですが、その点についても言及がありました。(Geminiから、「コメントされているカルマンフィルタは急な値の変化を考慮されていると思いますが」と言われました)
とりあえず、平均的な数値に置き換える提案について、改修方法を提示してもらいました。
その内容をそのまま適用してみたとところ、感覚的には8割程度は実装できていました。(残り2割は手直しが必要)
せっかくなので、カルマンフィルタへの置き換えも試してみました。

カルマンフィルタとは

ここも Gemini に聞いてみました。

カルマンフィルターについて、数学初心者にもわかりやすく簡潔に教えてください。

以下の回答を得ました。

カルマンフィルターは、不確かな情報から、最も確からしい真の値を推定する賢い方法です。特に、時間が経つにつれて変化する物事(動く物体など)の状態を予測し、その予測を実際の観測値で修正し続けるのが得意です。

仕組みの簡単な説明

カルマンフィルターは、以下の2つのステップを交互に繰り返します。

  1. 予測ステップ: 前回の推定値と、システムがどう動くかの予測モデルを使って、現在の状態を予測します。しかし、この予測は完璧ではないため、不確かさが伴います。
  2. 更新ステップ: 実際にセンサーなどから得られた観測値で予測を修正します。この時、「予測」と「観測」のどちらをどれくらい信用するかを決める「カルマンゲイン」という係数を使います。不確かな観測値よりも、信頼性の高い予測値を重視するなど、状況に応じて最適な比率で両者を組み合わせます。

    このプロセスを繰り返すことで、予測の不確かさと観測のノイズを両方考慮した上で、最も正確な推定値をリアルタイムに導き出すことができるのです。

例え話

部屋の中を歩き回る人を目隠しをして追跡していると想像してください。

予測: 最後に触れた位置と、歩く速さや方向の予測から、「あの人は今このあたりにいるはずだ」と予測します。

更新: 観測者(あなた)が手を伸ばして、その人の服に触れたとします。この「触れた位置」という観測値を使って、先ほどの予測を修正します。もし手が非常に正確なら、予測を観測値に大きく近づけます。予測が非常に正確なら、観測値の小さなズレは無視します。

この繰り返しによって、目隠しをしていても、その人の正確な位置をかなり正確に把握できるようになります。カルマンフィルターは、このような予測と修正のサイクルを数学的に最適化するアルゴリズムなのです。

カルマンフィルタの実装

Gemini CLI にカルマンフィルタのコーディングをお願いしてみました。サンプルコードなどを探してきてコーディングしてくれたのだと思いますが、体感としては、こちらも8割程度、実装をしてもらえた感じです。
残りの2割ですが、float型の変数に対する剰余をしていてコンパイルエラーが出るなど、意外と難しくない間違いをするんだな、ということがありました。
自然言語での簡単なやり取りでここまでできたので、もっと詳細なプロンプトとかコンテキストを準備すれば、より精度が上がりそうだな、とも感じましたが、今回は自力で修正できる範囲だったので、ここまでとしました。

次にやりたいこと

Garmin単独ではなく、Garminで取得したデータをスマホアプリと連携し、スマホアプリで見るための方法を調べて試してみたいと思います。