MultiWii
Ох Саш, опять тебя забанят, теперь за раскрытие страшных тайн )
я так завуалирую, что они не поймут было ли это раскрытием! 😃
Если мы тут конфетку делаем, то вы то кули тут делаете тогда?)) попкорн жуете?) Что за Андрей такой по которому можно судить о конфетки мы делаем или тортолетки, не в обиду этому Андрею конечно же) Мультивий летает на 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;
Hi mahowik,
Ну в общем-то никто не мешает попробовать. 😉
- В ардукоптере по идее все верно, т.е. для “Д” части используется угловая скорость (raw gyro reading), где исходные данные это углЫ.
Ну можно и так сказать, только тогда знак неправильный 😁
Главное что я хотел донести - что там два контроллера включенных последовательно (и WMC и в Arduxxx…) 😁
WMC:
Angle error -> PI(Level) -> PD (Acro) -> Motors
^
|
Gyro
ArduXXX:
Angle error -> PI -> P -> Motors
^
|
Gyro
Привет Дима!
Главное что я хотел донести - что там два контроллера включенных последовательно (и WMC и в Arduxxx…)
Спасибо за диаграмки, хотя я в принципе и так понял из описания о чем речь 😃
Ну в общем-то никто не мешает попробовать.
так то оно так, но вот опыт пилотирования может и загубить идею 😃 на родном вии форуме чтоль написать? там вроде хватает энтузиастов потестить 😃
Ну можно и так сказать, только тогда знак неправильный
// 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
З.Ы. Вообще если приземлится и рассуждать с точки зрения пользователя, то не плохо бы всеж разделить регуляторы акро и стаб. мода, т.к. сама по себе точная настройка ПИД параметров задача не тривиальная, а если учесть что в стаб. моде использутеся комплексный ПИД регуль, то идеальных параметров добиться практически не возможно, посему предлагаю:
- добавить левел-“Д” параметр в ГУИ. А можно и больше - отдельные “П”, “И”,“Д” параметры для ролл и питч.
- для упрощения тюнинга ПИД параметров отделить в коде акро и стаб. ПИД регули.
- убрать вычисление “Д” через ускорение для стаб. мода 😃
Т.е. фактически разобраться как тюнить ПИД-ы для стаб мода, можно только провтыркаВ в код, т.к. это нигде не написано… И кстать возможно из-за данной усложненности, левел мод. в ВИЕ оссобо и не хвалят и сам АлексВПариже написал в факах “The stable mode is not so stable” 😃
И кстать возможно из-за данной усложненности, левел мод. в ВИЕ оссобо и не хвалят
Кто конкретно не хвалит? У меня левел мод работает прекрасно.
и сам АлексВПариже написал в факах “The stable mode is not so stable” 😃
Это игра слов. Прочитайте ответ Алекса.
Кто конкретно не хвалит? У меня левел мод работает прекрасно.
почитайте ветку… про акро намного больше отзывов положительных… проблемы в основном со стаб. модом
Это игра слов. Прочитайте ответ Алекса.
Вы лучше не демагогию разводите, а на вопрос ответьте. 😃 Что делает угловое ускорение в “Д” части для стаб мода?
Поставил прошивку дев от 29062011, маг и баро работает в ГУИ нормально, баро меняет показания по скользящей средней, все отлично, но на полете чето не заметно, что высоту держит коптер… квадратик баро в ГУИ зачекан, может еще надо где чтото включить?
Сегодня полетал по очкам на ff imu, круть. Но
- Если не аккуратно транспортировать коптер (нести вверх ногами) то слетает инициализация акселя, приходится инициализироваться в поле а там хрено с ровной поверхностью.
- Компас иоже за ночь с ума сошел, в поле без компа не знал как его переинициализировать поэтому летал без него…
С новой дев прошивкой удержание высоты у меня не работает, так что переделываю коптер на мегапирата…
Если не аккуратно транспортировать коптер (нести вверх ногами) то слетает инициализация акселя
оч. странно… не должно быть такого по идее… может просто разница температуры дома и на улице была существенная, потому и поплыло все…
С bma020 такого не было чтобы я приехал в поле и не смог поднять коптер. Спустя месяц отпуска я поставил батарейку и полетел как ни в чем не бывало. А вчера поставил вместо wp+ и bma020 фф иму, залил дев, инициализировал все, полетал минут 20 и спать. Сегодня приехал на дачу, пошел в поле, там еще трава по пояс, не могу взлететь. Взял в руку - клонит кудато непонятно, инициализировал аксель, взлетел, но коптер крутит… Отключил компас и отлетал 2 пака по 15 минут без проблем. Сейчас приехал - опять аксель сбился… Компас вообще не трогаю. Может это глюки девпрошивки? А может и жара…
Доброго времени суток, пару детских вопросов,
- хотел поменять порты для RX
#define THROTTLEPIN 3
#define ROLLPIN 2
#define PITCHPIN A3
#define YAWPIN 4
так вот THROTTL и PITCH неработают, THROTTL - в центре и нереагирует, PITCH - в минимуме, так-же не реагирует если переназначаю порты работают но неработают два других.
- как работать с акселерометром
// standalone I2C NUNCHUK
// **************************
#if defined(NUNCHACK)
static uint8_t rawADC_NUN[6];
void i2c_ACC_init() {
i2c_rep_start(0xA4 + 0);//I2C write direction => 0
i2c_write(0xF0);
i2c_write(0x55);
i2c_rep_start(0xA4 + 0);//I2C write direction => 0
i2c_write(0xFB);
i2c_write(0x00);
delay(250);
accPresent = 1;
}
void i2c_ACC_getADC() {
TWBR = ((16000000L / 400000L) - 16) / 2; // change the I2C clock rate. !! you must check if the nunchuk is ok with this freq
i2c_rep_start(0xA4 + 0);//I2C write direction => 0
i2c_write(0x00);
i2c_rep_start(0xA4 + 1);//I2C read direction => 1
for(uint8_t i = 0; i < 5; i++) // интересует именно отсюда
rawADC_NUN[i]=i2c_readAck();
rawADC_NUN[5]= i2c_readNak();
accADC[ROLL] = ( (rawADC_NUN[3]<<2) + ((rawADC_NUN[5]>>4)&0x2) );
accADC[PITCH] = - ( (rawADC_NUN[2]<<2) + ((rawADC_NUN[5]>>3)&0x2) );
accADC[YAW] = - ( ((rawADC_NUN[4]&0xFE)<<2) + ((rawADC_NUN[5]>>5)&0x6) );
}
#endif
просто в своих извращениях я делал так
программируем аксель
byte status;
status = B00000000;
Wire.beginTransmission(i2cID);
Wire.send(0x21); // CTRL_REG2 (21h)
Wire.send(B01001111);
Wire.endTransmission();
Wire.beginTransmission(i2cID);
Wire.send(0x20); // CTRL_REG1 (20h)
Wire.send(B11000111);
Wire.endTransmission();
читаем данные
char accX;
Wire.requestFrom(i2cID, 1);
if(Wire.available())
{
accX= Wire.receive(); // ну естественно определённый бит
}
accXval = (accX-accZeroX)*(accZeroZ/9.8154);
а тут разобратся немогу что куда, зарание спасибо!
Hi mahowik,
Вон оказываеться что 😃 все лучшие люди проекта НАШИ ЛЮДИ! 😃 ziss_dm- респект и уважуха:)