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

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 гр. , а стала пуступать дозированно

Donkrat

У нас пид не работает впринципе с угловыми скоростями .

Вот я говорю нет 3 мнения. Мне кажется пид работает с чем угодно меняющемся со временем и что надо стабилизировать

Samer

Заметил такой эффект. У меня есть автогаз по углу наклона.
формула ( 1/(cos (угол_пульта ) - 1 ) * кофф. Как только даю наклон
автоматом добавляется газ , коэффициент меняем с крутилки на пульте. Можно добиться идеально ровного полёта при подаче угла наклона. Но вот обратно если бросить стик , угол равен 0 , добавочный газ тоже ноль .Квад продолжает
полёт по инерции и его закидывает вверх по высоте . Это может быть эффект крыла у пропов или это остаточная тяга моторов , что скажете.

zealot01
Samer:

Квад продолжает
полёт по инерции и его закидывает вверх по высоте . Это может быть эффект крыла у пропов или это остаточная тяга моторов , что скажете.

Может это
ooobskspetsavia.ru/…/rabota-nesushhix-vintov-pri-k…

Donkrat

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

Samer

Привет всем . Активное торможение на регах есть. С пульта приходит команда на уменьшение угла . Газ успевает сбросить за 0.1 сек. и за это время PID не
вернёт угол так быстро. Значит всё дело в набегающем потоке.
Достаточно всего небольшого импульса тяги чтобы его понесло вверх . Можно дописать интеграл в минус газа от величины прироста по формуле .
А как это работает в прошивках у большинста ПК. Есть ли обратная связь через ускорение акселерометра. Я как то делал и когда его сверху резко давил он сопротивлялся и если снизу то уменьшал обороты. Стоял практически на месте .Но при движении с наклонами будет наверно сложно это реализовать.

Donkrat:

Коп же опускается сначала медленно даже на нулевом газе

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

Donkrat

А у меня тормоза нет)кстати а если отслеживать вертикальную сост. ускорения. Как раз ее интеграл,т.е скорость подъема должна быть 0 при неизменном газу, хотя аксел обычно фильтруют так что он очень медленный

Samer
Donkrat:

хотя аксел обычно фильтруют так что он очень медленный

Я делал так : усреднял аксель по Z в интервале 1-2 сек , находил величину вектора гравитации. И параллельно вычислял среднее за меньшее время, чтобы уловить ускорения. Разница между ними шла на приращение тяги всех двигателей. Он чётко реагировал на толчки сверху или снизу. Но только на резкие ускорения.

Donkrat

По ходу нет быстрых, точных и высотных датчиков по котрым можно это делать

Samer
Donkrat:

По ходу нет быстрых, точных и высотных датчиков по котрым можно это делать

У меня барометр ms5611 , там нет заявленной точности ±10 см. Шумит ±40 см и может прыгнуть до 1 м. Долго не мог заставить держать высоту. И стал просто периодически обнулять P PID высоты и стало лучше. Понял что нужно импульсное управление высотой. Большая инерция , и мало выборок. Если их ещё и фильтровать по совсем плохо. Его надо как бы пинать немного вниз вверх , а I высоты накапливать подольше . Показания с него беру 2 раза в сек. Там в коде стояла задержка на 10мсек после запроса на приём данных. И я её убрал и разбил код на 3 отдельные функции. Каждая выполняется через несколько циклов общего кода и получается задежка автоматически а не паузой общего кода.

Samer
Donkrat:

Пора уж samerfly делать)))

Блин ну очень напрягает пока в полётах по камере это сам угол наклона камеры.
Приземлятся очень паршиво , не видно земли когда мы в горизонте.
Была идея сделать квад с сервами на наклон осей ВМГ , чтобы сам корпус был
всегда в горизонте. Решили бы сразу кучу проблем. Но руки не дошли.
А сам софт для данной рамы фигня. Трудно сделать такую конструкцию жёсткой
и лёгкой. Я тут сменил на камере FOXER линзу на 3.8мм с углом 75 град.
И стало намного лучше. Он уделал Игла 2. Теперь ищу линзу на 6мм чтоб стало 50-55 гр поле зрения. Как народ летает с 120 гр не понимаю , у меня всё размыто и мелко , особенно в движении.
Размер кода для ПК 26.3 кБайт , а в пульте 17 кбайт.

Donkrat

Сделать серву для камеры на крутилку. Я код ваще утрамбовывал в 8к, а пульт то ваще пару кб)) у меня 90гр. Иногда хочется шире видеть , но начнет искажаться все. Вопросик не в тему, в очках летаешь? В каких?

Samer
Donkrat:

Сделать серву для камеры на крутилку. Я код ваще утрамбовывал в 8к, а пульт то ваще пару кб)) у меня 90гр. Иногда хочется шире видеть , но начнет искажаться все. Вопросик не в тему, в очках летаешь? В каких?

У меня шлем 7" с исправленной прошивкой для коррекции формата аналогово входа. Вместо 7" изображение стало примерно 5.5" ( по центру экрана ) и влезло больше информации от камеры. Так комфортнее , жалею что не купил 5" . Получается использую не все 1280х800 а меньше.

Samer

Сегодня протестировал удержние высоты. Работает не плохо.
Держит в пределах 50 см чисто по бародатчику . Также настроил спасение при потере пульта. При потере сигнала переводит газ в режим висения, опускается до высоты взлёта + 1 метр и отрубает двигатели. Пришлось много раз настраивать PID по высоте. В итоге всё отлично. С любой высоты спускается до 1 метра и вырубается. А летать начал просто шикарно. Автомат газа работет отлично. Если его настроить до 30 гр. то при 35-40 мы начнём снижатся . Сегодня как бы пересел с механики на автомат. В стабе управляется всего одним стиком по YAW. Разворот на месте на любой скорости. При небольшой скорости и не большому YAW отлично делает круги , с направлением морды в центр. Всё дело в правильном PID по YAW .
До этого был недо ID. Вроде работал , но не то. Сейчас если его руками вращать то он возвращается в первоначальный азимут. Не важно на сколько его повернуть 30 или 130 градусов. И пришлось применить для управления по YAW интеграл . Фото ПК , вес 5 гр, на ардуино нано сверху припаян 10DOF GY-86 . Гира 6050 выпаиваится отлично. Уже поменял, сдохла ось Z акселя при падении . Менял такие микрухи первый раз и удачно, всё заработало . В общем такой ПК ничем не уступает другим на мощных чипах. Да нет ОСД ,но как то не надо . Напряжение передаёт , пульт пищит при определенном напряжении , при малом RSSI включается вибро в пульте. Сейчас более 20 параметров меняю в кваде с пульта. Данные с GPS забираю по I2С, передаю на пульт. Всё выводится на экран. Следующий этап полёты по GPS .