В этом тексте я накропал про то, какая математика скрыта за алгоритмом калибровки трёх осевых MEMS акселерометров.

Этот текст является непрерывным продолжением предыдущего текста Геометрия Стенда для Калибровки MEMS Акселерометра. Настоятельно рекомендую его прочесть. Иначе всё, что вы увидите ниже окажется просто пустым звуком.

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

 \left\{  \begin{array}{l} s=\frac{1}{\sqrt{3}} = 0.5773502692 \qquad    \\ a_{1x}^* = sg  \qquad  \\  a_{1y}^* = sg  \qquad \\  a_{1z}^* = -sg \qquad \qquad \qquad \qquad \qquad (1) \\   \\ a_{2x}^* = -sg  \qquad  \\  a_{2y}^* = -sg  \qquad  \\  a_{2z}^* = sg  \qquad  \\  \end{array}  \right.

Переводя на кухонный язык, - все компоненты вектора ускорения (A_x, A_y, A_z) свободного падения расщепляются на оси акселерометра с одинаковым модулем 0.577g. Эта лемма как раз и доказана в предыдущем тексте Геометрия Стенда для Калибровки MEMS Акселерометра.

Когда надо калибровать акселерометры?

MEMS акселерометры надо калибровать, когда измерения g вдоль одной и той же оси в разных знаках не равны по модулю. Это яркий признак того, что акселерометр надо калибровать. Обычно у акселерометра три оси. Поэтому надо проверять все эти оси.

Теоретический минимум.

То что мы считываем из ASIC акселерометра это вот этот вектор. (1) это даже еще не ускорение, а просто абстрактный сигнал.

\overrightarrow{a} = (a_x,a_y,a_z) \qquad  \qquad  (2)

Реальный же вектор ускорения это вектор (2). Ускорение со звёздочкой.

\overrightarrow{a^*} = (a_x^*,a_y^*,a_z^*) \qquad  \qquad  (3)

Как связаны прочитанный из ASICа сигнал и реальный вектор ускорения? По сути в микросхеме акселерометра три независимых акселерометра. На каждую ось. И каждый акселерометр обладает смещением нуля и искаженной чувствительностью. Поэтому реальное ускорение и прочитанный сигнал связаны линейным отображением (4).

 \left\{  \begin{array}{l} a_x^* = a_xk_x+b_x  \qquad  \\ a_y^* = a_yk_y+b_y  \qquad (4) \\ a_z^* = a_zk_z+b_z  \qquad \\ \end{array}  \right.

Даешь сигнал и калибровочные коэффициенты, получаешь реальное ускорение. Всё по честному. В случае, если акселерометр был бы идеальный, то k_j обратятся в 1, а b_j в нули.

Постановка задачи

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

A_1=(a_{1x},a_{1y},a_{1z}) \\ A_2=(a_{2x},a_{2y},a_{2z})

Найти калибровочные коэффициенты k_j и b_j.

k_x , \quad k_y ,\quad k_z ; \quad b_x ,\quad b_y ,\quad b_z

Решение

В систему уравнений (1) вмонтируем уравнения (4). Получится система уравнений (5)

  \left\{  \begin{array}{l}    a_{1x}k_x+b_x = sg  \qquad  \\  a_{1y}k_y+b_y = sg  \qquad \\ a_{1z}k_z+b_z = -sg \qquad \qquad \qquad \qquad \qquad (5) \\   \\  a_{2x}k_x+b_x = -sg  \qquad  \\  a_{2y}k_y+b_y = -sg  \qquad  \\  a_{2z}k_z+b_z = sg  \qquad  \\  \end{array}  \right.

Поиск калибровочных коэффициентов сводится к тому, что надо просто решить систему линейных уравнений (5). Шесть уравнений и шесть неизвестных. Как же решить эту СЛАУ?

Если из первого и 4го уравнения выразить b_x и приравнять, то можно вычислить k_x. Аналогичное можно проделать для b_y и b_z. Таким образом мы получаем все масштабные калибровочные коэффициенты.

  \left\{  \begin{array}{l}   k_x = \frac{2sg}{a_{1x}-a_{2x}} \qquad  \qquad         \\  k_y = \frac{2sg}{a_{1y}-a_{2y}} \qquad     (6)\\   k_z = \frac{-2sg}{a_{1z}-a_{2z}} \qquad \qquad         \\    \end{array}  \right.

Аналогичным образом добываются коэффициенты смещения b. Надо из каждого уравнения выразить то, что мы не знаем и то, что нам не нужно. То есть k_j. Затем приравниваем k_j и алгебраическими преобразованиями выводим b_j. Easy!

  \left\{  \begin{array}{l}   b_x = sg\frac{a_{1x}+a_{2x}}{a_{2x}-a_{1x}} \qquad  \qquad         \\  b_y = sg\frac{a_{1y}+a_{2y}}{a_{2y}-a_{1y}} \qquad  \qquad       (7)  \\  b_z = sg\frac{a_{1z}+a_{2z}}{a_{1z}-a_{2z}} \qquad  \qquad         \\     \end{array}  \right.

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

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

Идея самой калибровки в следующем. У нас есть вот такой стенд. Коллеги почему-то называют его словом раскоряка.

калибровочный стенд в натуре
калибровочный стенд в натуре

Надо выполнить следующие шаги:

1—Пристегнуть твердотельную электронную плату с акселерометром в ячейку №1 красной скрепой
2—Прочитать вектор ускорения A1 = (A1x, A1y, A1z),
3—Вмонтировать ту же электронную плату с акселерометром в контрольную позицию №2
4—Прочитать вектор ускорения A2 = (A2x, A2y, A2z)
5—Посчитать коэффициенты по формуле (6) и (7).
6—Получить вектор смещения нуля B и вектор чувствительности K

7--Применить данные коэффициенты в драйвер акселерометра.

Можно и вовсе запрограммировать робот KUKA для того, чтобы вертеть эту плату, так и сяк для калибровки. Это уже зависит от вашего бюджета.

Фактически надо сделать два измерения. В левой ориентации и в правой ориентации. Модули ускорения свободного падения на каждую ось будут одинаковые. Просто на каждой оси будет противоположный знак. Только и всего...

Прежде чем устанавливать электронную плату надо выровнять плоскость стенда. Для этого надо подкладывать под стенд листки до тех пор пока пузырек уровня по X и Y не станет показывать ноль. Только после этого можно смело читать акселерометр в электронной плате.

Я прочитал несколько значений вектора A1 и A2. Взял среднее арифметическое по 5 измерениям и подал эти значение на вход алгоритма пирамидальной калибровки. Получил вот такие коэффициенты. Похоже на правду.

Сам микроконтроллер по входным значениям двух векторов A1 и A2 рассчитал мне калибровки. Это же в виде текста

Скрытый текст
-->
--> pac   0.58  0.53 -0.54 -0.58 -0.58  0.50
336 I,[PyramidAccelCalib] A1:dx:  0.58,dy:  0.53,dz: -0.54
337 I,[PyramidAccelCalib] A2:dx: -0.58,dy: -0.58,dz:  0.50
338 I,[PyramidAccelCalib] AccelCalibOk
339 I,[PyramidAccelCalib] 
A1:dx:  0.58,dy:  0.53,dz: -0.54,
A2:dx: -0.58,dy: -0.58,dz:  0.50,
Kx:0.995431,Ky:1.040271,Kz:1.110289,
Bx:-0.000000,By:0.026007,Bz:0.022206,
-->

Тут сразу надо учесть, что precision у данного акселерометра +/-40mg. Поэтому калибровка по смещению нам погоду особо не поменяет. Однако тем не менее пусть будет.

Итоги

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

  \left\{  \begin{array}{l}     k_x = \frac{2sg}{a_{1x}-a_{2x}} \qquad  \qquad         \\    k_y = \frac{2sg}{a_{1y}-a_{2y}} \qquad      \\     k_z = \frac{-2sg}{a_{1z}-a_{2z}} \qquad \qquad \\ \qquad  \qquad \qquad \qquad \qquad \qquad (8)\\   b_x = sg\frac{a_{1x}+a_{2x}}{a_{2x}-a_{1x}} \qquad  \qquad         \\   b_y = sg\frac{a_{1y}+a_{2y}}{a_{2y}-a_{1y}} \qquad  \qquad         \\   b_z = sg\frac{a_{1z}+a_{2z}}{a_{1z}-a_{2z}} \qquad  \qquad         \\      \end{array}  \right.

Формулы (8) справедливы только для измерений проделанных на пирамидальном стенде.

Как можно заметить, калибровка акселерометров - эта задача на стыке программирования, тригонометрии, линейной алгебры, метрологии, черчения, стереометрии. В общем куча всего...

Надеюсь этот текст поможет другим программистам микроконтроллеров быстрее вникнуть в физику происходящего и корректно откалибровать свои MEMS акселерометры.

Если найдете ошибку в расчетах, то пишите в комментариях.

Словарь

Акроним

Расшифровка

СЛАУ

Система линейных алгебраических уравнений

MEMS

micro-electromechanical system

ASIC

application-specific integrated circuit

Ссылки

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


  1. Zenitchik
    15.11.2024 19:49

    Я краем уха слышал, что у датчиков бывает нелинейность. Если такая проблема правда есть, то как с ней борются?


  1. ZEvS_Poisk
    15.11.2024 19:49

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


    1. aabzel Автор
      15.11.2024 19:49

      И ещё добавлю: может стоит на основание стенда установить другой (несколько) акселерометров, чтобы не упираться в точность ватерпаса?

      На самом деле мы и стенд под горизонт подгоняем тоже электронным инклинометром.


  1. gleb_l
    15.11.2024 19:49

    Меня всегда подмывало положить айфон в равномерно ускоряющийся автомобиль (с небольшим ускорением, 0.1g хватит), откалибровать его прямо там, а потом посмотреть, что он покажет в покое, когда увидит, что длина вектора ускорения, синтезированная по осям, окажется меньше g ;)


  1. mikelavr
    15.11.2024 19:49

    Это калибровка акселерометра при одном ускорении (равном 1G) и при одной температуре (предположительно +20C).

    Как он будет себя вести на других ускорениях и при другой температуре?

    Вопрос весьма практический, связан с несистематическими ошибками в работе датчиков для бега - Foot Pod. Как конкретный пример - Stryd. Там показываемый темп плавает от чего угодно - скорости бега, техники бега, модели кроссовок, температуры на улице.

    Ускорение больше 1G можно смоделировать, установив акселерометр на краю платформы, которая вращается с известной скоростью. Можно сравнить расчетное значение ускорения, и фактическое.

    Можно также смоделировать невесомость, подбросив изделие. Во время свободного падения в значениях должен быть ноль.


    1. zebulon_stumpf
      15.11.2024 19:49

      В воздухе ноль будет только в когда скорость будет ноль, иначе есть небольшое торможение о воздух


      1. mikelavr
        15.11.2024 19:49

        Согласен. Значит подбросить, и смотреть значения около верхней точки траектории.


        1. randomsimplenumber
          15.11.2024 19:49

          Если подбросить - в любой точке будет около 0.


          1. Zenitchik
            15.11.2024 19:49

            В воздухе ноль будет только в когда скорость будет ноль, иначе есть небольшое торможение о воздух

            Читать надо ветку, а не только последний пост.


            1. kuzzdra
              15.11.2024 19:49

              Не уверен, что этот акселерометр сможет уловить торможение об воздух, разве что его из пушки подбросят. Также не уверен, что в процессе подбрасыванния его не закрутят, и что он не будет показывать какое-то рандомное центростремительное ускороение.


              1. zebulon_stumpf
                15.11.2024 19:49

                Уловить можно все, при наличии достаточного шума и времени для наблюдения


                1. randomsimplenumber
                  15.11.2024 19:49

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


          1. aabzel Автор
            15.11.2024 19:49

            Даже когда спутник удаляется от земли двигаясь по вытянутой эллиптической орбите он формально тоже падает на землю.


  1. utya
    15.11.2024 19:49

    Хорошая статья. Метод 6 позиционной калибровки, только модифицированный. Лет 7 назад писал диссер на эту тему. Температурный дрейф многие решают, просто используя подогрев для мемс датчиков


    1. aabzel Автор
      15.11.2024 19:49

      Лет 7 назад писал диссер на эту тему. 

      В каком ВУЗе?


      1. utya
        15.11.2024 19:49

        МИРЭА


  1. dmitrye1
    15.11.2024 19:49

    Если бюджета на KUKA не хватает.


  1. kuzzdra
    15.11.2024 19:49

    С этой статьи нужно было начинать. Описание проблемы, постановка задачи, уравнения эти.. Переход к частному случаю с 2 измерениями вместо 6 - наверное в уравнениях какие то коеффициенты становятся константами.. А уже потом строить пирамиду.

    Точность измерений неплохо бы учесть. Если 10 раз подряд с интервалом в полчаса выполнить измерения с 2 платами по очереди - они будут такими же?


  1. AlexGfr
    15.11.2024 19:49

    Ваш метод не учитывает, что направления осей акселерометра могут по разным причинам не точно соответствовать осям устройства (платы). В результате, ах* зависит не только от ax, но и от ay и az


    1. aabzel Автор
      15.11.2024 19:49

      Что получается, надо ещё матрицу поворота применять?


      1. Zenitchik
        15.11.2024 19:49

        Я лично сразу искал бы матрицу аффинного преобразования.


        1. aabzel Автор
          15.11.2024 19:49

          аффинное преобразование - простыми словами это что?


          1. Zenitchik
            15.11.2024 19:49

            Это наиболее общий вид линейного преобразования, сохраняющего параллельность. Матрица поворота - частный случай матрицы аффинного преобразования. Подробности Википедия лучше меня объяснит.


  1. Borjomy
    15.11.2024 19:49

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


    1. aabzel Автор
      15.11.2024 19:49

      В свое время отказались от использования обычных акселерометров для определения наклона платформы

      И что же Вы в итоге выбрали? Механический гироскоп? GNSS RTK?