Принцип Определения Дальности Между UWB Трансиверами (Конечный Автомат Для DS-TWR)

от автора

#Decawave #DW1000 #DWM1000 #DS-TWR #APS013 #Техникум

Существуют радио трансиверы, которые умеют измерять точное время отправки и приема бинарных радио пакетов. Под словом точно подразумевается, что с дискретизацией 15ps. В качестве примера можно привести ASIC DW1000. Эта очень полезная функция так как открывает дорогу для измерения расстояния между трансиверами.

Про чип DW1000 можно почитать тут.

Что надо из доков?

#

Doc Name

pages

Version

Code

1

The implementation of two-way ranging with the DW1000

15

2.3

APS013

Определимся с терминологией:

1) Initiator — он же Tag UWB трансивер, который начинает TWR сессию для измерения расстояния. Именно Tag первый посылает Poll пакет.

2) Responder — он же Anchor(якорь) — UWB трансивер который слушает сообщения от Tag(а). Обычно Anchor неподвижные. Поэтому такое и название, так как якорь обычно очень тяжелый.

3) Blink Message — это своего рода Hello пакет, чтобы Tag мог понять топологию беспроводной сети. Кто еще присутствует в сети кроме него. Обычно внутри blink пакета преамбула 0xC5, порядковый номер пакета, Tag ID и контрольная сумма. Тут нет никакой полезной нагрузки.

4) Ranging Init message ( function code: 0x20)- сообщение согласия на соединение. Отправляет Anchor. Содержит преамбулу 0x8C41, порядковый номер, адрес Anchor(а) (отправителя), адрес приёмника (Tag(a)), контрольную сумму CRC16.

5) Poll message (function code: 0x61) — пакет начала SS TWR сессии. Отправляет Tag. Состоит из преамбулы 0x8841, порядкового номера, адреса отправителя, адреса получателя, контрольной суммы CRC16.

* тут стоит добавить, что в Poll пакет так и хочется добавить какой-нибудь payload, например, данные предыдущего измерения или chat между UWB узлами, однако в спеке от Vendor про это нет выделенного поля внутри poll.

6) Response message (function code: 0x50) — пакет ответа SS TWR сессии. Отправляет Anchor. Состоит из преамбулы 0x8841, порядкового номера, адреса отправителя, адреса получателя, контрольной суммы CRC16.

Можно обобщить и упростить DecaWave протокол до такого формата пакета.

структура UWB пакета

структура UWB пакета

В UWB как и в BlueTooth есть такое понятие как pairing(соединение). После подачи питания Tag раз в секунду посылает blink пакет и слушает эфир в ожидании ответа. В свою очередь Anchor после подачи питания принимает blink пакет и отправляет согласие на pairing(соединение).

Однако сам по себе чип DW1000 на аппаратном уровне не умеет вычислять TOF, которое фигурирует в формуле вычисления расстояние между трансиверами.

Вычисление TOF это чисто программная работа которая должна осуществляться на уровне Firmware.

Про принцип измерения дальности между двумя радио трансиверами уже был текст тут.

Но тот метод SS-TWR дает низкую точность измерений так как не учитывает нестабильность кварцевых резонаторов. Для компенсации нестабильности кварцевого резонатора на двух экземплярах UWB трансиверов применяют технологию DS-TWR.

Про вывод формулы вычисления дальности с учетом компенсации нестабильноси частоты кварцевых резонаторов есть вот этот текст.

Формула вычисления времени распространения радиоволны

Формула вычисления времени распространения радиоволны

Вот временная диаграмма одной сессии измерения дальности при протоколе DS-TWR.

DS-TWR сессия состоит из двух симметричных SS-TWR фаз (phase1, phase2). Каждая фаза это по сути обыкновенный SS TWR.

Как реализовать протокол DS-TWR в коде? Тут просто напрашивается конечно автоматная методология разработки ПО.

Вот так выглядит конечный автомат для управления сессией измерения дальности.

Толстой линией показан успешный цикл выполнения конечного автомата.

Если запустить протокол DS-TWR на чипах DW1000 прямо из коробки, то алгоритм показывает расстояние больше, чем есть на самом деле. Порядка 155 метров, когда как на самом деле расстояние порядка 2 метров. В спеке сказано, что трансиверы DW1000 надо калибровать. Стоит отметить, что измеренный ToF содержит в себе время запаздывания распространения сигнала в антенне при отправке и при приеме. Поэтому при пересчете измеренного ToF в метры и получится большое число метров. Трудность в том, что это внутреннее время распространения еще и варьируется между экземплярами чипов DW1000. Также на это влияют пассивные компоненты в аналоговой цепи антенны. Для учитывания этого и делают калибровку устройства.

Для калибровки запаздывания антенны необходимо собрать импровизированный стенд. Пришлось не только программировать, но и чертить, бегать по строительным рынкам, клеить, сверлить, резать на 100W(ном) лазерном резаке, затачивать рашпилем углы металла и конечно же шкурить. Подробнее по изготовление механики написано тут https://habr.com/ru/articles/709932/
В результате получилась такая установка.

Стенд для калибровки UWB. Расстояние между антеннами 0.89 m

Стенд для калибровки UWB. Расстояние между антеннами 0.89 m

Еще пригодился прототип с графическим монохромным экранчиком ssd1306

После первых экспериментов с измерением дальности по UWB получилась точность измерения порядка +-0,3…0,45м.

Стоит заметить, что конечное расстояние рассчитывается на стороне initiator трансивера. При этом расстояние полезно знать и на стороне responder узла. В связи с этим в самый первый пакет poll имеет смысл инкапсулировать данные измерений от предыдущей DS-TWR сессии измерения.

Таким образом приложения на обоих узлах смогут пользоваться этой ценной метрикой как расстояние между трансиверами.

Сам результат измерения можно извлечь через интерфейс командной строки CLI по UART. Вот пример разброса метрик при измерении расстояния от стены до стены в квартире.

Как видите DS-TWR в самом деле даёт меньший разброс расстояния. Подробнее про вывод формулы для DS-TWR можно почитать тут https://habr.com/ru/articles/723594/

Как измерять расстояния до нескольких узлов?
Надо измерять по очереди, чтобы не запутаться с TimeStamp(ами). Надо знать сколько узлов вообще существует в сети. Можно в конфиги прописать структуру сети. Список узлов и их номера. В условиях разработки информация про количество узлов статическая. В Poll сообщении указывать ID узла к которому происходит обращение. Responder отвечает только тот у которого ID совпал с тем ID, что в сообщении. initiator опрашивает все узлы по очереди, кроме своего ID. Свой ID берется из FlashFS.

Трудности при работе с UWB

1— UWB пакеты иногда теряются в эфире. Максимальный поток редко превышает 70 пакетов за раз. Из-за это конечный автомат DS-TWR сбрасывается по таймауту и измерение происходит по новой. Происходит рассинхронизация между конечными автоматами на стороне initiator(а) и конечным автоматом на стороне responder(а).

2—Отчёты прыгают. Иногда упрыгивают на 2 метра в сторону. Вероятно это из-за того что таймер внутри DW1000 переполняетcя каждые 17 секунд. Нужен цифровой фильтр, чтобы сглаживать разброс измерений расстояния.

3—DS-TWR работает рывками. То он быстро делает серию 5 измерений в секунду, то конечный автомат рассинхронизовывается на 10 секунд.

4—Надо много UWB node. Из-за дефицита чипов я не мог купить 10 плат одного и того же вендора. Приходилось строить тестировочные UWB Node(ы) из подручных отладочных плат, из разных микроконтроллеров. Одно и то же UWB приложение запускать на разных электронных платах. Для каждой писать сборки MBR, BootLoader, Generic и прочее.

5—UWB надо калибровать. От качества калибровки зависит точность измерений. Просто из коробки модуль DWM1000 покажет расстояние около 155 метров, когда как на самом деле расстояние порядка двух метров. Для калибровки нужен полигон длинной до трех сот метров со шкалой на земле. Это может быть например футбольное поле или теннисный корт.

Несколько фактов про UWB

1—UWB радиосигнал просачивается через стекло.

2—Дальность UWB радиосвязи получилась не более 79 метров.

3—При помощи UWB можно измерять расстояние между трансиверами с точностью -+ 20см

Вывод

Если трансивер позволяет определять время отправки и приема радиосигнала, то можно вычислить расстояние между радио трансиверами прибегнув к протоколу DS-TWR. На модулях DWM1000 удается измерять расстояние с точностью порядка -+25см.

Словарь

Акроним

Расшифровка

DS-TWR

Double Side Two Way Ranging

SS-TWR

Single Side Two Way Ranging

ПО

Программное обеспечение

UWB

Ultra-wideband

FCS

Frame CRC

CRC

Cyclic redundancy check

ASIC

Application-Specific Integrated Circuit

TOF

Time-of-flight

TWR

Two-Way Ranging

Links

Вывод формулы для двустороннего определения дальности между UWB трансиверами https://habr.com/ru/articles/723594/

Принцип определения дальности между радио трансиверами
https://habr.com/ru/post/719542/

Официальная документация на трансивер DW1000, 3.5 — 6.5 GHz Ultra-Wideband (UWB) Transceiver IC with 1 Antenna Port https://www.qorvo.com/products/p/DW1000

Изготовление Макета для Прототипа (или Как Буравить Пластмаски) https://habr.com/ru/articles/709932/

Ultra Wideband Realtime Location System using ESP32 and Unity https://www.youtube.com/watch?v=-GNkobAxao0&list=WL&index=20&t=708s

18 Атрибутов Хорошего Канального Протокола Передачи Данных https://habr.com/ru/articles/682292/

Getting Started with ESP32 DW1000 UWB (Ultra Wideband) Module https://how2electronics.com/getting-started-with-esp32-dw1000-uwb-ultra-wideband-module/

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Вы работали с UWB трансиверами?

36.67% да11
63.33% нет19

Проголосовали 30 пользователей. Воздержались 4 пользователя.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Вы работали с трансивером DW1000?

28.57% да8
71.43% нет20

Проголосовали 28 пользователей. Воздержались 5 пользователей.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Вам удавалось воспроизвести технологию измерения TOF?

51.85% да14
48.15% нет13

Проголосовали 27 пользователей. Воздержались 6 пользователей.

ссылка на оригинал статьи https://habr.com/ru/articles/723822/