Pull to refresh

Comments 22

Классно!
Данный метод используется для калибровки в Ardupilot. Всегда было интересно как это делается
Магнетометр-то откалибруете, а вот акселерометр так калибровать смысла никакого нет. Как раз потому что он стоит немного неровно. Его калибруют просто поставив коптер на ровную горизонтальную поверхность (желательно с уровнем) — от него требуется держать коптер горизонтально, чтобы дрифта постоянного не было.
Боюсь Вы не уловили суть. Пожалуйста, обратите особое внимание на текст статьи, начиная со слов «Например, мы знаем, что если акселерометр поставить в уровень с горизонтом...»
А нафига? Вы хотите сделать уровень электронный, что-ли? Акселерометр нужно калибровать по горизонтальности коптера, а не самого акселерометра или его платы. Это коптер должен быть горизонтален (а не акселерометр), иначе просто будет лететь в сторону наклона.
Хорошо. Представьте, что коптер неподвижно лежит ровно по уровню на земле, а его датчик показывает ускорение, направленное на юго-восток, величиной = 3g.

Вопрос: что вы, как разработчик коптера, планируете делать с показаниями датчика?
У всех контроллеров на этот случай есть ручная калибровка, они просто запомнят, что нужно -3 вычитать (ставим на ровную поверхность, кликаем на калибровку, контроллер запоминает положение «ноля»). У продвинутых — есть еще и ручные перевороты коптера по определенным осям при калибровке, просто чтобы понять, что контроллер не вверх ногами закреплен.
Представьте, что Вы — это датчик. Вас тянет вправо с силой 10g. Вопрос: где земля?
10g акселерометр не выдаст в спокойном положении.
Это чтобы проиллюстрировать суть проблемы. Представьте, что с датчиком всё в порядке. Но он показывает вот так. Как система должна определить — где земля?
Во-первых, не покажет. Во-вторых, контроллеру не нужно знать где земля, ему нужно знать что отклонение коптера от горизонтального положения.
Спасибо за Ваше замечание.
Да какая разница где земля? Контроллер должен зафиксировать значения в положении, в котором точно известно, что он должен показывать (=g=), — и дальше корректировать свои показания по этим значениям. Ему не надо знать, почему. Ему надо показать в таком же положении ровно такое же =g=. Если его показания линейны, то при отклонении на 0.5g по оси он получит значения, смещенные от «калибровочных» на 0.5g по этой оси. Что, собственно, и нужно.
«Ему надо показать в таком же положении ровно такое же =g=»
Господа, статья вообще не об этом. Видимо имеет место различные значения, придаваемые слову «калибровка».

Здесь рассматривается задача, с которой не сталкиваются пользователи. Разработчики её решают до того, как изделие к ним попадёт — смещение нуля датчика.
Как представитель той самой когорты «разработчиков» смею уверить, что смещение нуля датчика — данные совершенно несущественные (за исключением откровенно лажовых случаев, когда масштаб бедствия намекает на какие-то конкретные ошибки в сборке). Значение для ориентации устройства в пространстве имеет только отклонение от «нормы» по трем осям. Норма должна фиксироваться в собранном виде, ибо никакая сборка в настоящее время не даст точную установку датчика и отсутствие его деформаций.
Вопросов должно быть только два: линейность и изотропность показаний в зависимости от смещений, и «нормальное» положение.
Ниже в комментариях некто HomoLuden правильно пишет: "… статья… про компенсацию чисто инструментальной погрешности изготовления и установки датчика на плату контроллера."
И это верно.
На смещение нуля действительно можно не обращать внимание (если Вас не смущает сдвиг нуля на пару дм/с2), и, как я и пишу в статье, его может скомпенсировать фильтр. Так же как и дрейф нуля.
Если Вы под «нормой» понимаете определение некоего опорного направления (например g) — согласитесь, что это другая задача.
Пользователь получает коптер либо с уже откалиброванным датчиком, либо эта процедура вообще не производится и смещение нуля компенсирует фильтр. Вы описываете процедуру определения положения в пространстве по вектору силы тяжести. Это вообще о другом.
Центр шара можно найти в одно действие. А именно, он будет лежать на пересечении плоскостей, перпендикулярных отрезкам между точками сферы и проходящих через их центры. Ну или на пересечении перпендикуляров к треугольникам, проведённых через центры их описанных окружностей. Хотя, конечно, всё равно он будет с ошибкой, и надо будет уточнять.

> Не забывайте ставить плюсик

Попрошайничать нехорошо.
В таком варианте уже на этапе построения отрезков будет двойной цикл. Кроме того гораздо больше расчётов.


Про плюсик — это требование. ;-)
Вместо жесткой фиксации 10%-ного трешхолда на выбросы я бы использовал кластеризацию. Например, даже с евклидовой метрикой расстояний. При корректной организации измерений нибольший кластер должен оказаться искомым.
Вопрос использования алгоритма K-means при этом осложняется необходимостью задания K — количества кластеров. Но это вполне можно обойти многократным прогоном с возрастающими K. В определенный момент искомый кластер начнет дробиться на более мелкие — это можно отследить.
Это может быть эффективней. Только нужно подумать, что брать за расстояние? И в какой момент нам понять, что замеры прошли неудачно? К примеру если отфильтрована четверть точек — это ещё хорошо или уже нет? А если половина? А если оставшиеся точки сгруппированы только в одной половине сферы?
Например, если перевести типичную величину смещения нуля для акселерометра датчика MPU9250 в м/с2, то это получается в районе 0,2 м/с2. Т. е. датчик неподвижен, но при этом показывает ускорение, а через 5 секунд мы получаем скорость в 1 м/с. С одной стороны, все данные датчиков всегда пропускают через какой-либо фильтр (например такой). Но с другой стороны зачем фильтру постоянно компенсировать это смещение? Ведь датчик будет показывать движение там, где его нет. Это снижает точность результата. А всего то нужно один раз найти величину смещения и потом во время работы датчика вычитать эту величину из его показаний.


Спешу расстроить, но дрейф MEMS датчиков (гироскопов особенно, но и акселерометры страдают в значительной степени) величина случайная. Она меняется во время работы и между запусками. Калибровать нужно непосредственно перед запуском, т.к. играет роль величина питающего напряжения, температура и другие факторы текущих условий эксплуатации.

Я понял про что статья. Она про компенсацию чисто инструментальной погрешности изготовления и установки датчика на плату контроллера. Но эта задача, во-первых, теряет актуальность в изложенном виде в виду сложности проведения такой калибровки в поле (если принять факт, что дрейф меняется). А во-вторых, на практике важнее знать, что нужно вычесть из показаний датчика, чтобы при абсолютно горизонтальном положении коптера (всего БПЛА, а не платы с контроллером) акселерометр выдавал {0;0;g}.
Статья действительно про компенсацию чисто инструментальной погрешности изготовления и установки датчика на плату. Предполагается, что компенсация выявляется на этапе изготовления один раз, но метод настолько прост, что можно это сделать и в поле. Для потребителей это действительно не актуально.
Про дрейф нуля гироскопа — это отдельная история. Установка горизонта — тоже отдельная история, не имеющая отношения к данной статье.
Sign up to leave a comment.

Articles