Создание собственной системы стабилизации

Geniok
djdron:

если не ошибаюсь вроде кристаллы они все равно в Китае заказывают

еще такие есть www.module.ru/catalog/micro/

Насчёт Китая не знаю, вряд-ли, они в основном на оборонку работают, но достаточно почитать errata на 91Т, там все основные ошибки описаны, многие из них довольно крупные ошибки, которые могут быть исправлены только при создании нового ядра, по признанию самих Миландровцев, поэтому данные ошибки кочуют из серии в серию.

oleg70
Geniok:

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

Справедливости ради, надо сказать что в STM, тоже есть немало косяков, особенно касаемо связки DMA и периферии…

Geniok
SergDoc:

Евгений, что NuttX рассказывает?

Да я честно говоря даже не подключался ещё, нечем пока, переходника uart-usb нет под рукой и когда появится неизвестно… ((
По поводу внешнего компаса тоже удивился, но дальше копать не стал, почему так пишет.

oleg70:

Справедливости ради, надо сказать что в STM, тоже есть немало косяков, особенно касаемо связки DMA и периферии…

Есть такое дело, но сколько сталкивался с СТМ, ничего фатального не было, а у Миландра, первое, с чем столкнулся - это бесконечное немаскируемое прерывание при использовании ЦАП. То есть, по факту получается, что ЦАП вроде есть, но работать с ним через прерывания невозможно, так как будешь постоянно висеть в нем. И подобных косяков куча, сталкивались даже с тем, что стек портится сам по себе, то есть заход в функцию по одному адресу, а выход из функции может быть в любой точке программы. Причём, такой баг ещё и плавающий. На хабре была как-то статья, целое расследование кто-то проводил…
Если бы был выбор, обходил бы их стороной…
habrahabr.ru/post/231373/
habrahabr.ru/post/223779/
habrahabr.ru/post/228531/

SergDoc
Geniok:

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

эт мне напоминает о прерывании в прерывании в 8-и битных авр?

Geniok:

Да я честно говоря даже не подключался ещё, нечем пока, переходника uart-usb нет под рукой и когда появится неизвестно… ((
По поводу внешнего компаса тоже удивился, но дальше копать не стал, почему так пишет.

ну нету и нету, компаса внешнего, просто там скорей всего пишет типа mtd read error при старте и ещё проц перед прошивкой бутлоадера точно весь стирался?

oleg70:

особенно касаемо связки DMA и периферии…

точно? а то может мы спокойно ждём прерывания от периферии, а надо от ДМА было ждать от периферии фиг получим…

Geniok

Возник глупый вопрос по ПИД-регулятору системы стабилизации.
Примем текущее положение коптера как наклоненное на 2 градуса вправо. Заходим в ПИД-регулятору. Заданное положение 0 градусов. Ошибка 2 градуса. Вычисляем пропорциональную составляющую, как П=Кп*ошибку. Пусть у нас Кп=10, тогда П=2*10=20.
Теперь интегральный составляющая И=Ки*СуммарнаяОшибка, пусть Ки=1.2, но так как частота работы у нас большая, очень скоро наша СуммарнаяОшибка достигает огромных размеров, на фоне которой наша пропорциональную составляющая будет каплей в море. Если СуммарнуюОшибку мы ограничим, то все равно очень быстро приходим к граничному значению.
Теперь дифференциальная составляющая, Д=Кд*(текущая ошибка-прошлая ошибка) / время цикла. Опять же есть вопрос, если мы стоим на столе или время цикла настолько короткое, что текущая и прошлая ошибка равны, то Для составляющая не действует совсем, но, как только мы стали двигаться, получаем следующее, пусть разность между текущей и прошлой ошибкой будет равна 0.05 градуса, Кд=5, тогда Д=5*0.05=0.25, что в сравнении с пропорциональной и интегральный составляющей очень мало.
Опять же, классическая формула П+И+Д, даёт вместо стабилизации какой-то расколбас.
Вот и хотелось бы узнать, в чем ошибка, какие нюансы не учтены?

SergDoc:

эт мне напоминает о прерывании в прерывании в 8-и битных авр?

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

SergDoc:

и ещё проц перед прошивкой бутлоадера точно весь стирался?

А вот этот момент думаю стоит уточнить, я как-то рассчитывал что он при перепрошивке сам сотрется, автоматом, специально для этого никаких телодвижений не делал.

SergDoc
Geniok:

Опять же, классическая формула П+И+Д, даёт вместо стабилизации какой-то расколбас.

Знаки уточни… недоруливание, переруливание… дифференциальная составляющая что тормозит или разгоняет?

rual
Geniok:

Опять же, классическая формула П+И+Д, даёт вместо стабилизации какой-то расколбас.
Вот и хотелось бы узнать, в чем ошибка, какие нюансы не учтены?

Никакого расколбаса если правильно выставлены коэффициенты. Если расписать все составляющие ПИД по ролям:
П: основная составляющая, регулирующее воздействие (РВ) пропорциональна ошибке. При отклонении от заданного угла ЛА “догребает” в сторону равновесия, но если возмущающее воздействие (ВВ) продолжает действовать, например в сторону сместился ЦТ, “догрести” до нулевой ошибки у П-регулятора не получится, ибо когда ошибка уменьшиться, то и РВ уменьшиться до равенства РВ=ВВ. Соответственно ошибка перестанет уменьшаться. Для того чтобы приблизить ошибку к нулю перейдем к следующему пункту))
И: РВ пропорционально накопленной суммарной ошибке. Даже если ошибка мала, то накапливаясь в интеграторе она постепенно увеличивает значение РВ, до тех пор пока ошибка не перейдет нуль и не изменит знак на обратный. Это увеличивает точность регулятора, но способствует “расколбасу” из-за задержки реакции РВ на ошибку. Для того чтоб избежать автоколебаний переходим к следующему звену.
Д: РВ пропорционален скорости (первой производной) ошибки. Позволяет “притормозить” (демпферировать) регулятор когда он “разогнался” исправлять ошибку благодаря звену И и может проскочить равновесное положение. Также звено Д позволяет быстро парировать кроткое и сильное ВВ, например порыв ветра.

oleg70
rual:

какие нюансы не учтены?

Пожалуй, лучше чем верхний пост, и не скажешь про ПИД… От себя могу только добавить, что “Д” компонента находится в определенной связке с “П” компонентой - она как бы “смягчает” влияние первой, посему надо их настраивать совместно и поэтапно (есть известная методика…) , это тоже надо учитывать…
кстати, от “И” можно в принципе вовсе отказаться…

SergDoc
oleg70:

от “И” можно в принципе вовсе отказаться…

это в идеальной системе, нужна она для наших целей…
вот дифференциальная почти линейно зависит от пропорциональной, опенпилоты в cc и cc3d её автоматом считают не вынося отдельно в настройки там только P I …
в идеальной системе (в немецких курсах) считали PD регулятор, так удавалось за доли секунды выровнять положение с заоблачными значениями пропорции и без всяких осцилляций…

okan_vitaliy

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

SergDoc

Виталий, чёт я ничё не понял ))) запутаю ещё больше - то что положительно для одной - отрицательно для другой стороны )))
А если я понял правильно, то это можно сделать не в ПИД-е, а в микшере, тупо - если один мотор +1, то противоположный -0.8 …

okan_vitaliy

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

SergDoc

блин, так, а я про что, микшер устроен так, что увеличение с одной стороны=уменьшение с другой, я и говорю что плюс одной стороны - это минус другой… и достаточно учесть это в микшере (ну попробовать хотя бы), а не городить сложнейший регулятор…

посмотри в микшер трикоптера в базефлайте - кто-то решил и посчитал что передних движков 2 задний 1, и составил микшер, я не пересчитывал, но визуально видно, что скорость полёта вперёд значительно выше чем назад, и токи заднего мотора на много выше…

rual
oleg70:

кстати, от “И” можно в принципе вовсе отказаться…

Виталий Олег, плохо прочитали пункт “и” моего поста(или я плохо написал;)).
Можно без “и”, но придётся очень точно устанавливать ЦТ коптера. Иначе получится вот что:
Имеем квадрик (“плюс” для простоты) который висит при тяге двигателей в 400 попугаев (ппг). Допустим мы подвесили на левый луч доп.груз весом 150 ппг. Соответственно, чтобы компенсировать крен, регулятор должен добавить тягу в 150 ппг. Динамику для простоты опустим, оставим пропорциональный регулятор П, с коэффициентом 1гр = 10 ппг. Отсюда получаем, что компенсирующую тягу квадрик получит только при крене в 150(ппг)/10(гр/ппг) = 15 гр. И останется с данным креном до снятия доп.нагрузки!
То есть квадрик перестанет переворачиваться влево только когда достигнет крена в 15гр, и благополучно полетит в левую сторону. Интегратор (И) же в течении нескольких dt накопит эти самые 150 ппг и создаст постоянный подпор на левый двигатель.

okan_vitaliy:

я имел ввиду, что инерция воздействия винтов на коптер при повышении оборотов и при понижении разная.
Имеется 2 набора пид коэфициентов.

Это уже динамика, Виталий. Я скажу более, на разных оборотах у одной и той же ВМГ разная приёмистость (способность за определенное время создать потребную тягу). Поэтому кстати при определенных конфигурациях коптеры болтает на снижении, т.к. ВМГ имеет средние обороты значительно меньше оборотов висения, и параметры ПИД не оптимальны для текущей передаточной характеристики ВМГ (приёмистости).

Тут вариант только один - адаптивный регулятор. Но это ещё сложнее - ПИД, параметрами которого управляет другой ПИД (конечный автомат, нечеткая логика ). Да и отрицательные коэффициенты тут мимо кассы, ибо если при переходе через точку равновесия сменить знак коэффициента, то РВ вместо того чтобы стать отрицательным и начать разгонять процесс обратно к точке равновесия, радостно продолжит разгоняться дальше от неё. А сам ПИД (из скольких букв он бы не состоял) потеряет своё главное свойств - перестанет быть ОТРИЦАТЕЛЬНОЙ обратной связью и превратиться в ПОЛОЖИТЕЛЬНУЮ.
упс… ошибся с адресатом 😵

SergDoc
rual:

Виталий, плохо прочитали пункт “и”

Это Олег )))

oleg70
rual:

плохо прочитали пункт “и” моего поста

“можно” != “надо” … (😃) , в простейшем случае, для управления “ручками” вполне пойдет…
(не все же сразу хотят “летающего робота”)

SergDoc:

Это Олег )))

да, это я (😃)

oleg70
rual:

Имеем квадрик

Александр, я тут размышляю - как поудобней останавливать процесс калибровки магнитометра (?)…
Другими словами программа ищет максимумы/минимумы по осям пока мы крутим аппарат,
а как ей понять что “достаточно”… (?)
У “фантома” например непонятно, калибровка как то сама заканчивается в определенный момент (то ли по времени ограничена, то ли еще как…).
Делал с “пищалкой”, но опять городильня лишняя, а вручную как то не “феншуй”… никак не придумаю что то…
есть какие мысли ??

rual
oleg70:

а как ей понять что “достаточно”… (?)

Олег, критерий совершенно простой - постоянство длины вектора магнитометра (у меня вектор нормирован к единице). Т.е. алгоритм ждёт пока за некоторый период времени длина вектора будет попадать в заданный допуск.

oleg70
rual:

пока за некоторый период времени

Ну да, получается, что всё ж привязка к периоду времени необходима… Я то хотел найти некий признак без ограничения времени “кручения” аппарата, что б поиск min/max по осям сам останавливался… ограничить этот поиск каким либо значением нельзя (теряется смысл)…
Придется всеж пищалку ставить, и выключать вручную… (зато надёжно)

rual
oleg70:

Я то хотел найти некий признак без ограничения времени “кручения” аппарата, что б поиск min/max по осям сам останавливался… ограничить этот поиск каким либо значением нельзя (теряется смысл)…

Дык тут нет именно “ограничения времени кручения”, задержка времени нужна алгоритму для того чтобы засекать изменения изменение длинны вектора. Если ты перестанешь крутить ЛА на время этой задержки, то перестанет меняться длина вектора, и алгоритм поймёт, что калибровку ты решил прекратить.