Триангуляция позиции Wi-Fi - программирование
Подтвердить что ты не робот

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

enter image description here

Мне нужно понять, как работает триангуляция 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 сделать это так точно?
Второй вопрос: Я считаю, что приведенные выше данные являются достаточными. Есть ли что-нибудь еще?

Спасибо!

4b9b3361

Ответ 1

Это довольно легко. Это всего лишь некоторые основные математики. Разделите его на 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. Все это доступно через android api. Я думаю, вам нужно устройство 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 являются одной и той же моделью, и они обычно находятся в крупных объектах/компаниях, но даже тогда это не так уж и важно. Изменчивость настолько мала, и если вам не нужна безумная точность, это не имеет значения.

Ответ 2

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

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

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

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

Ответ 3

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