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

alexmos
skyrider:

Схема расположения моторов QUAD X, пробовал менять последовательность, добился правильной калибровки в такой последовательности по Вашей схеме : 1 , 2 , 5 , 4 , 3 , 6. Не знаю почему , но в моем случае именно эта последовательность сработала, перепроверял три раза.
Если завтра позволит погода, проверю работу барометра, пропадут рывки по высоте после правильной калибровки акселя или нет.

Хм, похоже баг где то в алгоритме. Последовательность не должна играть никакой роли, кроме того что Z всегда в начале. Подумаю…

skyrider:

Может быть причиной небольших провалов то что мой квадрик более тяжелый, моторы относительно медленные 750кв, т.е он более вялый , не такой резкий, и ему нужны другие пиды ALT?

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

Вообще с сонаром надо быть осторожнее, т.к. если он начнет выдавать неправильные данные (например от наводок решит что высота всегда равна 1 метру) - коптер может как свалиться, так и в небеса улететь. Я сделал ограничитель по барометру для крайних случаев, но не проверял его работу. Так что при испытаниях надо руку всегда держать на ручке отключения режима Alt Hold 😃

skyrider

Изменил пару параметров в config.h
#define MINTHROTTLE 1130
#define INTERNAL_I2C_PULLUPS
#define DEADBAND 20
#define MAXTHROTTLE 1900
#define THROTTLE_HOVER 1440
#define SHIFT_HOVER 1450
#define MAG_ORIENTATION(X, Y, Z) {magADC[ROLL] = -Y; magADC[PITCH] = X; magADC[YAW] = Z;}
Откалибровал по шести точкам и подлетнул на метровой высоте - дергается при включении Alt Hold по высоте как припадошный каждые 2-3 секунды, что то из того что я сделал ему явно не понравилось, нужно цеплять блютус и смотреть что кажет в полете.

alexmos:

Попробуйте запустить моторы на рабочую мощность с подключением в ГУИ и гляньте что показывает сонар. Высота не должна прыгать.

Скачет примерно + - 0.1-0.3

HikeR

народы, подскажите, плиз, по работе сонара.
если заявлена дальность 5 метров, то что выдает сонар на бОльшей высоте?
какой примерный “угол охвата”?
какая средняя по больнице частота опроса?

alexmos
HikeR:

народы, подскажите, плиз, по работе сонара.
если заявлена дальность 5 метров, то что выдает сонар на бОльшей высоте?
какой примерный “угол охвата”?
какая средняя по больнице частота опроса?

Правильный ответ - зависит от сонара. Как у него определено в датащите для таких случаев, то и должен выдавать.
Но к примеру тот, что я использую - ему плевать на датащит и он выдает при потере сигнала 1 метр (все 4 штуки что я тестил - по разному). Но при этом время измерения подскакивает до 250мс, и вот так можно распознать ошибку.

Частота измерений зависит от расстояния… При нулевом - близко к нулю, +50мс на паузу между измерениями.

Угол охвата также зависит от сонара, на практике градусов 60. В датащите приводится диаграмма направленности.

5 метров это для идеальных условий. Реально в условиях зашумленного питания, ненулевого угла наклона будет меньше. Я ставлю с 2 до 3 метров плавный переход на барометр. При наклонах лимит опускается (я заложил примерную диаграмму направленности в алгоритм).

mahowik
alexmos:

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

Попробовал. По графикам пока очень нравится. Выводил одновременно 2 графика: ускорение “с минус acc_1G” и “c минус 1/InvG”. В ГУИ они практически совпадают.
Профит:

  1. скорость не шумит
  2. высота соот-но шумит меньше, а если повысить коэф. компл. фильтра до 200-300, то вообще меедленно плавает +/-0.2…0.4 м
  3. простота настройки, т.к. нет зависимых параметров типа ПИДы в интеграторе и коэф. компл. фильтра

но это все теория пока 😃 облетать не могу, т.к. еще не починился после последнего краша…

alexmos

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

mahowik

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

alexmos

Нет, в 2.0 вроде сделали некоторое подобие таймслотов для распределения медленных вычислений, вот их заюзаю.

Полетал сегодня - барометр не нравится как держит. Все равно склонен к осцилляциям. Иногда и до 3 метров прыгал верх вниз. Не то, к чему стремился 😦

mahowik

Когда идеи заканчивались, меня спасали более мягкие ПИД-ы + более зажатые констрэйнты конечного PID регуля, в частности на D часть…

з.ы. Ну все! Желаю удачи! A я собирать чемоданы и лететь туда где не бывает холодно и недоступный интернет, точнее очень дорогой… 😃

soliada
alexmos:

Не знаю, дело в том что мегу я в глаза не видел, и писать для нее код вслепую смысла нет. Trig можно на любую ногу вешать, а вот Echo - только там где есть свободное прерывание. Попробуйте разобраться в Sonar.pde как правильно настроить прерывания на мегу и на каком порту/ноге, а я включу в основной код…

Здравствуйте Алексей. Признаться так и не смог разобраться с этим вопросом.Если чесно,в этом вопросе не совсем разбираюсь,вернее совсем не разбираюсь,а точнее не знаю в каком направлении надо мыслить.
Если не трудно,можете подсказать что конкретно надо посмотреть- проанализировать в Sonar.pde?
Очень хочется попробовать сонар.

alexmos

Я тоже плохо представляю в чем отличия меги от обычной 328/168, а особенно в вашем варанте её включения. Задача - найти свободное прерывание, выбрать ногу, которая ему соотвествует. Далее прописать эту ногу в константе SONAR_READ в конфиге, задействовать прерывание по сигналу на этой ноге:

  #if defined(PROMINI)
   PCICR |= (1<<0) ; // PCINT activated for PINS [D8-D13] on port B
   PCMSK0 = SONAR_READ_MASK; // trigger interrupt on this pin only
  #endif
  #if defined(MEGA)
    // TODO: setup interrupt on MEGA
  #endif

Если прерывание отдично от INT0 - переписать заголовок обработчика:

// Install interrupt  handler
ISR(PCINT0_vect) {

В общем то это все очень просто но я не могу потестить не имея меги.

alex_f73

Подскажите, а HC-SR04 будет работать ? В Config.h такого не нашел.
И если будет, то где посмотреть схему включения ?

Почитал ветку, сонар HC-SR04 работает. Для его включения надо раскоментировать //#define DYP_ME007 ?
Остается открытый вопрос куда его включать.

alexmos

Если вы про мой код - то будет. Он и писался под такой сонар. Раскоментируйте #define SONAR и под ним будут определены ноги, куда его цеплять. Также в Sonar.pde есть пояснения насчет включения.

Но дело в том что у меня нет #define DYP_ME007… Так что, возможно, вы смотрите другую прошивку.

alex_f73

Я смотрел код mahowik, я думал вы совместно одну прошивку допиливаете.Сейчас скачал вашу, для CriusSE, что раскоментировать или закоментировать надо ?И если у меня ESC Plush то мне MINTHROTTLE 1300 устанавливать ?

alexmos

Моя прошивка как раз для CriusSE настроена, на ней и тестирую. Вообще по основным настройкам - выставляйте все так же, как и в обычной 1.8, 1.9. Если есть вопросы - то смотрите в стандартных руководствах как что настроить. Мои настройки в конце, там надо убрать OPTFLOW и настроить SONAR (фактически только его подключить надо и все оставить по умолчанию). И установить THROTTLE_HOVER на покаатели газа в момент отрыва, или закоментировать вообще этот блок.

8 days later
skyrider

Если меняем THROTTLE_HOVER 1400 на другое значение, например 1450, значение SHIFT_HOVER 1400 тоже нужно менять?
//#define OPTFLOW ADNS_5050 - режим OPTFLOW полностью отключен, или нужно отрубать что то еще?

alexmos
skyrider:

Если меняем THROTTLE_HOVER 1400 на другое значение, например 1450, значение SHIFT_HOVER 1400 тоже нужно менять? //#define OPTFLOW ADNS_5050 - режим OPTFLOW полностью отключен, или нужно отрубать что то еще?

SHIFT_HOVER можно менять, можно не менять. Я ставлю 1500 и у меня отрыв всегда на середине газа (по пульту). Если определить в конфиге #define SHIFT_HOVER = THROTTLE_HOVER то будет только экспонента без сдвига.

Закомнтировать //define OPTFLOW достаточно.

mahowik
alexmos:

Полетал сегодня - барометр не нравится как держит. Все равно склонен к осцилляциям. Иногда и до 3 метров прыгал верх вниз. Не то, к чему стремился

привет Алексей!
На последней 2.0 прошивке теже 3 метра или уже улучшил?

alexmos
mahowik:

привет Алексей! На последней 2.0 прошивке теже 3 метра или уже улучшил?

± метр гуляет, но медленно. Думаю, лучше уже не будет.

Я уменьшил влияние ACC, оно фактически теперь только за D отвечает. Чтобы уменьшить шум, добавил LPF на выход алгоритма (по моему раньше ты предлагал это). А также сделал зону DEADBAND, в которой P-составляющая обнуляется. За счет этого барометр меньше дергает, пока внутри этой зоны - стабилизируется только за счет очень медленного I и D, который тормозит любое быстрое перемещение.

Хочу сравнить в поле с алгоритмом из официальной 2.0 - если разницы не будет, то можно вообще на него перейти, он в вычислениях проще.

mahowik
alexmos:

также сделал зону DEADBAND

про деадбенд я тоже писал ранее )), но не для П а для Д…

alexmos:

Хочу сравнить в поле с алгоритмом из официальной 2.0

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

Eщё была мысль поднять дискретность вычисления высоты до уровня точности-погрешности баро (t.е. до 0.5-1м) + добавить НЧ фильтр на выход для более плавных переходов между самплами. Tогда управляющее воздействие на П будет только при переходах между самплами… ну и конечно П сделать как можно более мягким, т.е. низкие значeния… хотя с DEADBAND по П вижу примерно тy же картину, т.e. воздействие только при больших колебаниях высоты…

alexmos
mahowik:

про деадбенд я тоже писал ранее )), но не для П а для Д…

Да, я помню, но и тогда и сейчас считаю, что это не поможет - как раз D работает в зоне малых возмущений и эта часть отрабатывает неплохо и практически не шумит. А вот высота при жетской привязке к барометру (как я сделал в последней версии), шумит сильно, и для нее DEADBAND реально помогает - как только I-часть выставит точно газ, который нужен для висения, коптер застывает на нужной высоте, пока опять не выйдет за пределы DEADBANd - там P немного подрулит и опять висит ровно.

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

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