Как рассчитать среднюю скорость движения по GPS? - PullRequest
1 голос
/ 19 декабря 2011

Я разрабатываю приложение для Android с использованием GPS. Я хотел бы реализовать функцию, которая отображает среднюю скорость пользователей в течение 1/5/15 минуты. Что-то вроде загрузки процессора на Unix. Я могу легко вычислить среднее значение, накапливая пройденное расстояние секунда за секунду, и разделить его на истекшее время, но я не могу придумать разумного способа вычисления скользящего среднего.

Очевидно, что я могу получить идентификатор, помещая расстояние между последней и текущей позицией в массиве каждую секунду, удаляя самое старое значение.

Я ищу аккуратный способ сделать это.

Ответы [ 2 ]

5 голосов
/ 19 декабря 2011

Вот один из способов, который довольно прост:

Если вы выполняете выборку каждую секунду, оставьте в очереди 901 выборку, это будет стоить 15 минут (и еще 1). Позиция 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 - это теперь единицы расстояния в секунду, конвертируемые в мили в час, или в км / ч, или любые другие единицы измерения, которые вам нужны. Для любого среднего значения от 1 до 15 минут могут использоваться разные значения X.

2 голосов
/ 19 декабря 2011

Вам нужно будет сохранить все значения за весь промежуток времени, как вы уже предложили. Причина в том, что вам как-то нужно «забыть» вклад старых значений в скользящее среднее. Вы не можете сделать это точно, если не знаете, где находятся эти значения (т.е. если вы их не храните).

В вашем случае, 1 значение каждую секунду в течение 15 минут составляет 15 * 60 = 900 точек данных, что должно быть в порядке.

Обратите внимание, что вам не нужно выполнять суммирование по всему массиву при каждом обновлении: вы можете вычислить новое скользящее среднее из числа точек данных, нового значения и значения, которое вы «забываете» в этот момент :

new_average = (n * old_average - x_forget + x_new) / n

Здесь n - это количество точек данных (в вашем случае 900), x_forget - это значение, которое вы «забываете», а x_new - это последнее значение. Затем вы отбрасываете x_forget с начала массива и сохраняете x_new в конце. Вместо массива вы можете использовать очередь, реализованную через связанный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...