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

Результат вычисления программы. Неоткалиброванная пара UWB трансиверов приводит к вычислению расстояния в 155.11608 метров, когда как на самом деле расстояние всего лишь 1.075 м. У UWB трансиверов по умолчанию огромная погрешность. СКО же получилось чуть менее 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 Трансиверами

Модуль DWM1000 https://www.qorvo.com/products/p/DWM1000

ASIC DW1000 https://www.qorvo.com/products/p/DW1000

Комментарии (23)


  1. miksoft
    18.12.2023 21:31

    А как 107,5 см превратились в 155 метров?


    1. aabzel Автор
      18.12.2023 21:31

      Неоткалиброванная пара UWB трансиверов приводит к вычислению расстояния в 155 метров, когда как на самом деле 107,5 см .

      У UWB трансиверов по умолчанию огромная погрешность. 


      1. miksoft
        18.12.2023 21:31

        Вы не пробовали измерения на других расстояниях, чтобы вычислить отдельно аддитивную и мультипликативную погрешность?

        А то сейчас погрешность в 144 раза выглядит странно...


        1. aabzel Автор
          18.12.2023 21:31

          Нет не пробовал. Где мне взять такую длинную рейку?


          1. miksoft
            18.12.2023 21:31

            Не понял причем тут рейка. Помещение не позволяет разместить трансиверы на расстоянии, например, 2 и 3 метра?


            1. aabzel Автор
              18.12.2023 21:31

              Помещение-то позволяет. Но отложить 3 метра точно не получится. Нет такой линейки.


              1. Fasterpast
                18.12.2023 21:31

                Линейка на 3 метра называется рулеткой )


        1. San_tit
          18.12.2023 21:31

          Да, про мультипликативную погрешность тоже отметил.

          Ее лучше бы оценить, с ходу в голову приходит погрешность в силу не идеальной синхронизации тактовых генераторов (неидеальной частоты).


      1. Frimen3
        18.12.2023 21:31

        Работал с Decawave модулями лет 8 назад, у них калибруется так называемое время задержки антенны (antenna delay). Но даже без калибровки, если память не изменяет, погрешность была не более 0,5 метра. Ни о каких 155 метрах точно речи не шло, так что где-то закралась ошибка :)


        1. aabzel Автор
          18.12.2023 21:31

           Но даже без калибровки, если память не изменяет, погрешность была не более 0,5 метра. Ни о каких 155 метрах точно речи не шло, так что где-то закралась ошибка :)

          У Вас остались исходники?


          1. Frimen3
            18.12.2023 21:31

            Нет, давно это было, я в той фирме уже лет 5 как не работаю. Могу посоветовать скачать актуальные исходники, идущие к отладочной платы самого производителя DWM1001-DEV https://www.qorvo.com/products/p/DWM1001-DEV#documents Но думаю вы и так их уже видели/использовали.


  1. asl
    18.12.2023 21:31

    UWB измерения подчиняются нормальному распределению. Если Вас этот результат устраивает, что UWB Вам подойдет.

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


  1. Krey
    18.12.2023 21:31

    Qorwo и сами неплохие отладочные платы делают, и другие производители их модули добавляют на свои платы. Как то слишком много работы у вас получилось.

    А для раста например и крейты вроде есть готовые. Бери и используй, правда я сам ещё не пробовал.


    1. aabzel Автор
      18.12.2023 21:31

      У Qorvo отсутствуют отладочные платы с SD картой.


      Вот всё что у них есть по UWB.
      https://www.qorvo.com/products/wireless-connectivity/ultra-wideband


  1. a9d
    18.12.2023 21:31

    Почему PCB белая? Это довольно редкий цвет и он дорогой. Да и еще это ухудшает передачу тепла между PCBA и воздухом.


    1. aabzel Автор
      18.12.2023 21:31

      Нам просто зеленые PCB уже набили оскомину.


    1. aabzel Автор
      18.12.2023 21:31


      Сейчас даже производители отладочных плат ( ArteryChip) делают белые PCB.


  1. a9d
    18.12.2023 21:31

    Нужно добавить хотя-бы один датчик температуры. Проверить плавает ли расстояние вслед за температурой PCBA.


    1. aabzel Автор
      18.12.2023 21:31

      Хорошее замечание.
      Есть ли возможность предложить экземпляр конкретного датчика для данного случая?


  1. NutsUnderline
    18.12.2023 21:31

    интересная технология, но софтовая поддержка производителя какая то унылая - дают по минимуму. Плата с MCU и миниумумом софта стоит уже несколько тыс. руб. Набор плат которых что то уже может из коробки стоят уже десятки тыс. руб. Готовая система, наверное, уже на миллионы руб. тянет. И плата идет именно за сфт


  1. sainquake
    18.12.2023 21:31

    У меня студент занимался uwb, лично видел ошибку не более 10мм на расстоянии 300мм.


    1. aabzel Автор
      18.12.2023 21:31

      Какие у Вас ASIC(ки) для UWB?


      1. NutsUnderline
        18.12.2023 21:31

        вот еще кстати. есть же еще DW3000, якобы совместимый с aplle airtag. Думаю что кто нибудь "копает" уже в этом направлении ибо открываются очень интеерсные перспективы.

        Собственно почему говорю - в яблоках типа свой чип, но почему то рядом периодически выплывает NEC