Зачем программисту микроконтроллеров математическая статистика? (или так ли хороши UWB трансиверы?)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Как обычно на 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).

\mu = \frac{1}{N}\sum_{i=0}^{N-1} x_{i}  \;\;\;\;\;\;\;\;\;\;\;                (1)

4--Вычислить разницу (offset) между математическим ожиданием и реальным расстоянием D=107.5cm между UWB нодами.

OffSet=\mu-distance_{real}        \;\;\;\;\;\;\;\;\;\;\;                (2)

5--Прописать разницу OffSet как калибровочные данные для данного пары трансиверов в NVRAM память прошивки микроконтроллера и пользоваться далее этой константой. OffSet и будет выступать в качестве погрешности.

6--Вычислить среднеквадратическое отклонение (СКО) по формуле (3). СКО даст нам количественную характеристику для измерения точности измерений. Чем больше CКО, тем ниже точность. Чем меньше СКО, тем выше точность.

\mu = \frac{1}{N}\sum_{i=0}^{N-1} x_{i}  \;\;\;\;\;\;\;\;\;\;\;                (1) \\ \sigma = \sqrt{  \frac{1}{N-1}\sum_{i=0}^{N-1} (x_{i}-\mu)^{2} } \;\;\;\;\;\;\;\;\;\;\;                (3) \\

Практическая часть

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.

Отладочная плата с UWB трансивером на борту
Отладочная плата с UWB трансивером на борту

C этими board(ами) и будем проводить все эксперименты.

Постановка эксперимента с UWB измерениями сопряжена с калейдоскопом разнообразных накладных расходов и целой кучей нюансов. Оказалось что тут надо не только программировать, но ещё необходимо начертить, изготовить соответствующий конструктив. Организовать производство custom(ных) пластиковых деталей. Также надо было найти и закупить нужные комплектующие: метизы, крепёж, кабели. Проложить проводку. Скомпоновать стенд.

изображение стенда калибровки UWB в натуре
изображение стенда калибровки UWB в натуре

Наконец собрав и подключив всю эту аппаратуру к электропитанию я произвел 2117 непрерывных измерений одного и того же расстояния 107,5см. Вот, собственно, сырые исходные данные этого эксперимента
https://docs.google.com/spreadsheets/d/1yM0hzInoK0XOBK7-548vcXkEuUn-qki3b7mLxi92MGg/edit#gid=268529087

Эти логи случайной величины записывались непрерывно 24 часа подряд! Получилось, что каждые 40 секунд производилось одно UWB измерение расстояние согласно алгоритму DS-TWR.

Скормив получившийся *.СSV файл в google-spreadsheets и построив там гистограмму я увидел, что измерения выстроились похожими на нормальное распределение плотности вероятности. Кто бы мог подумать что так будет!...

Гистограмма UWB измерений. X-метры, Y количество измерений в интервале. Шаг: 0.0001m
Гистограмма UWB измерений. X-метры, Y количество измерений в интервале. Шаг: 0.0001m

Как видно, измерения расстояния из одного интервала оказываются более вероятны, чем значения измерений из другого интервала. А это та же гистограмма, но при шаге 5см.

Гистограмма UWB измерений. X-метры, Y количество измерений в интервале.
Гистограмма UWB измерений. X-метры, Y количество измерений в интервале.


то же в виде таблицы

Теперь настало время вычислить математическое ожидание по формуле (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 Трансиверами

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы работали с UWB трансиверами?
33.33% да 1
66.67% нет 2
Проголосовали 3 пользователя. Воздержавшихся нет.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вам пригождались в программировании микроконтроллеров методы математической статистики?
100% да 3
0% нет 0
Проголосовали 3 пользователя. Воздержавшихся нет.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы работали с трансивером DWM1000?
50% да 1
50% нет 1
Проголосовали 2 пользователя. Воздержавшихся нет.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какое у вас было максимальное среднеквадратическое отклонение при UWB изменениях расстояния?
100% меньше 5 см 1
0% от 5 см до 10 см 0
0% от 10 см до 20 см 0
0% от 20 см до 40 см 0
0% больше 40 см 0
Проголосовал 1 пользователь. Воздержались 2 пользователя.
Источник: https://habr.com/ru/articles/712616/


Интересные статьи

Интересные статьи

Ура! Наконец-то вы написали столько строк кода, что можете позволить себе дом на берегу моря. Вы нанимаете лучшего архитектора, который уверяет, что у него появилась отличная идея по поводу вашего дом...
В ноябре прошлого года протяженность подводных интернет-магистралей превысила 1 млн км, о чем мы уже писали. Тогда же говорили о том, что интернет-инфраструктура продолжает развиваться активнейшим о...
Это работа является логическим продолжением моего первого подробного текста для сообщества об актуальных подходах к верстке Как верстать веб-интерфейсы быстро, качественно и интересно. Но, если в перв...
Часто я встречаю разработчиков, которые пишут код на объектно-ориентированном языке программирования, но не понимают принципов ООП. Это могут быть начинающие девелоперы, которые еще н...
Одним из самых важных уроков, которые я постиг в качестве разработчика 15 лет назад, была эта простая мысль: Хороший код выразителен, а не впечатляющ. Я помню, как услышав это спросил «А в чё...