デバイスの動作確認そのものはやっていただくとして、ご質問の主題に回答します。
以前からスマホのヘルスケア機能などを見て「どうやって実現するのかな」と興味があったので、少し調べてみました。
まず、「万歩計」は特定の会社の商標なので、これをキーワードにウェブ検索しても情報が見つかりにくいです。一般的な呼び名である「歩数計」で検索するといいです。
また、英語の「pedometer」で検索すると、GitHubなどでコードも見つかります。AndroidやArduinoを使うものがあります。
アルゴリズムの解説をしている資料を見つけました。
これを読むと、単に閾値を超えた値を検出するだけではなく、次のようなことをやっているようです (上記記事「アルゴリズム」節の「歩行パラメータ」を参照)。
- 入力データの平滑化。
入力データをローパスフィルタに通して、細かい振動などのノイズを除去します。デジタルフィルタのブロック図 (図4) がありますが、これは入力データの移動平均を取るのと同等の処理です。プログラムで実現できるでしょう。
- 動的に閾値を決める。
適当な数のサンプルについて平均値 (中央値) を算出し、これを閾値として次のサンプルを調べます。閾値の算出に使うサンプルの範囲を時間軸にそってずらしていきます。このように「時間窓」を用いて動的に閾値を変えていくことで、歩行で生じるのとは違う周期の加速度変化 (乗り物の揺れなどでしょうか) を排除できるそうです。資料ではサンプル数の基準として、歩行2歩分の時間間隔を用いています。
- 閾値と入力を比較して一歩を判定する。
閾値をまたいで加速度が変化 (減少) したら、一歩が踏み出されたと判定するとのことです。閾値を超えたかどうかではなく、いったん超えたものが元に戻ってくるところで判定するのが味噌のようです。
ブロック図 (図6) がありますが、これもプログラムで実現できるでしょう。
- カウント調整。
誤検出を減らすため、データの変化を一般的な歩行のパターンと照合します。最初の数歩がパターンにマッチするまではカウントを開始せず、確認できたら最初からのカウントをまとめて加算します。
デジタル式ならではの処理で、高精度を実現できそうです。ここまでできれば完璧ですね。
上記のうち4. はかなり高度ですが、3. までやるだけでも、機械式の歩数計と同程度の精度にはなるのではないかと思います。
ちなみに、この資料では傾きの影響を避けるために、加速度ベクトルの大きさを求める (質問者さんがおっしゃっている方法) のではなく、単に3軸の値のうち絶対値が最大のものを採用するという方法をとっているようです。精度は落ちるかもしれませんが計算は簡単になるので、試してみる価値はありそうですね。
私が気になった点としては、加速度計から入力されるデータは重力によって下向きに1Gのオフセットがついているはずで、これが精度に影響を与えないか、ということがあります。ただ、走っているときの加速度変化の例のグラフ (図3) は振幅が2G強ありますから、重力の影響を無視してもそこそこうまくいくのかもしれません。
なお、実用的な感度と精度を得るにはパラメタチューニングは必須のようです。チューニングの経験を語った記事がありました。
なおこの記事の製品では、精度を上げるために、地磁気センサと併用して垂直方向を検出することもしています。