OSD на ATmega1281

smalltim
msv:

Может самым красивым решением будет в качестве дифференциатора использовать ФВЧ 1-го порядка например БИХ? А частоту среза определить постоянной времени дифференцирования.

ФСС затормаживает реакцию сильно. Экспоненциальный фильтр, как частный случай БИХ, работает на ура. С пирами я использую экспоненциальный фильтр и на П и на Д компонентах. Вообще, экспоненциальный фильтр зело хорошая вещь при правильном использовании.
На П ветвь - угол = угол*к + новоезначениеугла*(1-к)
На Д ветвь - скорость = скорость*к + новоезначениескорости*(1-к) где новоезначениескорости = угол без фильтра минус угол на предыдущем цикле АЦП без фильтра.

При целых рядах и к=3/4, 1/2, 1/4 и т.д. получается очень быстрая красивая математика. У меня плавающая точка, и времени вагон, но Вам это особенно важно, поскольку времени на математику у АП не очень много, рисовать надо.

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

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

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

msv

Во первых всем спасибо! А теперь будем разбираться…
Что такое ФСС? Варианты которые приходят в голову фильтр сосредоточенной селекции, фильтр сложения сигнала… Гугл еще подсказывает -фонд соц. страхования… 😃
В суперсемплинге (семпл считаю 20мс) данных от пиро не вижу смысла. Уровень вч помех от пиро мизерный, давится аппаратно RC-цепочкой. Дома есть небольшой фонок 50гц от неидеального экранирования усилителя с громадным КУ. На поле думаю и ему неоткуда взяться. У меня с пиро стоит усредняющий фильт на задаваемое конфигурацией число семплов. Практически сразу останавился на 3-х, те время усреднения 60мс. Особого смысла в этом пожалуй нет, но вроде бы и не мешает, скорость отработки машинок, тем более скорость отработки управляющего воздействия самолетом (общая постоянная времени запаздывания крена для моего самолета ~600-800мс) несравнимо ниже…
Давайте еще определимся, что говорим о одном и том же… Под скоростью (да и углом) я понимаю не абсолютное значение скорости изменения выходного параметра, а скорость изменения ошибки между уставкой и текущим значением выходного параметра.
В последней реализации Д-ветви использую именно экспоненциальный фильтр, как действительно весьма эффективный и простой в реализации. У меня он выглядит так:
D[n]=(Kd*(e[n]-e[n-1])-D[n-1]/Kd)+D[n-1];
Время дифференцирования для канала крена с запасом устойчивости ~0.1сек, соответственно Kd=100ms/20ms=5

smalltim

ФСС-фильтр скользящего среднего. N последних сэмплов усредняется с равными весами.

Я не беру для Д ветви уставки, а беру абсолютное изменение углов крена-тангажа. Так проще и надежнее, плюс, оглядка на уставки математически отличается от оглядки на абсолютные углы только когда меняется сама уставка, а она обычно 90% времени константа.

msv
smalltim:

ФСС-фильтр скользящего среднего. N последних сэмплов усредняется с равными весами.

Ок, спасибо, буду знать. Использую сплошь и рядом (в тч. в этом проекте) но не знал что так называется.

smalltim:

а она обычно 90% времени константа.

Почему уставки (целевые значения) константы? Даже для спокойных режимов, типа RTH, они непрерывно меняются. Весь смысл Д-ветви ускорить и вовремя затормозить (демпфирование) выходное управляющее воздействие именно на основании скорости изменения ошибки заданного значения (например целевого крена) и текущего, а не выходного параметра. Те. например ускорение (временное увеличение управляющего воздействие) должно быть одинаково или при быстром изменении целевого крена или при быстром отклонении (порыв ветра) текущего крена. Аналогично демпфирование…
Это идеально работает на моем симуляторе с имитацией инерции. С самолетом (именно текущим) пока что-то засада, не переносимость у него на Д-составляющую по крену… Вместо демпфирования- увеличение раскачки. Боюсь что-то очевидное не разглядел. Есть идеи, жду погоду и время в поле вырваться…

msv

Поигрался еще Д-веткой пида. Сделал по такой формулке:
k=Kd/2; //подобрал
if(k==0) k=1;
D[n]=(Kd*(e[n]-e[n-1])/k)+(D[n-1]*(k-1)/k);
Работает чудно при небольших значениях Kd (1-10).
При больших значениях (например для ПИДа “ошибка курса”->“крен” для эффективного демпфирования требуется постоянная времени порядка 0.5 -1сек)- неэффективно… С экспоненциальным фильтром полюбому для больших Kd получается или много шума или малая амплитуда и уже неправильная фаза. Более эффективно работал дифференциатор:
D[n]=e[n]-e[n-Kd]; Но такой подход требует буфер для каждого ПИД размером Kd, ну и еще там кое-какие проблемки есть…
ЗЫ Поясню народу, все это уже по сути “эстетство”. Все неплохо работает и управляется вообще без Д-ветви, чисто на ПИ-регуляторах. Просто хочется сделать еще лучше и “правильнее”.

smalltim
msv:

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

Уставки константы потому, что они по сравнению с собственно креном и тангажом меняются медленно-медленно. Можно считать константами.
Д ветвь можно сделать и с уставками, и без их учета. В моем варианте, без их учета, Д работает просто как достаточно медленная гиро, что, тем не менее, давит резкие изменения углов.
Пока не могу понять, где у Вас проблема. Может, со знаком Д ошибка? 😃 У меня толпа самых разношерстных самиков летает, обычно никаких проблем.

Д по курсу тоже штука интересная. Его учитывать надо не всегда. Я остановился на плавном сведении КУ на Д в 0, когда целевой и текущий курс отличаются больше, чем на 90 градусов и ограничении как величины Д по курсу до 90 градусов, так и собственно скорости разворота модели.
При этом на всем диапазоне входных условий сохраняется устойчивость, а близко к целевому курсу включается Д и давит переруливание по курсу.
Если нужно, могу кусочки кода скинуть.

msv

У меня для курса->крена была мысля отключать И-ветку при больших расхождениях. Типа для грубой установки курса хватит и П-ветки, и не будет накапливаться интегральная ошибка, которая в основном и вызывает перерегулирование. А для точной доводки включается И-ветка и аккуратно триммирует направление. Но пока не рискую далеко уходить от канонов ТАУ.

smalltim:

Если нужно, могу кусочки кода скинуть.

Конечно было бы интересно… Хотя бы в псевдокоде.

smalltim
msv:

У меня для курса->крена была мысля отключать И-ветку при больших расхождениях.

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

РД00

Коллеги, спасибо за _интереснейшее_ чтение. Прочел ветку запоем, как художественную литературу.

msv:

Может самым красивым решением будет в качестве дифференциатора использовать ФВЧ 1-го порядка например БИХ? А частоту среза определить постоянной времени дифференцирования.

Я smalltim’у три года назад уже пытался сосватать реализацию IIR (БИХ) фильтра второго порядка (а следовательно, и любого - каскадным соединением звеньев 2-го и 1-го порядков). Есть ФНЧ, ФВЧ, ПФ. Вам, случайно, не нужна ? 😃

shura2000

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

Vlado
shura2000:

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

Это как это… It up to you. Пока денег не просили, там и без этого трат не меренно, штрафы всякие и все такое (all included:) big brother) . Еще делать тоже не меренно. Как в Бумбараше… закопать живьем мерзавца.

msv

2smalltim Все-таки не очень понимаю логику Д-ветви только по углу а не по ошибке… Получается, что это ветвь будет сопротивляться изменению например крена даже при изменении целевого угла (например быстрое перемещение стика в режиме стабилизации), а должна и может помогать…
С “И”-веткой вроде бы проблем никаких, главное сделать правильно ограничение относительно границ выходного параметра. Очень полезная штука, например для того же крена устраняет неизбежную статическую ошибку от избыточной устойчивости и от неидеальности триммирования итп. Да и ветерок может давать приличную стат. ошибку, причем разную в зависимости от его направления к самолету и его текущего крена.
Долго экспериментировал с ПИД в своей сим-модели, пока остановился на таком решении- Д-ветвь - классическая реализация, а уже после суммы P+I+D экпоненциальный фильтр. Такое решение дает одинаковую задержку для всех копонентов регулирования (по сути просто увеличивает “транспортную” задержку системы в терминах ТАУ), и объект ведет себя более устойчиво для разных коэффициентов. К сожалению качество фильтрации эксп.фильтром не самое лучшее… Или остается довольно большие пульсации или “съедается” амплитуда в первую очередь D-ветки. Наверное попробую на выход поставить ФНЧ “настоящий” БИХ второго порядка. Глянул свои закрома, когда занимался ЦОС, нашел только свою программку расчета коэффициентов Чебышева-1 рода и Баттерворта. Для нашей задачи думаю лучше использовать Бесселя, как дающего линейную ФЧХ.
2РД00 Может у Вас где завалялся расчет именно по Бесселю? Вспоминать по серьезному опять ЦОС жутко лениво, кучу времени уйдет…

shura2000:

проект будет в коммерческое русло переходить?

Вообще приятно сознавать, что проект пользуется интересом (судя по кол-ву просмотров). Но он слишком далек от уровня plug-and-play, и значит практически интересен только достаточно узкому кругу продвинутых пользователей. И я (пока?) морально не готов нести риски, вкладываясь в производство хотя бы китов… Тем не менее удивляет, что кодер из соседней ветки народ повторяет пачками, а на этот проект похоже решился только Vlado… Может потому, что (пока?) исходники зажал… 😃
Чуть позже может выложу кусочек видюшки крайнего полета 26/06/11 для оценки качества стабилизации в ощутимый ветерок.

MoonCat
msv:

… а на этот проект похоже решился только Vlado…

морально готовлюсь повторить , но с учетом моего уровня, опасаюсь замучить Вас вопросами 😃

Vlado
MoonCat:

морально готовлюсь повторить , но с учетом моего уровня, опасаюсь замучить Вас вопросами 😃

Вливайтесь:) Надо же хоть чем то похвастаться
осталось совсем мелочевка домонтировать

avisenja

Переходные отверстия с *металлом*, вот это уже солидно! Поздравляю!

Vlado
avisenja:

Переходные отверстия с *металлом*, вот это уже солидно! Поздравляю!

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

Иван

[QUOTE=Vlado;2671082]

Симпатично вышло:) а у меня всё руки не доходят до поддержания прокта:( уже даже носитель облётан:)

Vlado

[QUOTE=Иван;2672115]

Vlado:

Симпатично вышло:) а у меня всё руки не доходят до поддержания прокта:( уже даже носитель облётан:)

А мне до носителя, расти и расти.😦

Иван

есть вопрос(велосипедного характра:) - если для стабилизации использовать 2 акселя 3х осевых(mma7455 есть пара в наличии караз) + калибровать их периодически на прямых участках с использованием GPS ? реально?
просто изучая на них инфу и подключив один увидел что ось Z “знает” в каком положении чип относительно ее даже если сбросить питалово и повернуть а потом опять включить - покажет новое значение… в доке говорят что он по ней калибруется.

AndyBig
Иван:

реально?

Практически нет. калибровать можно только неподвижный акселерометр. А ЛА трудно назвать неподвижным в полете 😃

Иван

а если относительная калибровка? по типу - если в по итогам руления стабом на участке виден уход с курса то попровить, добавить поправку аля псевдо искуственный интеллект:) ?