MultiWii - обсуждаем и отлаживаем Alt Hold

mahowik
alexmos:

Сложно объяснить. Если аксель калиброван только по оси Z, то при наклоне он не будет точно указывать землю. А гироскоп под него подстроится. Но когда наклон кончится, гироскоп покажет неправильный уровень и опять понадобится время на подстройку.

При высоком GYR_CMPF_FACTOR (у меня 400) КФ почти не смотрит на аксель. И после долгих “крутых пике” погрешность будет практически полностью обусловленна дрейфом гиро… всего 2-5гр обычно, что корректится в итоге за 2-3 сек в покое по акселю…
А если уж говорить сугубо про погрешность, которая вносится акселем, то при сложных и затяжных маневрах серия ускорений (которая будет восприниматься в ИМУ как наклон) может дать гораздо больший эффект. Хотя и от этого эффекта есть защита в ИМУ:

  // Apply complimentary filter (Gyro drift correction)
  // If accel magnitude >1.4G or <0.6G and ACC vector outside of the limit range => we neutralize the effect of accelerometers in the angle estimation.
  // To do that, we just skip filter, as EstV already rotated by Gyro
  if ( ( 36 < accMag && accMag < 196 ) || smallAngle25 )

но даже она вроде как не нужна при высоком GYR_CMPF_FACTOR…
Помнится когда мы с ziss_dm давили бенефитами использования флоат фильтра для акселя на АлексаВПариже, смотрел его (ziss_dm) версию ИМУ. Он убрал эту защиту за ненадобностю при GYR_CMPF_FACTOR=500…

alexmos:

Уже сделал, оказалась простая формула - взаимная проекция ACC на GYRO по осям X,Y: Ax*Gx + Ay*Gy. Очень приблизительно отражает аэродинамику коптера в боковом ветре при движении в разных фазах.

тут мало что понял… распиши подробнее… при торможении/резком маневре по идее невозможно распознать где угол наклона, а где ускорение… этож вроде известная нерешаемая задача… или не так?

alexmos:

Да, извини не понял. Я тоже заметил, что с большим I осцилляции сильнее. Согласен насчет баро, но подумай, может его вообще убрать - сонару он тоже не сильно нужен. Iterm нужен для достижения точного целевого значения, но у нас целевое значение не так важно, можно зафиксироваться и чуть выше/ниже. Я оставлю код, а занулить его можно в GUI. Ещё он важен, если изменится отдача моторов или масса в режиме удержания. Например на коптер рюмку водки поставить Без I просядет сильно и не вернется

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

alexmos:

этого не понял. Наоброт при калибровке нужен сильный PID чтоы быстро найти Iterm, а при реалном исползовании уже надо ослаблять барометр. Сонар можно оставить на сильном PID, т.к. он достаточно точен (точнее акселерометра).

согласен… терь понял… спасибо

alexmos:

А насколько НЧ? Например при начале движения или порыве ветра, а также пр турбуленциях на посадке, надо достаточно быстро отрабатывать высоту, а НЧ внесет задержку фазы.

ну с макс. задержкой в 0.3-0.5 сек, т.е. частота среза 1-3гц…

  • для таких порывов у нас Д есть (+ в него можно добавить ускорение для крутизниы и более резкого спада… как писал ранее), а П с учетом того что оно шумит (на bmp085) можно сделать доволно плавним и тормозным…
alexmos
mahowik:

При высоком GYR_CMPF_FACTOR (у меня 400) КФ почти не смотрит на аксель. И после долгих “крутых пике” погрешность будет практически полностью обусловленна дрейфом гиро… всего 2-5гр обычно, что корректится в итоге за 2-3 сек в покое по акселю…

Этот высокий фактор хорошо отвязывает гиру, у меня тодже 500 стоит. Но если лететь достаточно долго - 3-4 сек, то гира все равно совместится с акселем. А тут уж все зависит от его калибровки. Если реальный ноль по XY не совпал с калиброванным, то его “сфера” возможных перемещений смещена и наклонена, и совпадает с реальностью только в точке калибровки по Z. Но стоит отметить, что для угла это не столь критично, а вот для длины вектора - ошибка калибровки по оси X,Y вылазит с пропорцией ~ err*Cos(angle). (при условии совпадения чувствительностей по осям и точной калибровки по Z). В реальности и чувтвителность не совпадает и ноль по Z плывет, что делает ошибку ещё больше.

Из-за несовпадения измеренной и истинной сфер при наклоне ускорение вылазит ±5 (мои реалные оптыты), что дает большой дрейф высоты пока не
стабилизируется.

mahowik:

тут мало что понял… распиши подробнее… при торможении/резком маневре по идее невозможно распознать где угол наклона, а где ускорение… этож вроде известная нерешаемая задача… или не так?

Это пока только предположение. Я разложил все векторы сил на трех этапах (ускорение - равномерное движение - торможение) и посморел, что показывает акселерометр и что гироскоп. Оказалось, что их проекции на локальную XY различаются на каждом этапе. А перемножение дает нужную коррекцию (по крайней мере совпадают 0, + и -). Я потом нарисую картинку как время будет.

mahowik:

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

Это если рассматривать сонар на идеальной плоскости. А если лететь над пересеченной местностью (что обычно и бывает), он также будет выдавать шум непредсказуемого спектралного состава… И рассматривать I-часть можно также как и для барометра - есть свои плюсы и минусы. Надо затестить, ведь его достаточно просто в ГУИ обнулить.

mahowik:

ну с макс. задержкой в 0.3-0.5 сек, т.е. частота среза 1-3гц…

  • для таких порывов у нас Д есть (+ в него можно добавить ускорение для крутизниы и более резкого спада… как писал ранее), а П с учетом того что оно шумит (на bmp085) можно сделать доволно плавним и тормозным…

Т.е. предлагаешь фильтровть только P (т.е. фактически EstAlt), а EstVel оставить? Минусов вроде не вижу, но и плюсов тоже. Нужно точно определить, зачем это нужно. У меня с барометром на графике EstAlt довольно плавная, и никакой паразитной перекомпенсаци в +/- на моторы не идет (гораздо сильнее например обычная стабилизаия угла их дергает). Пришли скриншот или видео своего GUI в момент стабилизации по барометру.

alexmos
mahowik:
  1. есть идея ITerm (PID “I”) составляющую ПИД регуля отключать в баро режиме, т.к. она довольно медленная и только вносит путаницу в результат AltPID, т.к. даже на выходе интегратора высота шумит в диапазоне метра (с bmp085) и шумит гораздо быстрее результата ITerm. В итоге I стремится непонятно к чему и имеет неактуальное значение, т.к. целевая величина прыгает постоянно… В общем я занулил ее и вроде как диапазон плавания уменьшился…

Повисев сегодня ещё минут 30, выяснил пользу от I - она нужна для перехода с соанара на барометр. Из-за разных PID
P-часть может достаточно сильно увеличиваться при проседании батаери со временем, и при переходе и смене коэффициента усиления, проиcходит прыжок вверх или вниз.
Если будет I, то P останется в районе 0 даже при падении напряжения, только I-часть не надо умножать на SONAR_BARO_PID_GAIN. Ещё разделил её на 5, чтобы сделать её достаточно медленной (тогда она вроде не будет осциллировать).

alexmos

Долго не мог понять, почему при полете по барометру при посадке или приближении к земле на 30 см начинает кобасить вверх-вниз до полутора метров… Сегодня посмотрел, что же показывает барометр у земли - он думает, что высота падает на 1м ниже пола 😃 Это из-за зоны повышенного давления под коптером при приближении к земле. Так что взлет и посадка - только по сонару.

alexmos

Ещё нашел проблемку с сонаром: чем выше высота, тем больше вероятность подлянки с его стороны. Если сонар начнет выдавать постояную высоту скажем в 1 метр на высоте в три метра, то коптер очень бодро устремится в небо и ничего его не остановит 😦 Буду делать ограничитель “земли по барометру”, т.е. барометр по прежнему необходимо корректировать сонаром, но в ограниченных пределах (+/-1 метр) от точки отсчета при старте.

Dimm168pin

в кролике прошивке до 1.101 сонар работает до 1500см, в 1.200 2000, дальше вырубается)

alexmos
SovGVD:

начал лепить OSD Сайбериановый в MultiWii, и не пойму откуда взять высоту от земли и в каких она попугаях (EstAlt?) и есть ли она вообще?

В оригинале высота - это показания барометра в см (вроде бы). Но высота не выверена по земле, и может быть например -70м. Так что при старте моторов нужно сохранить текущее значение EstAlt и потом отнимать его от новых показаний. Это и будет высота над землей. www.multiwii.com/forum/viewtopic.php?f=8&t=1351

В моей версии, EstAlt в см. Она обнуляется при запуске системы, только если включен сонар. Если сонара нет, от и смысла не было барометр к чему то привязывать.

Sir_Alex

В ардукоптере собираются заюзать аксель для Loiter’a, мот и вам пригодится 😃

alexmos
Sir_Alex:

В ардукоптере собираются заюзать аксель для Loiter’a, мот и вам пригодится

Что такое loiter?

Sir_Alex
alexmos:

Что такое loiter?

Режим LOITER - удержание позиции.

SovGVD
Sir_Alex:

В ардукоптере собираются заюзать аксель для Loiter’a, мот и вам пригодится

это акселем ускорение по всем осям чтоли будут смотреть и корректировать GPS?

alexmos
alexmos:

В ардукоптере собираются заюзать аксель для Loiter’a, мот и вам пригодится

Это помогает, если сливать аксель с GPS (тут почти те же алгоритмы что и у меня для althold). Если сливать с optical flow - уже хуже и вряд ли аксель тут поможет (оба измерения относительные). Если чистый аксель - то абсолютно никакого смысла нет.

Sir_Alex
SovGVD:

это акселем ускорение по всем осям чтоли будут смотреть и корректировать GPS?

Видимо - да. Jason Short сказал что тестирует эту фичу, но в GIT’e пока нету.

alexmos

Потихоньку допиливаю свой алгоритм, с основном в плане быстродействия. Вот сегодня заснял “комнатные” тесты. Барометр, конечно, в помещении и близко к полу не очень хорошо работает - сказыватся воздушные потоки. Но все равно с достаточно высоким Alt-P и высоким D осцилляций не возникает. Если его уменьшить, то будет висеть на месте, но уж очень слабо тогда держит внешние возмущения.

www.youtube.com/watch?v=-3SmlnSyLcM

Осталось поправить одну ошибку при работе с сонаром и выложу.

Синализация коррекции высоты - это суперфункция 😃 Теперь высоту можно установить очень точно и не сбить установку при подруливании YAW.

SovGVD

пипец, как у вас получаются такие результаты? я тут на пару минут оставил барометр (085), EstAlt/100 (раз оно в сантиметрах, перевел в метры) уплывает потихоньку на ±5 метров, вожу платку вверх/вниз (около метра) - ничего особо не меняется, а у вас тут летает на барометре в помещении

alexmos

Можно на ты 😃 По отзывам других владельцев, у барометра 085 высота плывет ±1 м. У меня также, ±1, при полете в этих пределах и гуляет.
О, я кажись понял прчину: если ты сморишь в GUI в перменных EstAlt или BaroAlt - то там она делится на 100 и отбражается в метрах.

Вот строчка из Serial.pde: serialize16(EstAlt/10);
И в GUI видимо ещё раз на 10 делят.

SovGVD
alexmos:

если ты сморишь в GUI в перменных EstAlt или BaroAlt - то там она делится на 100 и отбражается в метрах.

я себе вот так сделал (debug2 и 3, версия 2.0pre3, аксель bma020 как то приглушен в этой версии вернул 2G и acc_1G = 255;, вместо 8G и acc_1G = 63;)

      serialize16((EstAlt-AltGround)/100);
      serialize16(EstAlt/100);

AltGround=EstAlt при заводе моторов
лежит платка на столе - значение в GUI то вверх, то вниз ползет, туда/сюда поднимаю - толком ничего не меняется
еще и BaroAlt/10=EstAlt/100 (хотя не удивительно EstAlt = BaroHigh*10/(BARO_TAB_SIZE/2)😉

mahowik
alexmos:

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

выложи код… на выходных будет время думаю… могу облетать…
ну и как обычно рекомендации по настройке и ПИДы ))

alexmos

Выложил на SVN. В Readme.txt все нововведения описаны. Сегодня наконец хороший денек, тоже потестил немного. Вроде все ок, коррекция газа по углу тоже работает (я там ввел два коэффициента для настройки). Единственное, странный глюк - как только вылетаю из тени на солнце, коптер тут же падает 😦 Не хватило времени и батарей разобраться почему. Думаю из-за резкого прогрева датчиков, и решится установкой фольги на крышку.

По PID осталось прмерно также у меня, единственное D повысил, иначе остается склоность к осцилляциям: P=8, I=0 - 0.020, D=25. Если сонара нет, то I=0 можно смело ставить. Если есть, то I нужен - тогда переход с барометра на сонар при подъеме очень плавный (при плавном подъеме я даже не смог определить на какой высоте барометр подхватывается).

mahowik
alexmos:

Выложил на SVN. В Readme.txt все нововведения описаны. Сегодня наконец хороший денек, тоже потестил немного. Вроде все ок, коррекция газа по углу тоже работает (я там ввел два коэффициента для настройки). Единственное, странный глюк - как только вылетаю из тени на солнце, коптер тут же падает 😦 Не хватило времени и батарей разобраться почему. Думаю из-за резкого прогрева датчиков, и решится установкой фольги на крышку.

По PID осталось прмерно также у меня, единственное D повысил, иначе остается склоность к осцилляциям: P=8, I=0 - 0.020, D=25. Если сонара нет, то I=0 можно смело ставить. Если есть, то I нужен - тогда переход с барометра на сонар при подъеме очень плавный (при плавном подъеме я даже не смог определить на какой высоте барометр подхватывается).

Кроче полеты как мин. на неделю откладываются. Вчера не вписался с маневром и поймал асфальт. Электронику пока не проверял… минус 2 движка , но вроде как можно восстановить. Так что пока код посмотрю…
По поводу провалов на солнце. Мот у тебя уже оптикал флоу подвешен? 😃 Если нет, то это еще раз говорит о большой чувствительности алгоритма к малейшим изменениям параметров сенсоров…
По поводу увеличения D и склоности к осцилляциям. Не пробовал ускорение использовать? Из-за подЪема фронта и увеличения крутизны спада будет более четкая отработка по D…