MultiWii
Ура заработало,порезал дорожки на Вимоушене подпаялся как на фото и понеслась:),подключил регули,моторы.Стартанул,покрутил винтами,остальное завтра.
Новая плата от Пана Jakuba, все в одном за 104 евро. sexycopter.myshopify.com/collections/…/mwii01
Можно настраивать без компьютера (пиды можно настроить с помошью потенциометров)
Я тут решил разобраться с ПИД параметрами, настройкой, реализациями и т.д. Надоело “слепым котенком” параметры тягать…
Кто нить в реализацию ПИД-регуля втрыркал?! У них там походу крейзи-микс полный 😃
В вие в стаб. моде измеряемой величиной является угол (ролл, питч), который приводится к “требуемому” углу (значение пропорциональное отклонениям стиков)… т.е. с этим все ок…
Бред первый: на левел-“П” составляющую накладывается значение гиры помноженное на акро-“П”. Далеко от классики ПИД регулей однако! Учитывая, что показания гиры - это угловая скорость, то для стаб мода это еще сошло бы за “Д” параметр (принимая отклонение стика в квант времени постоянным), т.е. дифференциал изменения угла (или угловая скорость по сути).
На заметку по настройке: акро-“П” влияет на стаб мод.
Бред второй: за “Д” они принимают дифференциал угловой скорости - т.е. угловое ускорение, как для акро так и для стаб.мода., а должен быть на крайняк дифференциал изменения угла - т.е. угловая скорость… Вывел графики ПИД-ов в ГУИ, занулил “П” и “И”, так и есть “Д” у них - это угловое ускорение… В итоге по теории это может привести лишь к лишним осциляциям, т.к. это добавит компенсацию/всплеск не только в нужную полярность, а также и в противоположную…
На заметку по настройке: акро-“Д” влияет на стаб мод.
//**** 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…
Ох Саш, опять тебя забанят, теперь за раскрытие страшных тайн 😃)
Новая плата от Пана Jakuba, все в одном за 104 евро. sexycopter.myshopify.com/col...roducts/mwii01 Можно настраивать без компьютера (пиды можно настроить с помошью потенциометров)
кому это нужно за эти деньги, коптерконтрол теже деньги стоит…
Hi mahowik,
Думаю надо-бы еще почитать 😉
- Про типы контроллеров A,B,C bestune.50megs.com/typeABC.htm (Этот B )
- Про каскадные пид контроллеры en.wikipedia.org/wiki/PID_controller#Cascade_contr…
- Про веcовые коэфициенты ошибки…
Так-что все по науке… Только сечас пираты идею стянут… 😉
кому это нужно за эти деньги, коптерконтрол теже деньги стоит…
А причем тут деньги, хотя цена завышена раза в полтора? Тут важно как много народу занимается проектом, насколько он популярен, как часто обновляется прошивка и растет качество софта, а то что там скорость обработки выше, так и выше немца скорость обработки, что ж теперь кому нужен немец за эти деньги? ))) в коптере важен софт, а не железо на котором от танцует.
Так-что все по науке… Только сечас пираты идею стянут… 😉
посмотрел кстать в ардукоптере (пират версию), там как раз таки ПИД-регуль классик 😃
и по отзывам у него стаб. мод - это стаб мод, т.е. без опыта пилотирования можно поднять и полетать имея лишь гиру и аксель 😃
и всеж вопрос: как дифференциал скорости (ускорение) может добавить стабилизации? это не вписывается ни в один из параметров ПИД регулятора если учесть что исходные параметры (требуемое и измеренное значение) это углы…
А причем тут деньги, хотя цена завышена раза в полтора? Тут важно как много народу занимается проектом, насколько он популярен, как часто обновляется прошивка и растет качество софта, а то что там скорость обработки выше, так и выше немца скорость обработки, что ж теперь кому нужен немец за эти деньги? ))) в коптере важен софт, а не железо на котором от танцует.
Я летал и видел как летает (или скорей не летает) мультвии и сколько Андрей с ним возится. Немец по сравнению с ним летает на все деньги которые стоит и намного больше. По моему вы тут из г-на конфетку тут делаете. Я только один смысл вижу - скиллы растут 😃 И ваще АРМ наше все 😃
По моему вы тут из г-на конфетку тут делаете.
Если датчики подключены правильно и на экране всё отображается правильно, то вот какая идея… Можно же использовать вии вместо пирометров, например копилота или АП Тимофея? Т.е. мысль следующая, ШИМ - сглаживающий LC-фитр и получаем пропорциональное углам наклона платы напряжение на выходе годное для мозгов копилота или ап. Правда реализацию этой идеи наверное не потяну, программер из меня… Оффтоп конечно, но не знаю как тему в Самодельной электронике назвать и надо ли…
Ох Саш, опять тебя забанят, теперь за раскрытие страшных тайн )
я так завуалирую, что они не поймут было ли это раскрытием! 😃
Если мы тут конфетку делаем, то вы то кули тут делаете тогда?)) попкорн жуете?) Что за Андрей такой по которому можно судить о конфетки мы делаем или тортолетки, не в обиду этому Андрею конечно же) Мультивий летает на 200% от своей цены, я начал с него и лично не грамма не жалею об этом. Ардуина это обвязанная атмега на которой практически все известные полетные контроллеры сделаны, так что не надо ляля про конфетки. Разовьется опенпайлот - отлично, обрастет всеми вкусняшками хотябы ардукоптера - очень хорошо, если найдется чем загрузить его м ощности так вообще супер. Но все решают сенсоры и софт, а не процессор.
То Сергей Covax я может конечно не удачно цитату выдернул, прошу меня извинить, сам вообщем то собрал Мультивий, осталось чуток с механикой доразбираться… Просто вот идею ещё одного применения высказал. Бредовая?
Эдуард, про пирометры ничего не могу сказать не сталкивался…
А, весь мой спич был Сергею Алконафту конечно же)
я может конечно не удачно цитату выдернул, прошу меня извинить
я так понял что Сергей писал AlcoNaft43-у по поводу конфеток и незвестного Андрея 😃
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 конотроллер что тоже по науке. 😉
Мужики, хватит о том Андрее 😃
выпилил и подрубил 6331 аксель по аналогу… заметил странный эффект которого вроде как раньше небыло…
ща при переходе с USB на батарею уплывает калибровка на 10-20 единиц и приходится перекалибровывать…
при питании от USB - 4.65в, при питании от аккума - стаб дает ровно 5в… Получается АЦП ардуины чувствителен к питалову?
или я всеж припалил ардуину свою? как-то случайно на аналоговые входы подал 5в вместо сигналов с приемыша…
У меня не уплывала. АЦП вроде не должен чувствовать питание.
выпилил и подрубил 6331 аксель по аналогу… заметил странный эффект которого вроде как раньше небыло…
ща при переходе с USB на батарею уплывает калибровка на 10-20 единиц и приходится перекалибровывать…
при питании от USB - 4.65в, при питании от аккума - стаб дает ровно 5в… Получается АЦП ардуины чувствителен к питалову?
или я всеж припалил ардуину свою? как-то случайно на аналоговые входы подал 5в вместо сигналов с приемыша…
У меня тоже 4.65 с USB. Похоже из за падения напряжения на диоде. Причем и на 2560 и 1280 примерно одинаково. С аккума 5 ровно. Замерял, когда присобачивал к датчикам самопальный левел конвертер. После установки конвертера пропали дикие пляски на магнетометре. Хотя не уверен, что он (магнетометр) вообще работает. Магнитом возле него крутил, ноль эмоций.
Вторая часть ничего не напоминает? В 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
-
В ардукоптере по идее все верно, т.е. для “Д” части используется угловая скорость (raw gyro reading), где исходные данные это углЫ.
-
В ВИЕ же в стаб моде для “Д” уже берется дифф. угловых скоростей, т.е. ускорение, где исходные данные также углы. В этом и есть затык-нюанс, который мне показался странным и в чем я убедился когда вывел ПИД-ы в ГУИ (временно вместо показаний магнетометра которого у меня нет 😃 )
Что имеем в итоге при резком наклоне вправо:
-
на первой картинке “Д” через ускорение (это как сейчас в ВИЕ). Что может не ускорить переходной процесс а привести к осциляциям по идее. Т.к. компенсация получается двуполярная, что не похоже на “Д”-классик из теории ПИД регулей 😃
-
На второй картинке “Д” через скорость ошибки, либо через угловую скорость в нашем случае… Компесация в итоге однополярная и похожа на “Д”-классик. ВсЁпофеншую т.е. 😃
Таким образом учитывая что 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;