はじめに
屋内位置測位のPDR(歩行者自律航法)を使ったコードを書く上で1歩判定のコードを書いたので解説します.
PDRとは
PDRはPedestrian Dead Reckoningの略で
Pedestrianが歩行者、Dead Reckoningが自律航法という意味です.
Dead Reckoningとはフルノ製品情報サイトより以下のような説明があります。
ジャイロセンサーや加速度センサーなど、各種センサーからの情報と合わせて演算処理することにより、GPS(GNSS)単独では測位を続けることが難しい環境下でも、高い精度で測位できる技術がデッドレコニング(Dead Reckoning /自律航法)です。カーナビゲーションシステムでも多く活用されております。
センサ情報をもとに演算処理をすることで位置を求めるので、センサ情報の正確さが大事になります.
1歩判定
加速度センサの鉛直方向の値から1歩判定します.
概要
鉛直方向の出力は波のようになります.
この波の1周期で1歩という感じなので、この1周期の中の極大値か極小値を使えば、よさそうです.
仮に極大値にしきい値を設定すると
このようになります.
このしきい値を超えた時に1歩判定します.
解説
sikiti = 10.7
count = 0
not_first_pass = False
はじめに1歩判定用のしきい値を入れるsikiti、
何歩歩いたか数えるためのcount、
しきい値を超えたのが最初ではないと判定する用のnot_first_passを用意します.
if i < sikiti:
print("歩いていない")
else:
if not_first_pass == True:
print("歩いていない")
elif not_first_pass == False:
count += 1
not_first_pass = True
print(f"{count}歩目")
if not_first_pass == True and i < sikiti:
not_first_pass = False
ここで1歩判定を行います.
if i < sikiti:
print("歩いていない")
最初のif文でしきい値を超えたか超えていないか判定します.
else:
if not_first_pass == True:
print("歩いていない")
elif not_first_pass == False:
count += 1
not_first_pass = True
print(f"{count}歩目")
しきい値を超えていた場合、さらにif文で分岐します.
前回の値がしきい値以下で、今回の値がしきい値を超えた時に1歩とカウントするためです.
そのため、しきい値を超えた値が連続すると最初の値以外では1歩とカウントされないようになっています.
if not_first_pass == True and i < sikiti:
not_first_pass = False
そして、最後のif文で前回の値がしきい値以上で、今回の値がしきい値を下回ったにnot_first_passをFalseにします.
試しに
これですべての解説ができたので、
num = [10.6, 10.7, 10.8, 10.5, 10.4, 12.2]
試しにこのようなリストの値を用意して1歩判定させてみます.
sikiti = 10.7
しきい値は10.7に設定したので、リストの3つ目の10.8と12.2で1歩判定するので、
歩いていない
1歩目
歩いていない
歩いていない
歩いていない
2歩目
このように2歩と出力されます.
おわりに
今回は1歩判定のコードについて解説しました.
鉛直方向の値だけを使った実装をしましたが、3軸センサであればもっと精度の高いコードがかけると思うので、機会があれば作ってみたいと思います.
ここまで読んでいただき、ありがとうございました.