android - Wi-Fi положение триангуляции



ios algorithm wifi triangulation (4)

Мне нужно понять, как в принципе работает триангуляция Wifi. Сцена изображена на рисунке выше. Чтобы реализовать триангуляцию Wi-Fi, мне нужно минимум 3 точки доступа Wi-Fi и их позиции. Настройка:
1. Для простоты давайте предположим, что у меня есть площадь 1 кв. Км на 1 кв. Км , и у меня есть 3 точки доступа Wi-Fi в этой области. Система координат выглядит следующим образом: 1 угол площади квадрата равен (0,0,0), а самый дальний угол по диагонали будет иметь координаты (1,1,1). Все определения положения должны выполняться только относительно этой системы координат (для простоты я не хочу глобальные координаты XYZ). В рамках этого у меня есть 3 точки доступа Wi-Fi в (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 делает это так точно?
Второй вопрос Что-нибудь еще требуется?

Спасибо!


Answers

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


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

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


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

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

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

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


Система сборки Gradle предназначена для поддержки сложных сценариев при создании приложений для Android:

Мультираспределение : одно и то же приложение должно быть настроено для нескольких клиентов или компаний

Multi-apk: поддержка создания нескольких apk для разных типов устройств при повторном использовании частей кода





android ios algorithm wifi triangulation