Подсчет количества кругов по GPS-координатам - PullRequest
3 голосов
/ 29 января 2011

У меня есть файл GPX с большим набором точек (долгота и широта отсортированы по времени), как я могу рассчитать, сколько кругов содержит мой набор?

GPS записывается во время сеанса кольцевых гонок.

Круг - это количество раз, когда автомобиль проходит начало / конец цепи.

Ответы [ 2 ]

4 голосов
/ 30 января 2011

Предположим, что дорожка достаточно мала, чтобы мы могли предположить, что точки лежат в плоской плоскости, например, мы можем игнорировать кривизну Земли. В этом случае вы можете преобразовать все точки в точки на плоскости, например, P (i) = (x (i), y (i)) без z-координаты.

Рассмотрим следующий алгоритм: найдите точку C = (Cx, Cy), которая находится где-то посередине пути, например, центр тяжести всех точек. Точная позиция не имеет значения. Затем представьте, что наблюдатель стоит в точке C и всегда вращается лицом к автомобилю. Вы хотите посчитать, сколько раз наблюдатель вращается во время движения автомобиля.

Чтобы сделать это, вы должны быть в состоянии найти угол со знаком, который будет вращать наблюдатель, когда транспортное средство движется между двумя соседними точками P (i) и P (i + 1) в списке точек. Это то же самое, что найти угол со знаком между векторами P (i) - C и P (i + 1) - C, что можно сделать с помощью перекрестного произведения . Это особенно легко, так как у нас есть двумерные точки. У нас есть

P = (x (i) - Cx) * (y (i + 1) - Cy) + (x (i + 1) - Cx) * (y (i) - Cy)

Если P положительный, то наблюдатель вращается против часовой стрелки, а если он отрицательный, наблюдатель вращается по часовой стрелке. Угол поворота наблюдателя составляет

тета (i, i + 1) = арксин (P / (длина (x (i) - C) * длина (x (i + 1) - C)))

, где снова тэта (i, i + 1) положительна или отрицательна в зависимости от того, в каком направлении вращается наблюдатель.

Здесь мы используем, что соседние точки расположены близко друг к другу, так что наблюдатель просто поворачивается на небольшой угол меньше, чем pi / 2, между соседними точками.

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

Для по-настоящему гиков, это просто вычисление числа обмоток пути транспортного средства вокруг C, используя определение.

2 голосов
/ 29 января 2011

Для решения этой проблемы потребуются некоторые пробные версии и ошибки, поскольку это во многом зависит от качества данных и количества имеющихся у вас точек данных.

Если точки данных взяты с высокой частотой, может быть достаточно использовать тест пересечения линии . Если линия, образованная двумя соседними точками данных, пересекается с финишной линией на гоночной трассе, то вы можете считать это кругом. Это, однако, не удастся, когда точки данных слишком далеко друг от друга. Также может произойти сбой, если автомобиль покинет трассу на финишной прямой, если вы не будете осторожны с решением.

Более общее решение - разделить дорожку на два полигона, каждый из которых представляет половину дорожки. Сделать их освещение включенным вне пути. Затем используйте точку в полигональных тестах, чтобы определить, какие точки данных находятся в какой половине дорожки. Затем итерируйте по точкам и обратите внимание на то, когда машина движется от одной половины к другой. Каждый второй переход должен указывать на круг. Это, однако, потерпит неудачу, если автомобиль выйдет из-под контроля и начнет колебаться между двумя половинами, не обойдя полный круг.

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

...