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

Samer
Donkrat:

И что, летает хорошо в маневрах полицейского разворота? Я просто уперся в то что если поднять квадр на бок, повернуть и положить на пол, то по факту он повернулся по z, а гироскоп естественно по y вернулся в то же положение, повернулся по х, а по Z гироскоп не поворачивался. Получается на боку вращение по х должно превращаться во вращение по Z. Просто жаль, что получилась очень не плохая телеметрия для визуального полета, но не уверен что это будет летать по 3 плоскостям.

Надо добавить всего три формулы для переводя вращения по Z в изменения по осям X и Y. К примеру наклонили в право по X на 30 гр. Если развернём по Z на 90 гр по часовой стрелке по по X будет 0 гр. а на Y 30 гр. Вот это преобразование и надо реализовать в формулах. В них учитывать угол поворота по Z , квадрант и угол наклона по X и Y.

kasatka60
Dozor-SPb:

Мне кажется, что у Мавиков все вычисления производятся мощным процессором, без помощи камер и сонаров - просто по данным с IMU

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

Dozor-SPb:

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

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

zealot01
Samer:

Надо добавить всего три формулы для переводя вращения по Z в изменения по осям X и Y. К примеру наклонили в право по X на 30 гр. Если развернём по Z на 90 гр по часовой стрелке по по X будет 0 гр. а на Y 30 гр. Вот это преобразование и надо реализовать в формулах. В них учитывать угол поворота по Z , квадрант и угол наклона по X и Y.

Это все верно, но проблема в том, что оси гироскопа по сути математически равнозначны и вращение вокруг одной оси вызывает вращение двух других. Если мы рассуждаем, что вращение по Z переводит X в Y, мы также должны принять, что вращение по X меняет положение осей Z и Y, а вращение по Y меняет X и Z. Если этого не учитывать, то к дрейфу гироскопа прибавится ошибка вычислений.

Donkrat

Я думал насчет преобразований в этом смысле. То есть степень перехода одной оси в другую зависит от наклона третьей, типа синусов-косинусов. То есть если по Х у нас 45 градусов, то есть он стоит на полу на двух моторах под углом 45 к полу по осиХ. Я его вращаю не отрывая от пола и не меняя угла по Х. Получаю что относительно самого себя по Z я его не вращал, потому что оба мотора на полу, а показывает что вращал, хотя по факту вращал и по У и по Z… Я когда его крутил во все стороны и смотрел углы именно чисто гироскопа на экране пульта, то что то складывалось , а сейчас чот кружится все в голове от 3д картинок, надо мож было попробовать все таки управление по 3ей оси дописать и попробовать его в деле…

Такое ощущение что мы с вами крутимся вокруг этих матриц поворота только своими словами. Вообще заметил что все улучшения сейчас сводятся к введению зависимостей пидов от газа, угла наклона ручек, скорости их наклона, даже от ускорения их наклона и фильтрации шумов. Мне в принципе хватило бы и своей проги, но было желание летать в очках, но без осд думаю это не просто. Поэтому к сожалению уже дошел до матека 722 и прям балдею от кучи параметров полета в очках. Помню как еще во времена мультивия(господина Маховия) чуть ли не всем форумом пытались дотачивали его, хотя 90% писал он. Были времена…

Samer
Donkrat:

Я думал насчет преобразований в этом смысле. То есть степень перехода одной оси в другую зависит от наклона третьей, типа синусов-косинусов. То есть если по Х у нас 45 градусов, то есть он стоит на полу на двух моторах под углом 45 к полу по осиХ. Я его вращаю не отрывая от пола и не меняя угла по Х. Получаю что относительно самого себя по Z я его не вращал, потому что оба мотора на полу, а показывает что вращал, хотя по факту вращал и по У и по Z…

Такие манёвры не возможны в принципе, только руками . Если будет наклон 45гр то он должен лететь прямо. Без разворота по Z у нас будет управление крестиком. Вправо , в лево ,прямо и т.д. Если по осям нули то вращение по Z вообще без проблем. А если есть угол наклона то измеряя вращение по Z мы
вносим коррекцию по X и Y и PID корректирует оси. Например при движении прямо под 45 гр с пульта даем дисбаланс на оси для вращения по Z. Гира по Z измеряет угол поворота и вносит изменения по углам X и Y , которые не зафиксировали гиры по Х и Y. PID докручивает каждую ось и наши передние моторы как бы остаются на полу , но мы меняем вектор движения .

Donkrat

Вот , вот, теперь начинает проясняться! Я не правильно выразился насчет полицейского. Как называется у нас разворот с ходу когда обе ручки влево или вправо?
Мне интересно ваш хорошо летает?

Samer

Летает хорошо .По камере пока не летал , то времени нет, то погода , то зрение изменилось и пришлось переделывать линзы в шлеме с 3диоптр. до 5 диоптр.
Как то попробовал но экран был слишко большой трудно было фокусировать зрение . Сейчас уменьшил картинку (залил прошивку с новым сканом по аналогу и из 7дюй. стало примерно 5дюймов по диагонали , четкость картинки стала лучше на порядок. ) и буду пробовать. Ну и сделал в размере 250 .

Donkrat

Был в краснодаре в августе, еслиб раньше я зарегистрировался можно было б встретится, пообщаться))

26 days later
Samer

Начал дописывать код на АКРО режим. Сделала пока так : Убрал все коррекции по акселю и развороту.
В PID регуляторе обнуляю значения интегрирования гир по углам наклона в момент не нулевого значения данных по стикам X Y.
При положении стика в 0 коптер держит оси X Y . Если по оси есть данные
, эти данные становятся ошибкой и PID их отрабатывает. Интегрирование угла в этот момент обнуляю. Работает нормально, делает полные развороты , пока в руках.
Но в этот момент пропадает полностью стабилизация по этой оси, так как нет обратной связи . Кто может проверить данный момент на своём кваде.
Если дать немного стиком и в этот момент рукой вращать коптер по данной оси будет сопротивление или нет.

Donkrat

Мне кажется в акро вообще нет интегрирования, нам же нужна ошибка угловой скорости а не угла

И если вращать сильнее чем стик то должен сопротивляться. Мож пиды маловаты по Р

Samer
Donkrat:

Мне кажется в акро вообще нет интегрирования, нам же нужна ошибка угловой скорости а не угла

И если вращать сильнее чем стик то должен сопротивляться. Мож пиды маловаты по Р

Ошибка=Интеграл_гир - Угол_пульта

При стаб режиме мы с пульта шлём угол и пид отрабатывает его пока ошибка
не станет равной 0. Для этого коптер должен повернутся и угол его поворота
будет в Интеграл_гир .

Сделал по другому.

Инт_угла=Инт_угла + Угол_пульта*кофф
Ошибка=Интеграл_гир - Инт_угла

При АКРО нам надо постоянное вращение на любое отклонение стика.
Надо просто проинтегрировать сам угол с пульта через коэффициент.
Мы получим как бы постоянное увеличение угла , до любых градусов.
И PID будет жестко следить за скоростью поворота, у будет стабильная скорость вращения . В этом варианте работает лучше .

Далее возможно 2 решения. Если эти углы не обнулять
там накопится что угодно и при возврате в стаб PID отработает эти углы .
И сами значения этих углов не важны 350 гр. или -180 гр , это не повлияет
на само удержание в нужном угле.
Лучше их обнулять кратковременно в момент возврата стика в 0 или при переключении в стаб .
Причём обнулять надо одновременно Интеграл_гир и Инт_угла .
Проверить есть интегрирование или нет просто. Надо в АКРО довести угол
наклона например до 45 гр и включить стаб. Если он сразу восстановит горизонт , значит высчитал угол . А если медленно , то корректируется по акселю.

Пока писал возникла идея корректировать по акселю одновременно Интеграл_гир и Инт_угла при стике в 0 .
Причем с учетом их ошибки , чтобы не сбивать PID. Допустим при флипе насчитали 350 гр.
в Интеграл_гир и Инт_угла . PID держит -10 гр. настоящий . В этот момент корректируем по акселю
Интеграл_гир и Инт_угла до -10г. Коррекция может быть более скоростной чем при стабе , так как она не влияет
на PID .

Samer

Просто суперское решение - корректировать по акселю одновременно Интеграл_гир и Инт_угла при стике в 0 .
Работает идеально !!! При возврате в стаб возвращается в горизонт сразу.
Есть иногда погрешности , т.как вращение происходит в руках .

zealot01
Samer:

Просто суперское решение - корректировать по акселю одновременно Интеграл_гир и Инт_угла при стике в 0 .
Работает идеально !!! При возврате в стаб возвращается в горизонт сразу.
Есть иногда погрешности , т.как вращение происходит в руках .

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

Donkrat

А если: ошибка=угл.ск. с гиро-угловая с пульта. Угл. с пульта= положение стика×коэфф. В этом помоему суть акро

Samer
Donkrat:

А если: ошибка=угл.ск. с гиро-угловая с пульта. Угл. с пульта= положение стика×коэфф. В этом помоему суть акро

Суть акро дать любой угол наклона , не привязанный к положению стика.
Угол наклона будет зависеть от скорости нарастания угла.
Если угол с пульта 5 гр. то инт_угла=инт_угла + 5* 0.01
Если угол с пульта 15 гр. то инт_угла=инт_угла + 15* 0.01
Всё присходит в общем цикле примерно 330 раз в сек.
В первом случае скорость будет 16 гр в сек.
А во втором случае скорость будет 50 гр в сек.

И режим возврата из АКРО в СТАБ происходит очень редко. И даже такой коррекции хватит чтоб вернуть в горизонт. Надо поспрашивать народ на эту тему. Как работает при полном перевороте или при активных манёврах.

Donkrat

А ты мультивийный код не глядел? Мне кажется даже в каких то видео суть акро это с пульта давать скорость вращения. Если стик 0 то скорость вращения 0 и коптер летит хоть вверх ногами, но не вращаясь. Акро проще англа по коду и не использует акселерометр

Мне кажется усложняешь. И не пойму зачем вообще интегрировать в акро

Samer

Хорошо сколько PID у нас в прошивке 1 или 2. Один для акро другой для стаба и для каждого свои D P И I.
Это не так. Суть PID пусть пока без всяких внешних данных это стабилизация осей. Он превращает коптер в гираскоп, который трудно наклонить по осям.
Если мы даем ему задание в виде нового угла , он его выполняет и держит этот угол . Ему пофиг каким образом мы передали ему это задание. Если угол не меняется он его держит , если меняется то вращаясь следит за ним.
Почему не использовать аксель если он есть, он же используется в стабе. Интегрировать надо , чтобы было постоянное вращение . Так как у нас будет постоянный прирост угла .

Donkrat

Если дать со стика 20гр.с и коптер начнет вращаться со скоростью 20гр.с то ошибка будет 0 и он будет бесконечно вращаться с этой скоростью пока не отпустишь стик. Кароч нам надо третьего чувака для дискуссии😁

Samer
Donkrat:

Если дать со стика 20гр.с и коптер начнет вращаться со скоростью 20гр.с то ошибка будет 0 и он будет бесконечно вращаться с этой скоростью пока не отпустишь стик. Кароч нам надо третьего чувака для дискуссии😁

Всё правильно описал. Но ошибка не всегда будет 0.

Инт_угла=Инт_угла + Угол_пульта*0.01
Ошибка=Интеграл_гир - Инт_угла

С пульта дали данные , не важно как мы их называем, углом или скоростью угла. Эти данные вызывают ошибку для PID. Он воздействую на моторы вызывает вращение .
Угол вращения определяем интегрируя гиры. И пока Интеграл_гир не уберёт ошибку будет вращение на приращение угла.
Да блин всё просто.

Инт_угла=0 + 20*0.01= 0.2 ошибка 0.2 град ,
PID поворач. ось на 0.2 гр Интеграл_гир=0.2 гр ошибка=0

Инт_угла=0.2 + 20*0.01= 0.4 ошибка 0.2 град ,
PID поворач. ось на 0.2 гр Интеграл_гир=0.4 гр ошибка=0

Инт_угла=0.4 + 20*0.01= 0.6 ошибка 0.2 град
PID поворач. ось на 0.2 гр Интеграл_гир=0.6 гр ошибка=0

Инт_угла=Инт_угла + 20*0.01 этот процесс происходит у меня 330 раз в сек. и за 1 сек Инт_угла =66 град , полный оборот будет за 5 сек.
Чтобы оборот был за 1 сек. нужна скорость 360 гр/сек. Надо либо увеличить коэффициент до 0.0537 либо дать с пульта число 109
Меняя коэффициент , меняем скорость вращения при одинаковом наклоне стика пульта.
Но существует конечная скорость вращения которая упирается в настройки DIP. Если не использовать контролируемую скорость мы не затормозим в нужный момент.
Есть разница между приращением 0.2 гр за 3 мсек или 1гр за 3мсек. Существует инерция рамы , инерция ВМГ, инерция обратной связи по гирам.
У себя на стенде сделал измерение динамики тяги в импульсе.
Мотор 2204 винт 5.1x4.6x3 ,выход ВМГ на заданную тягу происходит примерно 0.15 сек .

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

Donkrat

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

Samer

У нас пид не работает впринципе с угловыми скоростями .
У него нет задачи удерживать стабильную скорость вращения. У него задание
не допускать вращение , держать заданный угол.
Вот к примеру в стабе стик двигаем вперёд. У нас угол будет менятся о 0 до 45гр к примеру. Мы можем стик передвинуть медленно , ну скажем за 5 сек.
Если пульт дает 50 пакетов в сек. то в каждом пакете будут идти углы
с приращением в 45/5/50=0.18 град. И за 5 сек коптер наклонится на 45 гр. Система стабилизации будет увеличивать угол наклона шагами по 0.18 гр. до 45 . А если представить что стик у нас круговой и вращается бесконечно , тогда и коптер будет вращатся бесконечно. Но такого стика нет и это как бы
вращение реализовано через интеграл. И нет никакой разницы между стабом
и акро в способе изменения угла наклона. Это просто приращение угла.
Но в стабе это ограничено углом наклона, жёстко привязанным к положению стика. Начальное вращение что в акро что в стабе это одинаковые процессы. Единственное отличие в стабе это коррекция гир по акселю .

Переход в акро , это всего 4-и строчки кода

## код

if(kom3==0) {

## Код только для стаба
Инт_угла_x=Инт_угла_x *0.98 + Угол_пульта_x*0.02;
Инт_угла_y=Инт_угла_y *0.98 + Угол_пульта_y*0.02;
}

if(kom3==1) // переход в акро режим
{
Инт_угла_x=Инт_угла_x + Угол_пульта_x*коф_скор_вращения;
Инт_угла_y=Инт_угла_y + Угол_пульта_y*коф_скор_вращения;

}

Ошибка_x=Интеграл_гир_x - Инт_угла_x
Ошибка_y=Интеграл_гир_y - Инт_угла_y

Вроде одинаково , но в этой формуле мы просто сглаживаем данные с пульта
Инт_угла_x=Инт_угла_x *0.95 + Угол_пульта_x*0.05;

Если резко дать угол или бросить стик , то на ПИД не поступит слишком большая ошибка .
Это работает и при возврате из акро в стаб.
К примеру повернули его на 180 гр. и переключились.
На пид не пошла ошибка в 180 гр. , а стала пуступать дозированно