GPSから移動平均速度を計算するには?

私はGPSを使ってアンドロイドアプリケーションを開発しています。私はユーザーの平均速度を1/5/15分にわたって表示する機能を実装したいと考えています。 unix上のCPU負荷のようなもの。 2番目に移動した距離を累積することで平均を簡単に計算し、それを経過時間で割りますが、移動平均を計算するスマートな方法は考えられません。

明らかに、最も古い値を削除しながら、1秒ごとに配列の最後と現在の位置の間に距離を置くことでIDを取得できます。

私はこれを行うきちんとした方法を探しています。

1

2 答え

かなり簡単に進むことができます。

あなたが1秒ごとにサンプリング位置を決めている場合、901サンプルをキューに入れておくと、15分の価値があります。 ポジション0は最新の測定値であり、事実上現在のポジションです。

最後のX分の平均速度:

s = X * 60;
point1 = postion_queue[0];//this is your current position
point2 = postion_queue[s];//this is your position s seconds ago
d = distance_between_points(point1, point2);
speed = d/s;

speed is now distance units per second, convert to mph, or kph or whatever units you need. Different values of X can be used for any average between 1 and 15 minutes.

4
追加された

すでに提案したように、すべての値をすべての期間にわたって保存する必要があります。その理由は、移動平均に古い値の寄与を「忘れる」必要があるからです。これらの値がどこに格納されているかわからない場合(つまり、格納していない場合)は、正確に行うことはできません。

あなたの場合、15分ごとに1秒間に1つの値が15 * 60 = 900のデータポイントになります。これは問題ありません。

更新するたびにアレイ全体で合計を実行する必要はないことに注意してください。データポイントの数、新しい値、その時点で「忘れている」値から新しい移動平均を計算することができます。

new_average = (n * old_average - x_forget + x_new)

ここで、 n はデータポイントの数(あなたのケースでは900)、 x_forget は「忘れている」値、 x_new は最新の値。その後、配列の先頭から x_forget をドロップし、最後に x_new を格納します。配列の代わりに、リンクされたリストを介して実装されたキューを使用することもできます。

2
追加された