Как определить местоположение пользователя с 3 узлами с помощью триангуляции?

Я пытаюсь найти пользователя по его силе Bluetooth (значение RSSI).

У меня есть 3 Raspberry PI, каждый из которых собирает уровень сигнала пользователя. Допустим, узлы вернулись:

node1 = 65
node2 = 70
node3 = 75

Как мне найти пользователя с помощью триангуляции, указать его на карте и вывести значение RSSI?

Я исследовал Trilateration и Теорема Чевы, но не знаю, как их реализовать.

Я не знаю, как найти узлы в среде, задать ли основному узлу координаты x=0 y=0 и что дать двум другим узлам?


person Jonathan Davies    schedule 21.11.2014    source источник


Ответы (2)


Ваш подход основан на некоторых надуманных предположениях.

Трилатерация определяет положение в пространстве на основе трех (или четырех, если работает в трех измерениях) измерений расстояния до известных местоположений. Триангуляция определяет положение в пространстве на основе трех угловых (в каком направлении идет сигнал) измерений до известных местоположений. Три узла Raspberry PI зафиксированы в пространстве, и у вас есть некоторая система измерения, в которой известны ваши (x, y (z)) позиции для каждого.

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

Предполагая, что вы работаете на пустом складе, сначала вам нужно выбрать некоторую систему координат, выполнить некоторые измерения и назначить местоположения своим узлам. Обнуление одного узла упрощает одно из ваших измерений, вам просто нужно сделать относительные измерения по отношению к другим. Убедитесь, что ваши оси X и Y перпендикулярны.

Затем вы захотите сгенерировать некоторые данные, которые коррелируют RSSI с расстоянием. То есть отойдите на известное расстояние от узла и запишите значение RSSI. Если вам повезет, это измерение будет одинаковым для каждого из ваших узлов. Может и не быть - не все радио созданы одинаково. Кроме того, не все антенны излучают мощность равномерно в каждом направлении. Используйте эти данные и немного взмахов руками, чтобы приблизить расстояния от известных местоположений узлов; оттуда остальная часть реализации должна быть прямой геометрией (как, несомненно, изложено вики).

person Mikeb    schedule 21.11.2014
comment
да, а также распределение силы по расстоянию различно в разных направлениях ... не говоря уже о наличии другой антенны (даже приемной), которая может значительно испортить ситуацию. - person Spektre; 22.11.2014
comment
Привет @Mikeb. Этому сообщению более 1,5 лет, есть ли какие-либо улучшения в технологии сейчас, чтобы мы могли получать точные результаты в приведенном выше сценарии? - person Deepak Bhatia; 12.08.2016

Как говорится в ответе Майкеба, подход к поиску устройства по уровню сигнала не является хорошим способом (если у вас нет очень много узлов и вы хотите просто найти ближайший узел, например, телефонные соты расположены без GPS)

Альтернативой является проверка времени прохождения сигнала

  • для этого ваши расстояния или электроника должны быть достаточно большими/быстрыми, чтобы эта задача соответствовала желаемой точности.

    1. you have to have synchronized time
    2. отправленный пакет метки времени на целевое устройство с каждого узла (или непрерывный сигнал времени)
    3. получить 3 раза (по одному от каждого известного узла) за один раз (time_of_receive) на устройстве
    4. отправить все 3+1 раз на устройство, где нужна позиция
    5. convert time differences to distance
      • bigger the time-shift longer the distance ...
      • dtime = time_received_from_node-time_of_receive
      • если вы знаете время отправки, то это легко (dist = c * dtime) +/- влияние среды на скорость сигнала
      • если нет (как на GPS) то сложнее и надо искать время начала одиночной ноды со сдвига времени
      • можно с 3-х нод, но сложность брутфорса ужасная, так что чем больше нод, тем лучше
      • если ваш канал передачи данных не синхронный (или с задержкой), то точность может быть плохой и для коротких расстояний
    6. when you got the 3 distances then just solve intersection of 3 spheres
      • center is node and radius is the computed distance
      • вы должны добавить некоторое значение безопасности к радиусам, если пересечение не найдено из-за неправильно измеренного времени
person Spektre    schedule 22.11.2014
comment
Обратите внимание, что 1 световая микросекунда составляет около 300 метров, типичный диапазон Bluetooth составляет около 10 метров. Это означает, что вам потребуются временные разрешения порядка наносекунды, и тогда вам придется беспокоиться о дрейфе и дисперсии времени обработки, которые, как правило, убивают вашу способность измерять время полета. Хотя теоретически возможно! - person Mikeb; 25.11.2014
comment
@Mikeb да, я знаю, но это единственный известный мне надежный способ. Это можно сделать с помощью буферизованного приема FIFO, но вам потребуются тайминги с высоким разрешением и правильная настройка аппаратного обеспечения. Может быть, эхолокация больше подходит для этой задачи, но это не согласуется с этим вопросом. Мои старые эхолокаторы i8051 с частотой 20 МГц имели разрешение до 7 мм. - person Spektre; 26.11.2014