Триангуляция позиции Wi-Fi

Введите описание изображения здесь

Мне нужно понять, как работает триангуляция Wi-Fi. Сцена изображена на диаграмме выше. Чтобы внедрить триангуляцию Wi-Fi, мне нужно как минимум 3 горячих точки Wi-Fi и их позиции. Настройка:
1. Для простоты предположим, что у меня есть площадь 1 кв. Км на 1 кв. Км , и у меня есть 3 точки доступа Wi-Fi в этой области. Система координат следующая: 1 угол квадратной области (0,0,0), а диагонально самый дальний угол будет иметь координаты (1,1,1). Все определения положения должны выполняться только по этой системе координат (для простоты мне не нужны глобальные координаты xyz). В этом случае у меня есть 3 точки доступа wifi в (x1, y1, z1), (x2, y2, z2), (x3, y3, z3).
2. У нас есть человек с устройством, способным принимать сигналы Wi-Fi и вычисляя силу сигнала в позиции (x, y, z) . Устройство может быть телефоном, планшетом и т. Д.
Проблема: динамически вычислять позицию (x, y, z) человека, когда они перемещаются, когда у вас теперь есть следующие входы:
1. Сила сигнала сигналов, полученных от каждой из точек доступа Wi-Fi
2. Координаты горячих точек Wi-Fi, ранее сохраненных в переменных или базе данных.

Первый вопрос: как мне рассчитать позицию с вышеперечисленных входов? Я предполагаю, что сила сигнала прямо пропорциональна расстоянию от маршрутизатора, но каково точное соотношение? Как Skyhook делает это так точно?
Второй вопрос: Я считаю, что приведенные выше данные являются достаточными. Есть ли что-нибудь еще?

Благодаря!

Это довольно легко. Это всего лишь некоторые основные математические соображения. Разделите его на 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) Вы можете сделать то же самое с высотой.

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

Skyhook делает это, я думаю, либо через GPS-позиционирование (это может быть жестко закодировано), либо в основном тот же принцип, что и этот. Skyhook – единственная услуга, одобренная для Apple, поэтому Apple в основном сделала то же самое, а затем убедилась, что другие приложения не могут ее использовать (любое приложение для iPhone, которое использует ограниченную библиотеку 80211, которая содержит функции для этого, будет Быть отказано в магазине приложений).

Изменить: Как найти расстояние:

Вам нужно сделать несколько простых приближений. Эти аппроксимации не будут одинаковыми в зависимости от вашей среды, поэтому -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 раз.

Изменить: запрашивать код

У меня есть код где-то, но это было пару лет назад, поэтому мне пришлось бы прорыть много вещей, чтобы найти его. Я думаю, что концептуально это должно быть легко реплицироваться без кода. Мне потребовалось около 50 строк кода Java для устройств Android, которые я тестировал.

По сути, я взял Android-телефон и создал приложение, которое позволяет мне в любой момент отображать текущий идентификатор подключенного Wi-Fi устройства, его уровень сигнала, другие близкие идентификаторы Wi-Fi и их уровень сигнала, а затем местоположение GPS. Все это доступно через api для Android. Я думаю, вам нужно устройство Android на API 4 или выше или что-то еще. Это было как 3 или 4 года назад, поэтому я просто выбрасываю это из того, что я помню.

Часть местоположения GPS заключалась в том, чтобы упростить сопоставление между физической и беспроводной сетью, вместо того, чтобы создавать карту чертежей моего объекта каким-то другим способом, я мог бы просто использовать карты Google для этого одновременно, так как я могу накладывать Их карта и координаты GPS в основном, создавая карту расстояния. Вам по-прежнему нужна карта глубины, чтобы отображать уровни пола, хотя мы можем сделать это довольно легко, обнаружив, что вы находитесь в середине двух маршрутизаторов. Мы знаем, что уровень сигнала сильнее всего для Wi-Fi-концентраторов на одном этаже, а затем можно дважды проверить, убедившись, что у вас есть слабые сигналы для концентраторов 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-карты, которую мы создали с помощью двух вышеуказанных объектов.

Вышеприведенное довольно простое, и карта глубины еще проще. На мой взгляд.

В идеале вы бы хотели попробовать несколько разных устройств, которые охватывают пару различных беспроводных технологий (некоторые устройства, некоторые устройства b, n, g и т. Д.), Чтобы получить более точные результаты. То, что я нашел, было то, что точность не такая большая, и вы будете в пределах 5 футов или около того. Это было достаточно точно для моих нужд. В идеале, все wifi-хабы являются одной и той же моделью, и обычно они находятся в крупных объектах / компаниях, но даже тогда это не так уж и важно. Изменчивость настолько мала, и если вам не нужна безумная точность, это не имеет значения.

Ну, это сигнал, поэтому его интенсивность будет падать на квадрат расстояния. См. Закон об обратной квадрате

Android даст вам силу сигнала в дБм . Я не знаком с этим устройством, но если это что-то вроде звуковых децибел, это не линейный масштаб. Вам нужно будет учитывать это.

В идеальном мире поля будут достаточно однородными для чистых измерений, чтобы дать вам дистанцию, но если вы делаете это через любой металл, все может стать уродливым. Кроме того, внутренняя конфигурация Wi-Fi-устройства вашего устройства может сделать его более чувствительным в определенных направлениях. Я не инженер или что-то еще, поэтому я не знаю, в какой степени это повлияет на конечный результат. Это может быть несущественным.

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

Даже не беспокойтесь о преобразовании DBm в расстояние. Радиосигналы движутся со скоростью света (почти), за исключением некоторого ослабления из-за факторов окружающей среды. Итак, если вы можете «пинговать» устройство, вы можете получить общее представление о его расстоянии. Учитывая всенаправленную антенну известного местоположения, вы можете использовать время, необходимое для получения ответа, чтобы построить радиус и нарисовать круг. Теперь, если вы сделаете это из нескольких устройств, круги будут пересекаться, что должно дать вам направление. Конечно, это все 2d. Вы можете сделать то же самое, что и в 3d, но вместо этого вы будете рисовать сферы. Чем больше устройств у вас есть, тем точнее местоположение.