Стабилизация квадрокоптера (PID)

zealot01
Samer:

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

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

Samer

Причём тут воздух. Коптер летает в режимах стабилизации от 0 до 30-40 гр. И когда он летит равномерно аксель показывает данные как на столе,
только более шумные из за вибраций. И только в моменты ускорений и торможений угол будет ошибочным.

zealot01
Samer:

И только в моменты ускорений и торможений угол будет ошибочным.

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

Samer
zealot01:

Ну попробуйте мысленный эксперимент. Коптер завис на одном месте. Показания акселерометра по осям 0,0,g. Повернем коптер на 90 градусов по питчу или ролу. Показания акселя как ни странно не изменились 0,0,g. Коптер начинает разгонятся в сторону куда его повернули(двигатели) и одновлеменно падать вниз (гравитация) и только когда сопротивление воздуха уравновесит эти силы аксель покажет правильный угол по горизонту. Теперь понятно почему аксель только коректирует гиру?

Во первых ось Z всегда показывает ускорение своб. пад. 9.8 м.с.кв , при настройке в 16гр это число около 2000 а не 0.
При наклоне это ускорение появляется на оси X или Y . 2000 появится при наклоне 90 гр., на оси которую наклонили а на Z будет 0. Чтобы по Z был 0 при горизонте , надо скинуть коптер с крыши без пропов. А при ускорении вверх Z наоборот возрастает .

zealot01:

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

Это по чему ? Я не привёл самый основной кусок кода где есть коррекция по осям от вращения.

fademike
Samer:

Вот что значить править чужой код и не понимать основ.

Да не любитель я брать чужое. Смотрю как люди делают, пишу сам и пробую по-разному. Углы Эйлера только взял чужой код для расчета севера по магнитометру. и Всё!

Основы (статья, книга) мне на глаза не попались. Смотрел чужой код, на сырые данные и в итоге написал вот это вот… но ничего, перепишу!
Спасибо за разъяснение!

zealot01
Samer:

Во первых ось Z всегда показывает ускорение своб. пад. 9.8 м.с.кв

А у меня что ?0,0,g -это x=0,y=0,z=g.

Samer:

При наклоне это ускорение появляется на оси X или Y . 2000 появится при в 90 гр. на оси которую наклонили.

Не сразу, а как только квадрик будет двигаться без ускорений, тобишь сопротивление воздуха скомпенсирует силу моторов и гравитации. Квадрокоптер в итоге превращается в самолет и по z в итоге будет 0, вы же летали в самолете, вот квадрокоптер повернутый на 90 градусов это самолет)

Samer:

Я не привёл самый основной кусок кода где есть коррекция по осям от вращения.

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

Samer
zealot01:

Квадрокоптер в итоге превращается в самолет и по z в итоге будет 0, вы же летали в самолете, вот квадрокоптер повернутый на 90 градусов это самолет)

Да какого хрена ? По Z данные будут меньше пропорционально углу наклона . При наших небольших углах наклона это 2000* cos(35Гр )= 1638
Если фристайл то там управление по гирам и полностью ручное , и пофиг что нам выдаёт аксель. Опишите для начала диаметр круга и скорость, и способ поворота . Если угол запредельный , например 45-50 гр, то и скорость будет максимальная , такие режимы тоже ручные.

Ранее я приводил код.
if ( abs(ug_xa)<45 && abs(ug_ya)<45 ) { ug_xg = ug_xg*0.999 + ug_xa*0.001; // комплиментарный фильтр
ug_yg = ug_yg*0.999 + ug_ya*0.001; // коррекция гир по акселю 0.001
}
Как видно коррекция только до 45 гр.

zealot01
Samer:

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

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

fademike
Samer:

Пропы должны быть жесткие. Я ранее потратил много времени не понимая что гибкие пропы на 11" у меня флатерят.
Думал что у меня наводки или вибрации на ПК. Он периодически резко вздрагивал по осям.

Вот я усредняю данные потому что заметил от гироскопа мощные импульсы 1-2 раза в секунду на оборотах 40%. Далее вроде учащаются случаи. И подергивается немного коптер от каждого импульса. После усреднения проблема пропала. Думал отложить решение этой проблемы, но лучше сразу найти причину.
На счет безопасности, у меня через 2 секунды ПК отключает мотор, если не получил команду с “земли”. Плавный спуск потом уж добавлю, когда выше 10см взлетит)
Стенд с шарниром - отличное решение!

Samer

Не представляю реальные задачи для таких маневров. Например при 5м/сек и радиусе в 50 метров ускорение 0.5м/сек.кв
Это даст погрешность в угле 2-3 гр всего atan2(100,2000) , Просто довернём рысканьем по Z и все.
Можно подумать на это способен в автоматическом режиме стандартный ПК, приведите пример.

Выложу ещё одну фичу. У меня на ПК через делитель сопротивления идёт бортовое питание.
U = analogRead(0)*0.0251;
Сразу получаем напряжение батареи в вольтах . Если умножить напряжение на газ висения , получим отличную переменную.
Я даю газ чтобы зависнуть , нажимаю кнопку и эту переменную записываю в память.
В любой момент времени деля переменную на текущее питание батареи получаем газ висения.
Пригодится для любых случаев.

1 month later
fademike
Samer:

Пригодится для любых случаев.

Те рекомендации реально помогли, спасибо! Реализовал с кватернионами и при вращении по одной оси ошибок почти нет, а при вращении по кругу (x,y,-x,-y) появляется ошибка 3-8 градусов наверное за 8 секунд. Это нормально? И калибровку акселерометра по z не сделать внутри коптера? Стенд надо городить?насколько это критично?
Кроме того, что было Вами сказано, в ПК больше ничего не надо добавлять?
Кватернионы взял из статьи: m.habr.com/ru/post/255005/

Samer

Вращение по кругу это как ? Если вокруг оси с пульта или руками то гиры по х и у не должны выдавать данные наклона.
Если только сам чип гироскопа не в центре осей коптера . Проведи эксперимент крути ПК на столе вокруг оси и смотри что даёт гира по дгугим осям.
Если ПК наклонить ровно на 90 гр по X или Y , что выдаст софт ? Если опросов с гир мало , могут быть пропуски данных и углы будут с ошибками.
Ошибку можно уменьшить по акселю , изменив фильтр. Стенд нужен только для калибровки осей X и Y акселерометра , чтобы знать точный горизонт.
По Z акселерометра калибровка не нужна. Калибровка X и Y акселерометра критична . Если ног нет можно положить на пол, проверив уровнем .
В принципе можно и без калибровки , использовать триммер. Тример на пульте, и пульт всегда шлёт угол на нужную ось.
Но лучше тример в мозгах , запоминаем переменную и её вычитаем из PID
oshibka_x =ug_xg - dx - trim_x
Без калибровки по гирам не обойтись совсем , главное в момент калибровки не трогать , положение коптера любое.
Попробу включи ПК и не трогай , посмотри что по осям .
В ПК добавлять ничего не надо , он висит и летает только за счет софта . Софт самое главное.

fademike
Samer:

Если ПК наклонить ровно на 90 гр по X или Y , что выдаст софт ?

Выдаст 90 гр, как и должно быть. когда кручу по 1-2 осям - всё ОК. А когда по трем, то начинаются смещения.
Например, если плата в самолете, то держу за хвост и кручу за передний мотор по кругу. получается если не кренить, то задействованы оси x и z. И когда самолет возвращаю к начальному состоянию, все смещения показывают 0.
Но если при кручении добавить крен (ось y), то когда самолет возвращаю в начальное состояние, то по оси y будет не ноль, как должно быть, а там копится ошибка.
Так и должно быть или что-то ни так?

Samer

zealot01 ранее писал что при движении по кругу аксель начинает показывать
центростремительное ускорение .Появляется ложный угол наклона, который
вносит ошибку в коррекцию гироскопа. Как выриант можно уменьшать переменную коррекции гир по акселю в зависимости от данных Z пульта ( Курс, Yaw) . Но у тебя при отсутствии крена ошибка 0,
что непонятно. И в реале такие манёвры не возможны, очень маленький радиус вращения. Таже все данные верны если вращения идут через центр чипа гироскопа. При центре вращения сбоку гиры могут выдавать что угодно.
И только от софта зависит как это правильно обработать. И некоторые гироскопы могут выдавать ложные данные по X Y при вращении по Z.
Проведи эксперимент. Плата на столе , всё по 0. Подними наклони по X Y ( не более 40 гр ) с одновременным вращение по Z ( один оборот ) и верни на стол, что будет по осям.

zealot01
fademike:

Так и должно быть или что-то ни так?

Если считал только по калиброванному гироскопу, то дрейф от шумов и вибраций будет уводить показания. Нужно также поправлять по акселерометру. И даже тогда вектор направления будет крутиться вокруг оси z, нужно поправлять по компасу.) И таки да, ускорения негативно влияют на показания гироскопа.

fademike
Samer:

Проведи эксперимент. Плата на столе , всё по 0. Подними наклони по X Y ( не более 40 гр ) с одновременным вращение по Z ( один оборот ) и верни на стол, что будет по осям.

Если вернуть плату “на место”, то по Y и Z будут отклонения.
Я перепроверил и оказалось, что ошибки не появляется только в случае вращения по одной оси.

zealot01

Без исходного кода тут не разобраться. Я делал сначала глобальную переменную кватерниона нулевого вращения в памяти. Потом в цикле луптайма читал гироскоп по трем осям и определял по времени между циклами куда все отклонилось на последнем цикле, формировал по этим данным кватернион цикла. Потом перемножал глобальный кватернион и кватернион цикла и перезаписывал глобальный кватернион произведением. И так далее по циклу…

1 month later
Donkrat

Здравствуйте, если кому интересно тоже написал прогу для стабализации на меге8 и двухстороннюю связь с пультом, тоже со со своей прогой. Обмен 32 байтами на скорости 1мб/с. На пульте отображаются любые параметры коптера, которые умещаются в 32 байта и в экран 16×4 символов. Правда изза того что у пульта не работал стик по рысканью, то управление только по 2 осям. И когда наконец когда понял что для полноцеенного управления по 3 осям нужны матрицы поворота или кватернионы, то понял что сил и времени не хватит. Кстати вычисления с плавающей точкой, время цикла 3 мс при 8 мгц.

Работа с nrf24l01 по spi на аппаратном прерывании, могу выложить, если интересно

Samer

У меня получилось без матриц. Тупо обычная тригонометрия и синусами и тангенсами . Давайте обсудим как стабильно удерживать высоту. У меня подозрение что в мавиках используют оптическую стабилизацию. Ну как в оптических мышах. Сравнивают кадры и по вектору смещения выдают перемещение по Х и Y. Вопрос где происходит сравнение в камере или отдельный процессор. И эти данные ПК использует для удержания позиции.
Ну просто не возможно висеть не подвижно в ветер в одной точке. Ни аксель ни барометр на такое не способен. Вот если камеру там закрыть и проверить на удержание , то все станет понятно. Что скажете.

Dozor-SPb
Samer:

Вот если камеру там закрыть и проверить на удержание все станет понятно. Что скажете.

Зачем закрывать? Мавик держит позицию в ветер ночью на любой высоте. Камера там точно не работает