Плата управления квадрокоптером. Продолжаем разговор.



Итак, в предыдущей статье мы определились с задачей – необходимо стабилизировать ЛА по «абсолютному» положению (углам, высоте и линейным координатам). Также, была озвучена проблема – у нас нет датчика, который бы дал нам на выходе «абсолютное» положение коптера.

Давайте двигаться дальше.


Но сначала небольшое лирическое отступление. В комментариях к предыдущей статье, прозвучало несколько пожеланий по поводу содержания последующих статей. Дабы никого не вводить в заблуждене, хочу обратить внимание на следующий момент: автор не является экспертом в БИНС и ТАУ, статьи могут содержать неточности. Просто, проделано много работы по изучению данной тематики практически «с нуля». Получен некоторый опыт, которым хочется поделиться. Забегая вперед, скажу, что сам я пока «дорос» до алгоритмов уровня DCM IMU. Это я к тому, что синтеза фильтра Калмана пока не будет :(

Ладно, хватит лирики, перейдем к делу.

Нам нужно как-то определить текущее положение ЛА в пространстве. Давайте начнем с определения углов крена тангажа и рыскания.

Первое что приходит в голову – использовать гироскоп. На практике так и делают «но есть нюансы».

В случае коптеров, по понятным причинам, используют MEMS гироскопы. Начнем с того, что MEMS гироскоп, на самом деле, является датчиком угловых скоростей. На выходе с такого гироскопа мы получим не абсолютные значения угла (как нам бы хотелось) а моментальное значение угловой скорости вращения вокруг оси.

Но это не основная проблема – мы можем, с помощью интегрирования, перейти от угловой скорости к углу.

Самый простой способ (далеко не самый точный, но пока для нас это не принципиально) – «метод прямоугольников»:

a = a0 + w * t

где:

a – текуче значение угла
a0 – предыдущее значение угла
w – измеренное значение угловой скорости
t – время между измерениями

Другими словами, мы в цикле опрашиваем гироскоп (с определенным интервалом времени t), получаем моментальное значение угловой скорости (w) и вычисляем текущее значение угла прибавив к предыдущему значения угла «приращение» (w * t).

Проблема в том, что мы постоянно «суммируем» и ошибка (вызванная погрешностью гироскопа) будет постоянно накапливаться. А с точностью у MEMS гироскопов и так куча проблем (тепловой дрейф нуля, чувствительность к вибрациям и т. д.).

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

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

Можно, например, периодически (раз в несколько секунд) садить квадрокоптер на землю и сбрасывать значения углов крена и тангажа в 0. Потом, опять можно летать несколько секунд, пока накапливается погрешность :) Но, конечно, это не выход.

На практике для такой коррекции и применяют акселерометр и/или цифровой компас.

Если наш ЛА неподвижен, то 3х-осевой акселерометр будет измерять проекцию кажущегося ускорения (ускорения, вызванного силой реакции опор/подвеса на силу тяжести). На выходе акселерометра мы получим вектор (вернее проекции вектора на координатные оси) который направлен вертикально вверх и по модулю равен 1g. Этот вектор (обозначем его G) можно использовать для корректирования значений углов.

Но есть несколько проблем:

1. Если ЛА начнет перемещаться (ускорятся, а ЛА практически всегда находится в движении) то акселерометр нам выдаст суммарный вектор (вектор G + вектор собственно ускорения ЛА). Соответственно, решить задачу «в лоб» не получится.

2. Данные, получаемые с MEMS акселерометра, очень сильно зашумлены.

3. Мы в принципе не можем скорректировать все три угла (крена, тангажа и рысканья) имя только один вектор. Мы можем скорректировать углы крена и тангажа (выровнять ЛА относительно горизонта). Но скорректировать угол рысканья (вращение ЛА вокруг оси «совпадающей» с вектором G) мы не сможем, нам нужен еще один вектор.

Последнюю проблему можно решить, если дополнительно подключить к системе цифровой компас. 3х-осевой компас дас еще один вектор (магнитного поля Земли). Имя два вектора (показания акселерометра и магнитометра) потенциально можно корректировать все 3 угла.

Цифровой компас (3х-осевой) можно использовать и без акселерометра, но опять же, мы сможем скорректировать только два угла из трех. Плюс, как и в случае с другими MEMS датчиками, здесь есть свои проблемы. Основная – крайне низкая точность. В идеальных условиях погрешность MEMS магнитометра составляет, приблизительно, 5 градусов. А в реальных условиях, на плате коптера, вблизи от силовых проводов и электромоторов, погрешность намного больше.

Замечу, что иногда для определения/корректировки углов крена и тангажа используют пиродатчики. С помощью нескольких, установленных с разных сторон, датчиков определяют «пирогоризонт». Концепция построена на том, что пиродатчик отличает «теплую» Землю от «холодного» неба. Но данный подход не очень распространен. Судя по отзывам, основной недостаток такой конструкции – чувствительность к погодным условиям, потокам теплого/холодного воздуха и т. д. ( я, честно говоря, поверхностно знаком с данным подходом, исправления/уточнения приветствуются).

Забегая наперед, скажу, что для «полного счастья» помимо значений углов нужно будет определить высоту ЛА (барометр, УЗ-высотомер) и координаты (GPS).

Мы возьмем за основу самый распаленный для коптеров метод определения значений углов: интегрируем показания с гироскопов и вносим коррекцию исходя из показаний акселерометра и цифрового компаса. Исходя из причин, описанных выше, решить данную задачу «в лоб» на уровне геометрии не получится (получится, но для неподвижного, сферического ЛА в вакууме). В следующей статье мы рассмотрим наиболее простой алгоритм – комплементарный (его еще иногда называют Алфа-Бета) фильтр. Заодно, разберем принцип работы платы управления MultiWII, в которой данный алгоритм используется.
  • +6
  • 24 марта 2012, 20:04
  • e_mc2

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

RSS свернуть / развернуть
УЗ-высотомер
В авиации, кстати, используют многолучевые высотомеры. А они могут дать еще довольно точную информацию о углах крена и тангажа относительно подстилающей поверхности. В коптерах такой подход применяется?
0
  • avatar
  • Vga
  • 24 марта 2012, 20:25
В тех проектах, которые я видел, УЗ-дальномер использовался исключительно для определения высоты (в связке с барометром и, иногда, высотой получаемой с GPS). Притом УЗ-дальномер используют на небольших высотах (несколько метров).

Конечно, дальномер может дать дополнительную информацию для коррекции углов, но в каптерах это не используют. Возможно, дело именно в особенности работы УЗ-дальномера. Данные устройства не любят «мохнатых» поверхностей. И, я не знаю, как поведет себя УЗ-дальномер, если отражающая поверхность будет находится «под углом».
0
Ну, вообще говоря, чтобы по одному лучу померить высоту — нужна достоверная информация о ориентации аппарата (т.е. крене и тангаже). Поэтому, насколько я помню соответсвующий курс (не помню только какой именно) в институте — используется не менее четырех лучей.
Притом УЗ-дальномер используют на небольших высотах (несколько метров).
Это да. Они работают метров до 15, если с рупором.
0
погрешность MEMS магнитометра составляет, приблизительно, 10 градусов
Это что ~3 значащих бита при разрешении 12/16 бит? верится с трудом. Но похоже, что и гироскоп и акселерометр такие же точные.
0
Извиняюсь, я некорректно выразился (поправил статью), погрешность составляет ~5 градусов (показания компаса плавают в пределах ~10 градусов). Но, это в «тепличных условиях».
0
Очень много, а каков характер погрешности? плавает при неизменных условиях и ориентации?
0
Да, плавает при неизменной ориентации. При резком изменении ориентации заметен небольшой «переходной процесс». Как будет возможность – сниму показания и выложу графики. DIHALT экспериментировал с LSM303DLH, и тоже заметил «гуляние» показаний. Конечно, можно (и нужно) использовать фильтры и повысить точность показаний. Но, как по мне, основная проблема – это чувствительность к ЭМИ (по понятным причинам). С этим, на плате котрера, бороться тяжело.
0
А мне кажется ЭМИ будут иметь такое распределение, что отфильтруются простым усреднением (усреднять надо поправку ориентации, но не сами показания магнитометра). А вот, что делать с гулянием на 5 градусов не понятно. Дополнительная динамика и запаздывание, наличие преходных процессов, тоже все усложняют.
0
Это не особо значительная проблема, можно взять за основу не магнитный вектор, а целое направление шириной в 10 градусов, при использовании фильтров получим вполне сносный ориентир без накопления ошибки, далее софтом можно будет снизить биения и иметь точное направление, другой вопрос в том, что обсчитывать все это надо уже совсем не мегами и совсем не на 20 мгц
0
Если наш ЛА неподвижен, то 3х-осевой акселерометр будет измерять ускорение свободного падения
Мне так кажется:
Если аппарат в воздухе, и без тяги, то акселерометр покажет почти ноль (куда ветер дует).
А когда он ещё тягу включит, то акселерометр покажет направление тяги.
0
Если аппарат в воздухе, и без тяги, то акселерометр покажет почти ноль (куда ветер дует).
А как же сила тяжести? Если ЛА неподвижен, то акселерометр покажет ~1g. Соответственно, акселерометр покажет 0, если аппарат будет в состоянии свободного падения (или, например, при выполнении «мертвой перли» с перегрузкой в 1g).
0
А как он без тяги зависнуть может? Или петлю сделать? У него-же не крыльев, ни баллона с водородом нету.

Сила тяжести обеспечивает падение вниз. :) И аппарата и его датчика одновременно. Конечно, когда он сильно разгонится вниз, то аэродинамическую силу торможения можно будет засечь. Но безопасней совершать периодически посадку. :)
0
Не совсем понял вашу мысль. Если коптер в воздухе без «тяги», то но будет падать (но не совсем «свободно», т. к. есть сопротивление воздуха) и акселерометр покажет значение близкое к 0.

Но я говорю о неподвижном ЛА: стоит на земле, или висит в воздухе (когда его «тяга» компенсирует силу тяжести) — в этом случае акселерометр покажет 1g.

А когда он ещё тягу включит, то акселерометр покажет направление тяги.

Акселерометр в таком случае покажет сумму двух векторов – ускорения вызванного «тягой» и ускорения свободного падения.
0
Если коптер в воздухе без «тяги», то но будет падать (но не совсем «свободно», т. к. есть сопротивление воздуха) и акселерометр покажет значение близкое к 0.
Вот об этом я и писал, о сферическом квадрокоптере в вакууме.

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

Когда он стоит на земле или висит на верёвочке — тоже согласен. Акселерометр покажет ускорение свободного падения. Но это уход в сторону от моей мысли.

А мысль в том, что если у сферического квадрокоптера в вакууме включить тягу, то показания акселерометра изменятся ровно на эту тягу. А тяга никак не связана с землёй.
Акселерометр в таком случае покажет сумму двух векторов – ускорения вызванного «тягой» и ускорения свободного падения.
Вот с этим не согласен. Когда тяга=0 акселерометр не показывает 0+g.

И отсюда вывод: с помошью акселерометра нельзя прямыми измерениями получить направление к земле.

Думаю группа квадролётов могла бы засечь изменение гравитации от высоты. (F=G*m*M/(R^2)). Хотя проще засечь изменение давления от высоты.
При этом квадролёты должны видеть друг друга. В плане позиционирования. И обмениваться данными.

Ещё некоторые мухи не стоят на месте, а совершаю вертикальные колебания. Может действительно это выход? Только нужно в этих колебаниях достигать скорости, когда силы аэродинамического торможения станут засекаемыми.

Погуглил немного. Ставят обычно 3 гироскопа и 3 акселерометра, применяют хитрый программный фильтр, и всё равно, при резких движениях накапливается ошибка. Похоже просто увеличивают точность работы гироскопа. Надо будет про этот фильтр разобраться.
0
Вот с этим не согласен. Когда тяга=0 акселерометр не показывает 0+g.

Показывает.

Акселерометр всегда показывает суму вех действующий на него ускорений. У нас есть 2 составляющие – ускорение свободного падения (g) и собственное ускорение коптера (а).

Кода коптер стоит на земле – его собственное ускорение рано 0, соответственно акселерометр покажет 0 + g = g

Когда мы включим «тягу», у коптера появится собственное ускорение (а), и акселерометр покажет общее ускорение действующее на коптер (a + g)

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

Да, при включении тяги, показания акселерометра действительно изменятся на величину ускорения от тяги (a + g) — ( 0 + g) = а. Но это разница, а абсолютное значение ускорения коптера с «тягой» — (a + g).

Почему вы думаете, что когда мы в включим «тягу», то на коптер перестанет действовать ускорение свободного падения? У нас же не антигравитационный двигатель :)

Ставят обычно 3 гироскопа и 3 акселерометра, применяют хитрый программный фильтр

3 гироскопа и 3 акселерометра ставят, если эти датчики одноосевые. В статье я говорю сразу о 3х-осевых приборах. А вот о «хитром фильтре» и пойдет речь в следующей статье.
0
Я вижу два взаимоисключающих утверждения:
Не совсем понял вашу мысль. Если коптер в воздухе без «тяги», то но будет падать (но не совсем «свободно», т. к. есть сопротивление воздуха) и акселерометр покажет значение близкое к 0.
Когда тяга=0 акселерометр не показывает 0+g.

Показывает.
Где ошибка? В первом, во втором, или в том что они взаимоисключающие?
0
Где ошибка? В первом, во втором, или в том что они взаимоисключающие?

Ошибки нет, в первом случае мы говорим о ЛА, который находится в состоянии свободного падения (акселерометр покажет 0), во втором – о ЛА который неподвижен и не имеет собственного ускорения (акселерометр покажет g).

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

Итак, коптер вист в воздухе (это значит, что подъемная сила создаваемая винтами уравновешивает силу тяжести). Собственного ускорения в этом случае у коптера нет (он висит, никуда не двигается) и акселерометр покажет 0 + g = g

Далее, мы увеличиваем обороты двигателей, увеличивается подъемная сила и коптер начнет подниматься вверх с ускорением (а). Акселерометр покажет сумму двух векторов ускорений (g + а).

По сравнению с неподвижным состоянием, показания изменятся на величину (g + а) — (g + 0) = а

Если мы остановим двигатели, коптер начнет падать и акселерометр покажет величину ~0
0
Продолжаем мысленный эксперимент:
В течении 0.1 секунды после начала падения была накоплена ошибка интегрирования по крену два градуса.
Акселерометр продолжает показывать 0.
В течении 0.2 секунды управляющая система повернула коптер на 2 градуса, и думает, что сейчас он горизонтален.
Акселерометр продолжает показывать 0.
Система ни сном ни духом о том что на 2 градуса ошибка.
Как она узнает? Акселерометр 0 кажет.
Включаем двигатели. (Ага, ну вот сейчас-то мы поймаем ошибку… фигушки!)
Акселерометр покажет g.
Коптер начнёт ускорятся вправо и немного снижаться.
Датчик высоты заметит снижение и поддаст газу.
Система управления уверена, что аппарат завис.
Ускорение вправо продолжается.
Акселерометр показывает g+dg. Вертикально в координатной системе коптера.

Вывод — акселерометр не позволяет
определить текущее положение ЛА в пространстве
.
0
Определяет положение в пространстве не акселерометр, а БИНС, в состав которой входит гироскоп, акселерометр, цифровой компас и «суровая математика», например, тоже фильтр Калмана.

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

Но на практике, погрешность накапливается не так быстро (не 2 градуса за 0.1 сек). Пока коптер будет находится в свободном падении расчетные значения углов отклонятся очень незначительно (мы же не собираемся падать с высоты 1000 метров). После выхода из состояния свободного падения накопившаяся погрешность постепенно компенсируется.

Конечно, такая БИНС не идеальна, ее можно попытаться «обмануть», но для наших целей вполне подходит. Собственно, какие еще есть варианты? Установить на коптер лазерный гироскоп?
0
Reobne, Вам в данном лучае придется принять на веру, что при неподвижном акселерометре он будет показывать ускорение g по соответствующей оси или ее проекции на свои оси, ели они не совпадают с направлением g. Это факт описанный в документации на акселерометры и соответственно проверенный на практике.
0
Боюсь вас запутать, но всё таки:
— Известно, что хомяки дышат.
Вы дышите. Значит вы хомяк? Нет конечно!
— Известно что неподвижный акселерометр показывает g.
В данный момент он на коптере показывает g. Следует ли из этого, что коптер неподвижен?

Другой занятный пример:
— Вектор скорости коптера равен нулю, уговые скорости тоже нулевые. Следует ли считать, что коптер неподвижен? Вроде-бы да, а как-же иначе! А если коптер неподвижен, то акселерометр показывает g? Вроде-бы да, согласно документации.
— Подбрасываем коптер вертикально вверх (без включения двигателей). В момент времени, когда он достигнет максимальной высоты все его скорости будут нулевые. Однако акселерометр будет показывать почти ноль. Вот мои «Вроде-бы да» оказались на самом деле «Нет».
0
В данный момент он на коптере показывает g. Следует ли из этого, что коптер неподвижен?

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

Поэтому в БИНС и используется сложная математика, которая обрабатывает данные (не всегда точные и достоверные) с кучи датчиков и позволяет предположить реальное положение копрера.

Если бы существовал некий датчик, который при любых условиях и достаточно точно позволял определить положение коптера – никто бы не связывался с гироскопами, акселерометрами и БИНС.
0
Акселерометр всегда показывает суму вех действующий на него ускорений.
Ускорение не может ни на что действовать =)
Действует сила. И, на самом деле, акселерометр измеряет силы, действующие на «грузик» внутри него, которые пропорциональны ускорению. F=m*a
Поэтому он и показывает в состоянии покоя 1g. Хотя при этом никакого ускорения нет — это действует вес «грузика».
0
«Покой нам только снится» :)
Допустим аппарат с акселерометром на борту свободно падает.
Какая сила действует на грузик внутри акселерометра?
Всё та-же сила веса! И всё!
Однако показания акселерометра изменились. Почему?
Потому что мы забыли про «пружинку» внутри акселерометра, которая соединяет грузик с корпусом! Вот её-то деформацию и измеряет акселерометр.
Но нам эта деформация как таковая не нужна.
Вообще и пружинка и грузик лишь инструменты измерения.
А объект измерения это ускорение платформы (кажущееся). Откуда маленький приборчик может знать о силе действующей на аппарат? Он понятия не имеет о его массе.

Ускорение не может ни на что действовать =)
Действует сила.
Сила не может ни на что действовать :) Действуют физические законы.
Физические законы определяют силы, которые определяют ускорения, которые определяют скорость изменения скорости, которая определяет скорость изменения координат.
0
Я почти согласен.
При свободном падении вес отсутствует ;) наступает невесомость.
Приборчик знает о силе действующей не на аппарат, а на свой внутренний грузик.
А масса грузика нам не нужна — акселерометр выдает значение силы.
Точнее разработчики умножают это значение на некий коэффициент чтобы привести выходные значения в нужный диапазон.

З.Ы. Пружинка есть — да, сила натяжения её при свободном падении равна нулю.
0
сила натяжения её при свободном падении равна нулю.
Хотя не факт. Но величина будет приведена к 0 на выходе.
0
Я вас понял. Вы говорите о кажущемся весе грузика относительно платформы. А я решил что о абсолютной силе веса. (То есть силе гравитационного взаимодействия грузика и Земли. Она-то никуда не изчезает.) :)
0
Да =)
0
Если уж заниматься буквоедством, то физические законы не могут ни на что действовать, они лишь описывают наблюдаемые явления.
0
В аппноте писано про калибровку, 1-2 градуса точность для lsm303.

www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00269797.pdf

Глубоко не читал, но похоже это то о чем я и сам давно думал.
0
Эм, а чего в личном блоге статья?
0
А если поставить 2 и более акселерометра по разным концам аппарата — разве нельзя будет и рысканье отловить и более точно крен и тангаж вычислить?
0
Я так понимаю, Вы предлагаете поставить несколько акселерометров с разных сторон, и по разности их показаний измерять угловое ускорение вращения по осям?

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

Погрешность будет больше чем в варианте с гироскопом и одним интегрированием.
0
Добрый день, господа!
Позвольте мне немного подправить понимание того, что измеряет акселерометр. Согласно определению акселерометр — прибор, измеряющий проекцию кажущегося ускорения. Кажущееся ускорение — это ускорение, возникающее под действием негравитационных сил, т.е. акселерометр не может измерять ускорение свободного падения (g). Тогда возникает, что же измеряет акселерометр, находящийся в покое на Земле? А измеряет он ускорение от силы реакции опоры (согласно 3-ему закону Ньютона). Если внимательно посмотреть в какую сторону направленна сила, ускорение от которой измеряет покоящийся акселерометр, то она направлена вверх, а не вниз, как сила тяжести.
Летательный аппарат (ЛА), который находится в состоянии свободного падения будет измерять только ускорение, возникшее от силы аэродинамического сопротивления воздуха (т.к. реакции опоры не будет), которое очень мало и я не уверен, что MEMS акселерометр измерит его (хотя можно и оценить). Если ЛА «зависат» в воздухе, т.е. сила тяги двигателей уравновешивает силу тяжести, то акселерометр в этом случае будет измерять ускорение именно от тяги двигателя, которая «подменивает» силу реакции опоры для случая покоящегося на Земле ЛА.
+1
Большое спасибо за уточнение. Я всегда думал, что ускорение в 1g, которое показывает акселерометр в состоянии покоя, это и есть ускорение свободного падения, а получается что это реакция опоры/подвеса (-g).
Но, в нашем случае, это ничего принципиально не меняет (корме направление вектора).
0
Немного подправил статью. Еще раз спасибо за уточнение.
0
засечь изменение гравитации от высоты

думаю, что это вряд ли. Сделал простую прикидку. Если взять акселерометр, с диапазоном измерения +/-2g и предположим, что преобразователь у нас 16-ти разрядный, то 1 разряд будет равен примерно 0,000006 g. Согласно ГОСТу ПЗ-90 (Параметры Земли) такое изменение ускорения свободного падения будет наблюдаться при подъеме на высоту 200 метров (если на экваторе). Обычно показания акселерометров «шумят» 2-4 разряда, что будет соответствует разбросу высот 400-800 метров. Думаю, что не многие любительские коптеры летают на бОльших высотах, поэтому изменением ускорения свободного падения с высотой можно пренебречь (во всяком случае на первых порах).
0
В своих фантазиях я представлял боевой рой квадрокоптеров. Обьёмы роя — десятки кубических километров. :) С 64-разрядными акселерометрами. :)
0
Прикинул ускорение от архимедовой силы. (Это сила со стороны воздуха, а значит акселерометр её должен показать) Значения порядка 5*10^(-4) метра в квадратную секунду.
Если усреднять подольше, то возможно вариант…
0
Пожелание: хорошо бы побольше ссылок на книжки, статьи со спец.форумов — типа дайджеста по этому делу и кратенько так.
+2
Матвеев В.В. Основы построения бесплатформенных инерциальных систем.
Очень достойная книга по БИНС. Настоятельно рекомендую к прочтению.
0
Хе-хе, ЫЩЁ добавлю для Ынштейнов:
Ишлинский А.Ю. Классическая механика и силы инерции (1987)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.