Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Как обычно на 10+ году работы программистом микроконтроллеров мне наконец-то пригодилась математическая статистика из ВУЗ(овского) курса по теории вероятностей. Сейчас объясню почему...
Математическая статистика работает со случайными величинами. В данном случае случайной величиной является измеренное значение расстояния при помощи UWB трансиверов.
В этом тексте я изложил свой inside(рский) опыт работы с UWB. Тут я подвергнул тестированию модули DWM1000, исследовал показания расстояния, измеренные UWB трансиверами.
Зачем это всё надо?
Дело в том что UWB трансиверы надо калибровать. Просто из коробки DWM1000 не будут работать правильно. Надо знать значение смещения, чтобы вычитать его из результирующего измерения. Также можно прописать калибровочные константы в регистры компенсации запаздывания сигнала на керамических антеннах.
Все измерительные приборы неидеальные. Отклонения вызваны, в частности, нестабильностью техпроцесса производства компонентов из которых собирают разные экземпляры электронных устройств.
Определимся с терминологией
Точность - отдельные измерения могут сильно отличаться друг от друга. Это показывает ширина кривой распределения. Степень такого разброса данных и называется точностью измерения.
Погрешность - величина равная разности между истинным значением величины и измеренным значением.
Каков план?
Всё очень просто:
1--Установить 2 UWB трансивера на известном расстоянии D. Например D=107.5 сантиметра (+-3мм), как в моем случае.
2--При помощи UWB (DS-TWR) непрерывно произвести N сырых измерений расстояний и запомнить все измерения в памяти microSD карты.
3--Вычислить математическое ожидание Mu для N измерений по формуле (1).
4--Вычислить разницу (offset) между математическим ожиданием и реальным расстоянием D=107.5cm между UWB нодами.
5--Прописать разницу OffSet как калибровочные данные для данного пары трансиверов в NVRAM память прошивки микроконтроллера и пользоваться далее этой константой. OffSet и будет выступать в качестве погрешности.
6--Вычислить среднеквадратическое отклонение (СКО) по формуле (3). СКО даст нам количественную характеристику для измерения точности измерений. Чем больше CКО, тем ниже точность. Чем меньше СКО, тем выше точность.
Практическая часть
UWB трансиверы на самом деле сами по себе не измеряют расстояние. UWB чипы всего лишь показывают время отправки и время приёма бинарного радио пакета. Вычисление длительности пролёта радиоволны (TOF) это уже задача прошивки микроконтроллера, к которому присоединён трансивер. Про то как устроен алгоритм прошивки можно почитать тут https://habr.com/ru/articles/723822/ . Далее, умножая TOF на скорость света (с) мы и получаем расстояние между устройствами.
Для сбора статистики мне, естественно, нужно оборудование. Это, минимум, UWB передатчик, приемник, SD-карта. Плюс самая базовая аппаратная отладка: UART, LED, кнопка. В результате кристаллизировалась вот такая схема макета.
Тут две UWB ноды измеряют между собой расстояние и записывают измеренные значения на SD карту в текстовый файл с расширением *.csv.
В связи с этим также пришлось написать драйвер SD карты по SPI, подключить поддержку файловой системы FAT-FS, написать весь необходимый MCAL: Flash, GPIO, Timer, SPI, UART, SPI, PWM. Драйвер UWB трансивера я взял как есть с сайта производителя Qorvo. Также пришлось написать NVRAM для хранения калибровочных данных в on-chip NOR-Flash.
К счастью у нас были разработаны и произведены полностью твердотельные электронные платы со всей необходимой аппаратной начинкой: MCU, UWB, SD-micro, LEDs, Buttons + NDAs. Для изучения технологии UWB.
C этими board(ами) и будем проводить все эксперименты.
Постановка эксперимента с UWB измерениями сопряжена с калейдоскопом разнообразных накладных расходов и целой кучей нюансов. Оказалось что тут надо не только программировать, но ещё необходимо начертить, изготовить соответствующий конструктив. Организовать производство custom(ных) пластиковых деталей. Также надо было найти и закупить нужные комплектующие: метизы, крепёж, кабели. Проложить проводку. Скомпоновать стенд.
Наконец собрав и подключив всю эту аппаратуру к электропитанию я произвел 2117 непрерывных измерений одного и того же расстояния 107,5см. Вот, собственно, сырые исходные данные этого эксперимента
https://docs.google.com/spreadsheets/d/1yM0hzInoK0XOBK7-548vcXkEuUn-qki3b7mLxi92MGg/edit#gid=268529087
Эти логи случайной величины записывались непрерывно 24 часа подряд! Получилось, что каждые 40 секунд производилось одно UWB измерение расстояние согласно алгоритму DS-TWR.
Скормив получившийся *.СSV файл в google-spreadsheets и построив там гистограмму я увидел, что измерения выстроились похожими на нормальное распределение плотности вероятности. Кто бы мог подумать что так будет!...
Как видно, измерения расстояния из одного интервала оказываются более вероятны, чем значения измерений из другого интервала. А это та же гистограмма, но при шаге 5см.
то же в виде таблицы
Теперь настало время вычислить математическое ожидание по формуле (1). На языке Си это будет выглядеть так.
bool statistics_expected_value(RandomVariable_t* const Node){
bool res = false;
if(Node) {
Node->sum = 0.0;
uint32_t i = 0;
for (i=0; i<Node->size; i++) {
Node->sum += Node->value[i];
}
Node->expected_value = Node->sum / Node->size;
LOG_INFO(STATISTICS, "ExpectedValue %f", Node->expected_value);
res = true;
}
return res;
}
Код вычисления среднеквадратического отклонения.
#define POW_TWO(ARG) ((ARG)*(ARG))
bool statistics_standard_deviation(RandomVariable_t* const Node){
bool res = false;
if(Node){
uint32_t i = 0;
double sum_of_squares = 0.0;
for (i=0;i<(Node->size);i++) {
sum_of_squares += POW_TWO(Node->value[i]-Node->expected_value);
}
Node->variance = sum_of_squares/(Node->size-1);
LOG_INFO(STATISTICS, "Variance: %f", Node->variance);
Node->standard_deviation = sqrt(Node->variance);
LOG_INFO(STATISTICS, "StandardDeviation %f", Node->standard_deviation);
res = true;
}
return res;
}
Результат вычисления программы. СКО получилось чуть менее 5см.
Глядя на эту гистограмму можно сказать, что с вероятностью 95% точность UWB измерения составляет +-10см
Идеи проектов на UWB
1--Всяческая in-door навигация. Поиск предметов на складах. Автоматическое наведение прожекторов на человека на сцене. Квест комнаты и т.п.
2--СКУДы. Автоматическое открытие дверей. Регистрация по ID.
3--Автоматическое включение электро-приборов (кондиционер, радио) при приближении. Автоматическое отключение при удалении.
Помимо измерения времени прихода/отправки радиоволны UWB трансиверы могут еще и передавать бинарные данные. Поэтому по UWB можно также обновлять прошивку, транслировать радиокоманды и пр.
Итоги
При работе с UWB можно рассчитывать на
Параметр | Значение | Единицы измерения |
Среднеквадратическое отклонение | 0.049915465 | m |
погрешность | 154.041080 | m |
Разброс значений | 0.62282 | m |
Точность в 95% случаев | +-0.1 | m |
UWB измерения подчиняются нормальному распределению. Если Вас этот результат устраивает, что UWB Вам подойдет.
Link/URL
Принцип Определения Дальности Между UWB Трансиверами (Конечный Автомат Для DS-TWR)
Tabular Data Laboratory
Исходные данные моего UWB измерения.
https://latex.codecogs.com/eqneditor/editor.php
Принцип Определения Дальности Между UWB Трансиверами