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

alexmos
mahowik:

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

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

mahowik:

все верно. по идее знак тяги нужно менять, когда детектим торможение… осталось правильно задетектить

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

mahowik:

Т.е. как ты увидел профит от этого в динамике я не понимаю

Ну вот ты писал у тебя коптер на 5 метров улетает когда наклоняется. Это как раз из-за неточных нулей по X, Y. Профит небольшой но есть, а сложности не сильно добавляет (на четтыре вычисления больше).

mahowik:

я специално писал ITerm (PID “I”) т.к. говорил об основном/конечном PID регуляторе (который в MultiWii.ino файле), а не внутреннем. Т.е. там по делу написанно
посмотри еще раз плз.

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

mahowik:

Ну тут наверное при калибровке тогда и баро мод надо врубить, т.к. при выключенном баро ошибка без делителя…

if(baroMode && avgError < 5000 && sonarUsed == 0) {
err/= (6 - avgError/1000); // CMPF multiplyer 1…5
}

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

mahowik:

В общем я имелл ввиду НЧ фильтр на высоту в конечном пид регуле…

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

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 нужен - тогда переход с барометра на сонар при подъеме очень плавный (при плавном подъеме я даже не смог определить на какой высоте барометр подхватывается).