Я получаю обратный вызов с широтой и долготой, как мне лучше всего рассчитать «текущую скорость» и другие производные значения? - PullRequest
6 голосов
/ 22 января 2010

(я думаю, что этот вопрос не зависит от платформы, но я пишу код для Nexus One).

О «текущей скорости»: каждую секунду я получаю обратный вызов, сообщая мне, каковы мои текущие значения широты и долготы. Я могу рассчитать расстояние между текущим местоположением и предыдущим местоположением, чтобы отслеживать совокупное расстояние и суммарное время. С этим я могу сказать, какая средняя скорость была для ВСЕГО путешествия.

Но как рассчитать текущую скорость? Я подозреваю, что мне нужно использовать самые последние образцы N, верно? Думаю ли я об этом правильный путь? Что такое хорошее эмпирическое правило для N? Сколько сэмплов или сколько секунд назад?

О "времени остановки": Если я просто стою на месте, мне все равно могут сообщаться немного разные широты и долготы, верно? Итак, решение о том, что я на самом деле не двигаюсь, означает сказать что-то вроде: «все предыдущие X locs были в пределах Y метров друг от друга», верно? Думаю ли я об этом правильный путь? Что такое хорошее эмпирическое правило для X и Y?

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

РЕДАКТИРОВАТЬ: Я извиняюсь: я чувствую себя плохо из-за траты времени людей и доброй воли, но, к сожалению, устройство IS дает мне скорость. Я думал, что это не потому, что в эмуляторе это было не так, но на реальном устройстве это так. Спасибо всем. Мне все еще нужно написать некоторый эмпирический код, но самая большая проблема была в скорости.

РЕДАКТИРОВАТЬ: я убираю извинения. В своем первоначальном вопросе я написал, что расстояние тоже является производным значением. Если я просто использую необработанные данные GPS, я буду чрезмерно преувеличивать расстояние из-за неточностей. Я мог бы идти по прямой линии, но необработанный широта / долгота GPS будет колебаться, поэтому, если я вычислю общее расстояние, измерив расстояние между точками, я буду его преувеличивать. Вот несколько ссылок, связанных с этой проблемой.

Гладкие данные GPS
http://www.cs.unc.edu/~welch/kalman/Levy1997/index.html
Как разумно ухудшать или сглаживать данные ГИС (упрощающие полигоны)?
Как «сгладить» данные и рассчитать градиент линии?

Ответы [ 5 ]

3 голосов
/ 22 января 2010

Запомните краткую историю позиции, возвращаясь на несколько секунд назад. 5 секунд должны дать вам достаточно точный результат, который обновляется довольно быстро ...

// delay is the time difference between the 2 samples you have
delay = 5;   // 5 second delay

// figure out how far along x and y we have moved since last time
dx = newx - oldx;
dy = newy - oldy;

// distance travelled
distance = sqrt(dx*dx + dy*dy);

// find the speed. if the positions were measured in metres and the time in seconds
// this will be the average speed in metres per second, over the last 5 seconds
speed = distance / delay;

Чем дольше вы можете ждать между выборками (например, если вы сохраняете последние 30 выборок позиции и используете 30-секундную задержку), тем более устойчивым будет ваш ответ (т. Е. Чем меньше будет шум), тем медленнее это будет реагировать на любые изменения скорости.

Зачем вам нужно добавить эту задержку? Ну, GPS-модуль в вашем телефоне, вероятно, не очень точный. Если вы стоите на месте, позиция, которую он возвращает каждую секунду, может колебаться относительно неплохо. Этот шаткий шум создаст впечатление, будто вы бегаете по комнате случайным образом, и может заставить вас сообщить об умеренно высокой скорости, даже если вы вообще не двигаетесь. Решение, которое я перечислил, не очень поможет, когда вы стоите на месте, так как результат 30 секунд назад будет таким же неправильным, как и позиция 1 секунды назад. Что вам действительно нужно сделать, так это усреднить позицию за некоторое время, а затем сравнить ее со средней позицией за несколько более раннее время. например ...

Взять 10 образцов позиции и усреднить их. Это позиция 1.
Возьмите еще 10 образцов и усредните их. Это позиция 2.
Используйте эти 2 позиции с кодом выше, чтобы получить скорость.

Опять же, чем больше выборок вы сможете взять, тем точнее и стабильнее будут ваши позиции, но это сделает ваше измерение скорости менее отзывчивым.

2 голосов
/ 22 января 2010

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

Например, фильтры Калмана просты в установке и настройке и, как правило, достаточно хороши для практических задач.

Кроме того, не пытайтесь сгладить или усреднить сигнал GPS - приемник GPS делает это сам. Вместо этого используйте фильтр по ожидаемым ускорениям транспортного средства (или человека).

Наконец, мгновенная скорость может быть рассчитана по сдвигу частоты, если вы можете получить эту информацию.

1 голос
/ 22 января 2010

о текущей скорости: большинство устройств GPS отправляют вам эту информацию самостоятельно

1 голос
/ 22 января 2010

Что касается «срезания углов», вы всегда можете аппроксимировать кривую (используя сплайны или реальное превышение - регрессия), в противном случае я думаю, что вы на правильном пути.

Что касается количества выборок и стояния, вместо того, чтобы брать постоянную N, я бы посмотрел на отклонение выборок.

0 голосов
/ 22 января 2010

Текущая скорость - это разница между положением (сейчас) и положением (предыдущим), поэтому для получения текущей скорости вам нужно только сравнить текущую и последнюю позицию.

НО: поскольку это довольно уязвимо для небольших неточностей в отслеживании времени / позиции, оно ненадежно, поэтому вам нужно усреднить его по последним позициям. Сколько зависит от варианта использования, чем больше период времени, тем меньше «текущая» скорость, но тем точнее она является.

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