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

ed5682bd21af061ed3de3709e841f3dd.png

Как обычно на 10+ году работы программистом микроконтроллеров мне наконец-то пригодилась математическая статистика из ВУЗ (овского) курса по теории вероятностей. Сейчас объясню почему…

Математическая статистика работает со случайными величинами. В данном случае случайной величиной является измеренное значение расстояния при помощи UWB трансиверов.

В этом тексте я изложил свой inside (рский) опыт работы с UWB. Тут я подвергнул тестированию модули DWM1000, исследовал показания расстояния, измеренные UWB трансиверами.

Зачем это всё надо?

Дело в том что UWB трансиверы надо калибровать. Просто из коробки DWM1000 не будут работать правильно. Надо знать значение смещения, чтобы вычитать его из результирующего измерения. Также можно прописать калибровочные константы в регистры компенсации запаздывания сигнала на керамических антеннах.

Все измерительные приборы неидеальные. Отклонения вызваны, в частности, нестабильностью техпроцесса производства компонентов из которых собирают разные экземпляры электронных устройств.

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

Точность — отдельные измерения могут сильно отличаться друг от друга. Это показывает ширина кривой распределения. Степень такого разброса данных и называется точностью измерения.

Погрешность — величина равная разности между истинным значением величины и измеренным значением.

211ddf6398cf7da81e0f591498a3a723.jpg

Каков план?

Всё очень просто:

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, кнопка. В результате кристаллизировалась вот такая схема макета.

372c0509b04261f8cde45892f57a5fc8.png

Тут две 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 количество измерений в интервале.


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

8d98db2e95b5120e459eb0f95cac3ced.png

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

e0231d8981eca235977058b0c9570220.png

Глядя на эту гистограмму можно сказать, что с вероятностью 95% точность UWB измерения составляет ±10 см

a3814448dcb4ee4cba666f9cfed55f2d.png

Идеи проектов на 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) https://habr.com/ru/articles/723822/

Tabular Data Laboratory https://tablab.vercel.app/

Исходные данные моего UWB измерения. https://docs.google.com/spreadsheets/d/1yM0hzInoK0XOBK7–548vcXkEuUn-qki3b7mLxi92MGg/edit#gid=268529087

https://latex.codecogs.com/eqneditor/editor.php

Принцип Определения Дальности Между UWB Трансиверами https://habr.com/ru/articles/723822/

© Habrahabr.ru