Триангуляция положения Wifi
Мне нужно понять, как работает триангуляция Wifi. Сцена изображена на диаграмме выше. Чтобы реализовать триангуляцию wifi, мне нужно как минимум 3 точки доступа Wifi и их позиции. Настройка:
1. Для простоты, предположим, что у меня есть 1 кв. км на 1 кв. км область, и у меня есть 3 точки доступа Wifi в этой области. Система координат выглядит следующим образом: 1 угол площади квадрата равен (0,0,0), а диагонально самый дальний угол будет иметь координаты (1,1,1). Все определение положения должно выполняться только относительно этой системы координат (для простоты я не хочу глобальных координат xyz). В этом, у меня есть 3 WiFi горячих точек на (x1,y1,z1), (x2,y2,z2), (x3,y3,z3).
2. У нас есть человек с устройством, способным принимать сигналы wifi и вычислять силу сигнала в позиции (x,y,z). Устройство может быть телефоном, планшетом и т. д.
проблема: Вычислите положение (x,y,z) человека динамически, поскольку они перемещаются, когда у вас теперь есть следующие входы:
1. Сила сигнала сигналов, полученных от каждой из горячих точек wifi
2. Координаты точек доступа wifi, ранее сохраненные в переменных или базе данных.
Первый Вопрос: Как рассчитать положение сверху входов? Я предполагаю, что сила сигнала прямо пропорциональна расстоянию от маршрутизатора, но какая связь? Как Скайхок сделать это так точно?
Второй Вопрос: Я считаю, что выше входы. Что-нибудь еще требуется?
спасибо!
3 ответов
Это довольно легко. Это просто элементарная математика. Разбить его на 2 части:
1) Поиск горизонтального местоположения (без высоты).
чтобы найти свое местоположение, вам нужно 3 очка, но просто сосредоточьтесь на 2 очках на секунду. используя 2 точки, вы можете создать треугольник с собой и найти свое местоположение на основе силы сигнала между двумя точками. Это выяснит, где вы находитесь между двумя маршрутизаторами. Например, если вы находитесь между маршрутизаторами 3 и 4, и ваша сила сигнала по сравнению с 3 -89, а ваша сила сигнала до 4 -54, вы знаете, что вы ближе к 3, чем к 4. Если вы сделаете аппроксимацию расстояния против силы сигнала, вы можете придумать довольно точное чтение того, где вы находитесь между маршрутизаторами 3 и 4. Проблема, оставшаяся после этого, определяет, на какой стороне вы находитесь между 3 и 4, так как вы можете иметь одинаковые значения силы сигнала (-89, -54) выше или ниже маршрутизаторов (посмотрите на диаграмма)
6
You could be here
3--------------------------4
You could also be here
5
затем просто найдите другой маршрутизатор и обратите внимание на уровень сигнала. Вы должны быть в состоянии определить, на какой стороне вы находитесь довольно легко, просто взглянув на отношения силы сигнала между 5 и 6 маршрутизаторами (на диаграмме).
2) Вы можете сделать то же самое с высотой.
чтобы сделать все вышеперечисленное, вам действительно нужно только приближение расстояния против силы сигнала и расстояния между маршрутизаторами. Из моего тестирования (I написал свой собственный код триангуляции WiFi), сила сигнала довольно однородна на мобильных устройствах, поэтому одно устройство должно иметь те же результаты, что и устройство рядом с ним.
skyhook делает это, я думаю, либо через GPS-позиционирование (оно может быть жестко закодировано), либо в основном тот же принцип, что и этот. Skyhook-единственная служба, одобренная apple для этого, поэтому Apple в основном сделала то же самое, а затем убедилась, что другие приложения не могут ее использовать (любое приложение iPhone, которое использует ограниченная библиотека 80211, содержащая функции для этого, будет запрещена из app store).
Edit: как найти расстояние:
вам нужно сделать несколько простых приближений. Эти приближения не будет, все же в зависимости от вашей среды, так -89 ноги может означать, что Вы 15 футов от маршрутизатора 3, но -89 от маршрутизатора 4 может означать, что Вы 13 метров. Неважно, что вы делаете, это не будет на 100 процентов точны, но это нормально, потому что вы можете получить в пределах 5 футов наверняка.
Итак, вы находите кучу точек, где вы получаете показания от -89 с маршрутизатора 3, и вы записываете, какое расстояние было. Затем вы берете среднее, и вы используете это среднее, чтобы записать в свою базу данных (которая говорит, когда вы -89 от маршрутизатора 3, Вы 15 футов). Затем вы делаете это для других значений, таких как -50 или что-то еще, и вы записываете свои значения и находите среднее. Теперь, если -89 означает, что вы в 15 футах, а -50 означает, что вы 25 футов (просто пример), вы должны приблизить свое расстояние, когда вы -75 от маршрутизатора 3, Если вы не хотите получить приближение вручную для -75. Это было бы громоздко для тонн значений, но вам придется поэкспериментировать, чтобы увидеть, насколько точно вы можете быть с таким количеством точек данных, как вы можете получить. Вы можете приблизиться между двумя средними значениями силы сигнала, понимая, что сила сигнала логарифмична, поэтому вы можете оценить, что, поскольку -89 составляет 15 футов, то -75 будет логарифмически (база 10 или база 2, я не помню, но я склоняюсь к базе 10) дальше, чем -89 в 14/100 раз.
Edit: запрос кода
у меня где-то код, но это было пару лет назад, поэтому мне придется перерыть много вещей, чтобы найти его. Я думаю, что концептуально это должно быть легко повторить без кода. Мне потребовалось около 50 строк кода java для устройств android, которые я тестировал.
по существу я взял телефон android и создал приложение, которое позволяет мне в любой момент отображать текущий идентификатор подключенного устройства wifi, его уровень сигнала, другие близлежащие идентификаторы wifi и их уровень сигнала, а затем местоположение GPS. Все это доступно через api android. Я думаю, вам нужно устройство android на API 4 или выше или что-то еще. Это было как 3 или 4 года назад, поэтому я просто выбрасываю это из того, что я помню.
часть местоположения GPS должна была сделать отображение между физической и wifi силой проще, вместо того, чтобы создавать схему карты моего объекта каким-то другим способом, я мог бы просто иметь Google maps сделать это для меня в то же время, так как я могу наложить их карту и координаты GPS по существу, создавая карту расстояния. Вам все равно понадобится карта глубины для отображения уровней пола, что мы можем сделать вручную довольно легко, найдя, если вы находитесь в середине двух маршрутизаторов. Мы знаем, что сила сигнала сильнее к WiFi хабы на том же этаже, а затем можете проверить по убедитесь, что у вас есть более слабые сигналы к концентраторам wifi на разных этажах. Эта карта глубины по существу представляет собой список WiFi-концентраторов и их соответствующих этажей. Нам не нужны их позиции, так как мы можем наилучшим образом соответствовать силе сигнала к местоположениям GPS, которые мы захватили, когда ходили по объекту и захватили силу сигнала к определенным концентраторам. Это простая математика. Поэтому для 2D-плоскости, глядя сверху вниз, у нас есть куча таких объектов:
BestFitObject{
Tuple<long, long> GPSLocation;
List<Tuple<WifiDevice, signedInt>> WifiReadings; //WifiDeviceName(through UUID or some other way), tupled with the signalStrength when that bestFit reading was taken
}
WifiDevice{
UUID ID; //Think a string should work fine, might be an internal type that encompasses UUID which woudl be better.
int floorNumber;
Tuple<long, long> GPSLocation; //Not entirely necessary, could provide better accuracy though
}
и тогда, когда мы пингуем клиентское устройство и хотим наилучшим образом соответствовать ему, он возвращает такой объект:
ClientPosition{
List<Tuple<UUID, signedIt> NearbySignals; //Tuple of the UUID of the wifi device and the signal strength taken during the time of the ping.
}
потом мы легко можем лучше подойдет наш ClientPosition на 2D-карте, которую мы создали с двумя объектами.
выше довольно просто, и карта глубины еще проще, на мой взгляд.
В идеале, вы хотите попробовать и ударить пару разных устройств, которые охватывают пару разных беспроводных технологий (некоторые устройства a, некоторые устройства b, n, g и т. д.), Чтобы получить более точный результат. Однако я обнаружил, что точность не так уж важна, и вы будете в пределах 5 футов или около того. Это было достаточно точно для моих нужд. В идеале, все WiFi-концентраторы-одна и та же модель, и они обычно находятся в крупных объектах/компаниях, но даже тогда это не так важно. Изменчивость настолько мала, и если вам не нужна сумасшедшая точность, это не будет иметь значения.
Ну, это сигнал, поэтому его интенсивность будет падать на квадрат расстояния. См. Закон Обратных Квадратов
Android собирается дать вам силу сигнала в dBm. Я не знаком с этим устройством, но если это что-то вроде звуковых децибел, это не линейная шкала. Ты захочешь учесть это.
в идеальном мире поля будут достаточно однородными для чистых измерений, чтобы дать вам расстояние, но если вы делаете это через любой металл, что бы там ни было, может стать уродливым. Кроме того, внутренняя конфигурация wifi-радио вашего устройства может сделать его более чувствительным в определенных направлениях. Я не инженер или что-то вроде того, поэтому я не знаю, в какой степени эти вещи повлияют на конечный результат. Это может быть несущественно.
наконец, для трехмерного местоположения, я считаю, что вам нужно четыре опорные точки. Если все точки расположены на одной высоте, вы все равно можете найти свой горизонтальном положении. Если они нет, вы найдете свое положение на плоскости, на которой они находятся, что может быть недостаточно точным для вас в зависимости от того, насколько крут этот самолет.
даже не беспокойтесь о преобразовании DBm в расстояние. Радиосигналы путешествуют со скоростью света (почти), за исключением некоторого затухания из-за факторов окружающей среды. Итак, если вы можете "пинговать" устройство, вы можете получить общее представление о его расстоянии. Учитывая всенаправленную антенну известного местоположения, вы можете использовать время, необходимое для получения ответа, чтобы построить радиус и нарисовать круг. Теперь, если вы сделаете это с нескольких устройств, круги будут пересекаться, что должно предоставить вам направление. Конечно, это все 2d. Вы могли бы сделать то же самое в 3d, но вместо этого вы бы рисовали сферы. Чем больше устройств у вас есть, тем более точным может быть местоположение.