MultiWii

mahowik

Я тут решил разобраться с ПИД параметрами, настройкой, реализациями и т.д. Надоело “слепым котенком” параметры тягать…

Кто нить в реализацию ПИД-регуля втрыркал?! У них там походу крейзи-микс полный 😃

В вие в стаб. моде измеряемой величиной является угол (ролл, питч), который приводится к “требуемому” углу (значение пропорциональное отклонениям стиков)… т.е. с этим все ок…

Бред первый: на левел-“П” составляющую накладывается значение гиры помноженное на акро-“П”. Далеко от классики ПИД регулей однако! Учитывая, что показания гиры - это угловая скорость, то для стаб мода это еще сошло бы за “Д” параметр (принимая отклонение стика в квант времени постоянным), т.е. дифференциал изменения угла (или угловая скорость по сути).

На заметку по настройке: акро-“П” влияет на стаб мод.

Бред второй: за “Д” они принимают дифференциал угловой скорости - т.е. угловое ускорение, как для акро так и для стаб.мода., а должен быть на крайняк дифференциал изменения угла - т.е. угловая скорость… Вывел графики ПИД-ов в ГУИ, занулил “П” и “И”, так и есть “Д” у них - это угловое ускорение… В итоге по теории это может привести лишь к лишним осциляциям, т.к. это добавит компенсацию/всплеск не только в нужную полярность, а также и в противоположную…

На заметку по настройке: акро-“Д” влияет на стаб мод.

//**** PITCH & ROLL & YAW PID ****
  for(axis=0;axis<3;axis++) {
    if (accMode == 1 && axis<2 ) { //LEVEL MODE
      errorAngle = rcCommand[axis] - angle[axis];                                 //500+180 = 680: 16 bits is ok here
      PTerm      = errorAngle*(P8[PIDLEVEL]/10)/10 ;                              //680*20 = 13600: 16 bits is ok here

      errorAngleI[axis] += errorAngle;                                            //16 bits is ok here
      errorAngleI[axis]  = constrain(errorAngleI[axis],-10000,+10000); //WindUp   //16 bits is ok here
      ITerm              = (int32_t)errorAngleI[axis]*I8[PIDLEVEL]/4000;          //32 bits is needed for calculation:10000*I8 could exceed 32768   16 bits is ok for result
    } else { //ACRO MODE or YAW axis
      error = (int32_t)rcCommand[axis]*10*8/P8[axis] - gyroData[axis];            //32 bits is needed for calculation: 500*10*8 = 40000   16 bits is ok for result if P>2
      PTerm = rcCommand[axis];

      errorGyroI[axis] += error;                                                  //16 bits is ok here
      errorGyroI[axis]  = constrain(errorGyroI[axis],-16000,+16000); //WindUp     //16 bits is ok here
      if (abs(gyroData[axis])>640) errorGyroI[axis] = 0;
      ITerm = (int32_t)errorGyroI[axis]*I8[axis]/1000/8;                          //32 bits is needed for calculation: 16000*I8  16 bits is ok for result
    }
    PTerm         -= (int32_t)gyroData[axis]*dynP8[axis]/10/8;                    //32 bits is needed for calculation            16 bits is ok for result

    delta          = gyroData[axis] - lastGyro[axis];                             //16 bits is ok here, because the dif between 2 consecutive gyro reads is limited
    DTerm          = (delta1[axis]+delta2[axis]+delta+1)*dynD8[axis]/3/8;         //16 bits is ok here
    delta2[axis]   = delta1[axis];
    delta1[axis]   = delta;
    lastGyro[axis] = gyroData[axis];
    axisPID[axis] =  PTerm + ITerm - DTerm;
  }

Кроче я не называл бы вишный регулятор ПИД-регулятором, а скорее просто ВИИ-регулятор 😃

Возможно на практике это и имеет смысл, но в теории бред полный. Кто нить пытался разбираться?
Есть большое желание переписать ПИД-регуль, потому скорее всего буду писать в вишную ветку с идеей наведения порядку и выделения отдельных параметров для стаб. мода…

Материалы которы помогли понять магию ПИД:
ПИД регулирование (ПИД регулятор) на практических примерах или, - PID Not for PhD - Alex Demyanenko - либо ПИД-регуль на примере сливного бачка! 😃
pidcontrol.narod.ru
www.rcgroups.com/forums/showthread.php?t=1375728
www.rcgroups.com/forums/showpost.php?p=17215161&po…

Covax

Ох Саш, опять тебя забанят, теперь за раскрытие страшных тайн 😃)

AlcoNaft43
Volver:

Новая плата от Пана Jakuba, все в одном за 104 евро. sexycopter.myshopify.com/col...roducts/mwii01 Можно настраивать без компьютера (пиды можно настроить с помошью потенциометров)

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

Covax

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

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

mahowik
ziss_dm:

Так-что все по науке… Только сечас пираты идею стянут… 😉

посмотрел кстать в ардукоптере (пират версию), там как раз таки ПИД-регуль классик 😃
и по отзывам у него стаб. мод - это стаб мод, т.е. без опыта пилотирования можно поднять и полетать имея лишь гиру и аксель 😃

и всеж вопрос: как дифференциал скорости (ускорение) может добавить стабилизации? это не вписывается ни в один из параметров ПИД регулятора если учесть что исходные параметры (требуемое и измеренное значение) это углы…

AlcoNaft43
Covax:

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

Я летал и видел как летает (или скорей не летает) мультвии и сколько Андрей с ним возится. Немец по сравнению с ним летает на все деньги которые стоит и намного больше. По моему вы тут из г-на конфетку тут делаете. Я только один смысл вижу - скиллы растут 😃 И ваще АРМ наше все 😃

Edward_tlt
AlcoNaft43:

По моему вы тут из г-на конфетку тут делаете.

Если датчики подключены правильно и на экране всё отображается правильно, то вот какая идея… Можно же использовать вии вместо пирометров, например копилота или АП Тимофея? Т.е. мысль следующая, ШИМ - сглаживающий LC-фитр и получаем пропорциональное углам наклона платы напряжение на выходе годное для мозгов копилота или ап. Правда реализацию этой идеи наверное не потяну, программер из меня… Оффтоп конечно, но не знаю как тему в Самодельной электронике назвать и надо ли…

mahowik
Covax:

Ох Саш, опять тебя забанят, теперь за раскрытие страшных тайн )

я так завуалирую, что они не поймут было ли это раскрытием! 😃

Covax

Если мы тут конфетку делаем, то вы то кули тут делаете тогда?)) попкорн жуете?) Что за Андрей такой по которому можно судить о конфетки мы делаем или тортолетки, не в обиду этому Андрею конечно же) Мультивий летает на 200% от своей цены, я начал с него и лично не грамма не жалею об этом. Ардуина это обвязанная атмега на которой практически все известные полетные контроллеры сделаны, так что не надо ляля про конфетки. Разовьется опенпайлот - отлично, обрастет всеми вкусняшками хотябы ардукоптера - очень хорошо, если найдется чем загрузить его м ощности так вообще супер. Но все решают сенсоры и софт, а не процессор.

Edward_tlt

То Сергей Covax я может конечно не удачно цитату выдернул, прошу меня извинить, сам вообщем то собрал Мультивий, осталось чуток с механикой доразбираться… Просто вот идею ещё одного применения высказал. Бредовая?

Covax

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

mahowik
Edward_tlt:

я может конечно не удачно цитату выдернул, прошу меня извинить

я так понял что Сергей писал AlcoNaft43-у по поводу конфеток и незвестного Андрея 😃

ziss_dm

Hi mahovik,

	// write out angles back to servo out - this will be converted to PWM by RC_Channel
	g.rc_1.servo_out 	= g.pid_stabilize_roll.get_pi(error,  	delta_ms_fast_loop, 1.0);		// 2500 * .7 = 1750

	// We adjust the output by the rate of rotation:
	// Rate control through bias corrected gyro rates
	// omega is the raw gyro reading
	g.rc_1.servo_out	-= degrees(omega.x) * 100.0 * g.pid_stabilize_roll.kD();

Вторая часть ничего не напоминает? 😉
В WMC, основной контроллер работает всегда, в level mode ему на вход, вместо стиков подаеться выход Level PI контроллера (ну и I зануляеться, за ненадобностью). (Хотя согласен, с первого взгляда - WTF). Т.е. получаеться PI-PD конотроллер что тоже по науке. 😉

mahowik

выпилил и подрубил 6331 аксель по аналогу… заметил странный эффект которого вроде как раньше небыло…
ща при переходе с USB на батарею уплывает калибровка на 10-20 единиц и приходится перекалибровывать…
при питании от USB - 4.65в, при питании от аккума - стаб дает ровно 5в… Получается АЦП ардуины чувствителен к питалову?
или я всеж припалил ардуину свою? как-то случайно на аналоговые входы подал 5в вместо сигналов с приемыша…

tusik

У меня не уплывала. АЦП вроде не должен чувствовать питание.

Alex_from_Israel
mahowik:

выпилил и подрубил 6331 аксель по аналогу… заметил странный эффект которого вроде как раньше небыло…
ща при переходе с USB на батарею уплывает калибровка на 10-20 единиц и приходится перекалибровывать…
при питании от USB - 4.65в, при питании от аккума - стаб дает ровно 5в… Получается АЦП ардуины чувствителен к питалову?
или я всеж припалил ардуину свою? как-то случайно на аналоговые входы подал 5в вместо сигналов с приемыша…

У меня тоже 4.65 с USB. Похоже из за падения напряжения на диоде. Причем и на 2560 и 1280 примерно одинаково. С аккума 5 ровно. Замерял, когда присобачивал к датчикам самопальный левел конвертер. После установки конвертера пропали дикие пляски на магнетометре. Хотя не уверен, что он (магнетометр) вообще работает. Магнитом возле него крутил, ноль эмоций.

mahowik
ziss_dm:

Вторая часть ничего не напоминает? В WMC, основной контроллер работает всегда, в level mode ему на вход, вместо стиков подаеться выход Level PI контроллера (ну и I зануляеться, за ненадобностью). (Хотя согласен, с первого взгляда - WTF). Т.е. получаеться PI-PD конотроллер что тоже по науке.

Главное что я хотел донести - это не тип контроллера, а какие данные берутся для высчитывания “Д” части. Должен быть дифференциал ошибки.

DTerm = Kd*(err - pre_err)/dt

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

err - pre_err = (angle - angle_required) - (pre_angle - pre_angle_required) 

предполагая что требуемый угол (положение стика) в квант времени константа, т.е. angle_required = pre_angle_required имеем

err - pre_err = angle - pre_angle = K * raw_gyro_value
  1. В ардукоптере по идее все верно, т.е. для “Д” части используется угловая скорость (raw gyro reading), где исходные данные это углЫ.

  2. В ВИЕ же в стаб моде для “Д” уже берется дифф. угловых скоростей, т.е. ускорение, где исходные данные также углы. В этом и есть затык-нюанс, который мне показался странным и в чем я убедился когда вывел ПИД-ы в ГУИ (временно вместо показаний магнетометра которого у меня нет 😃 )

Что имеем в итоге при резком наклоне вправо:

  1. на первой картинке “Д” через ускорение (это как сейчас в ВИЕ). Что может не ускорить переходной процесс а привести к осциляциям по идее. Т.к. компенсация получается двуполярная, что не похоже на “Д”-классик из теории ПИД регулей 😃

  2. На второй картинке “Д” через скорость ошибки, либо через угловую скорость в нашем случае… Компесация в итоге однополярная и похожа на “Д”-классик. ВсЁпофеншую т.е. 😃

Таким образом учитывая что IMU у нас теперь быстрый, то “Д” для стаб. мода можно считать так:

DTerm = (prevErrorAngle[axis] - errorAngle)*dynD8[axis]*2;
prevErrorAngle[axis] = errorAngle;

либо можно взять усредненное 3-х последних скоростей:

      delta          = prevErrorAngle[axis] - errorAngle;
      DTerm          = (deltaErrorAngle1[axis]+deltaErrorAngle2[axis]+delta+1)*dynD8[axis];
      deltaErrorAngle2[axis]   = deltaErrorAngle1[axis];
      deltaErrorAngle1[axis]   = delta;
      prevErrorAngle[axis] = errorAngle;

либо через показания гиры к примеру:

DTerm         -= (int32_t)gyroData[axis]*dynD8[axis]/10/8; 

ziss_dm

Hi mahowik,
Ну в общем-то никто не мешает попробовать. 😉

  1. В ардукоптере по идее все верно, т.е. для “Д” части используется угловая скорость (raw gyro reading), где исходные данные это углЫ.

Ну можно и так сказать, только тогда знак неправильный 😁

Главное что я хотел донести - что там два контроллера включенных последовательно (и WMC и в Arduxxx…) 😁


WMC:
Angle error -> PI(Level) -> PD (Acro) -> Motors
                         ^
                         |
                        Gyro


ArduXXX:
Angle error -> PI -> P -> Motors
                  ^
                  |
                Gyro

mahowik

Привет Дима!

ziss_dm:

Главное что я хотел донести - что там два контроллера включенных последовательно (и WMC и в Arduxxx…)

Спасибо за диаграмки, хотя я в принципе и так понял из описания о чем речь 😃

ziss_dm:

Ну в общем-то никто не мешает попробовать.

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

ziss_dm:

Ну можно и так сказать, только тогда знак неправильный

        // omega is the raw gyro reading
	g.rc_1.servo_out	-= degrees(omega.x) * 100.0 * g.pid_stabilize_roll.kD();

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

ArduXXX:
Angle error -> PI -> D(gyro_raw) -> Motors

З.Ы. Вообще если приземлится и рассуждать с точки зрения пользователя, то не плохо бы всеж разделить регуляторы акро и стаб. мода, т.к. сама по себе точная настройка ПИД параметров задача не тривиальная, а если учесть что в стаб. моде использутеся комплексный ПИД регуль, то идеальных параметров добиться практически не возможно, посему предлагаю:

  1. добавить левел-“Д” параметр в ГУИ. А можно и больше - отдельные “П”, “И”,“Д” параметры для ролл и питч.
  2. для упрощения тюнинга ПИД параметров отделить в коде акро и стаб. ПИД регули.
  3. убрать вычисление “Д” через ускорение для стаб. мода 😃

Т.е. фактически разобраться как тюнить ПИД-ы для стаб мода, можно только провтыркаВ в код, т.к. это нигде не написано… И кстать возможно из-за данной усложненности, левел мод. в ВИЕ оссобо и не хвалят и сам АлексВПариже написал в факах “The stable mode is not so stable” 😃