MultiWii

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” 😃

Andrey73
mahowik:

И кстать возможно из-за данной усложненности, левел мод. в ВИЕ оссобо и не хвалят

Кто конкретно не хвалит? У меня левел мод работает прекрасно.

mahowik:

и сам АлексВПариже написал в факах “The stable mode is not so stable” 😃

Это игра слов. Прочитайте ответ Алекса.

mahowik
Andrey73:

Кто конкретно не хвалит? У меня левел мод работает прекрасно.

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

Andrey73:

Это игра слов. Прочитайте ответ Алекса.

Вы лучше не демагогию разводите, а на вопрос ответьте. 😃 Что делает угловое ускорение в “Д” части для стаб мода?

Covax

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

Covax

Сегодня полетал по очкам на ff imu, круть. Но

  1. Если не аккуратно транспортировать коптер (нести вверх ногами) то слетает инициализация акселя, приходится инициализироваться в поле а там хрено с ровной поверхностью.
  2. Компас иоже за ночь с ума сошел, в поле без компа не знал как его переинициализировать поэтому летал без него…
    С новой дев прошивкой удержание высоты у меня не работает, так что переделываю коптер на мегапирата…
mahowik
Covax:

Если не аккуратно транспортировать коптер (нести вверх ногами) то слетает инициализация акселя

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

Covax

С bma020 такого не было чтобы я приехал в поле и не смог поднять коптер. Спустя месяц отпуска я поставил батарейку и полетел как ни в чем не бывало. А вчера поставил вместо wp+ и bma020 фф иму, залил дев, инициализировал все, полетал минут 20 и спать. Сегодня приехал на дачу, пошел в поле, там еще трава по пояс, не могу взлететь. Взял в руку - клонит кудато непонятно, инициализировал аксель, взлетел, но коптер крутит… Отключил компас и отлетал 2 пака по 15 минут без проблем. Сейчас приехал - опять аксель сбился… Компас вообще не трогаю. Может это глюки девпрошивки? А может и жара…

SergDoc

Доброго времени суток, пару детских вопросов,

  1. хотел поменять порты для RX

 #define THROTTLEPIN                3
  #define ROLLPIN                    2
  #define PITCHPIN                   A3
  #define YAWPIN                     4

так вот THROTTL и PITCH неработают, THROTTL - в центре и нереагирует, PITCH - в минимуме, так-же не реагирует если переназначаю порты работают но неработают два других.

  1. как работать с акселерометром

// 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);
  

а тут разобратся немогу что куда, зарание спасибо!

Piranha
ziss_dm:

Hi mahowik,

Вон оказываеться что 😃 все лучшие люди проекта НАШИ ЛЮДИ! 😃 ziss_dm- респект и уважуха:)

Prikupets

У меня начало вырисовываться что-то с MultiWii. Уже второй день летаю по очкам в обычном режиме и автолевеле. Но при полете и снижении все же трясет.
Раньше не летал из-за кривой цанги, которая давала вибрации. Но OpenPilot отлично летал с этой кривой цангой и не трясся. Значит дело в математике MultiWii или в сенсорах. Сенсоры у меня из WM и NK вырезанные, в связи с этим вопрос:

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

Моя инициализация акселя:

void i2c_ACC_init () {
  delay(10);
  i2c_rep_start(0x3A+0);      // I2C write direction
  i2c_write(0x2D);            // register 2D Power CTRL
  i2c_write(1<<3);            // Set measure bit 3 on
  i2c_rep_start(0x3A+0);      // I2C write direction
  i2c_write(0x31);            // DATA_FORMAT register
  i2c_write(0x0B);            // Set bits 3(full range) and 1 0 on (+/- 16g-range)
  i2c_rep_start(0x3A+0);      // I2C write direction
  i2c_write(0x2C);            // BW_RATE
//i2c_write(8+2+1);           // 200Hz sampling (see table 5 of the spec); AP; by ziss_dm;
  i2c_write(8+2);             // 100Hz sampling (see table 5 of the spec)
  //i2c_write(8+1);             // 50Hz sampling (see table 5 of the spec)
  //i2c_write(8);               // 25Hz sampling (see table 5 of the spec)
  //i2c_write(4+2+1);           // 12.5Hz sampling (see table 5 of the spec)
  //i2c_write(4+2);             // 6.25Hz sampling (see table 5 of the spec)
  acc_1G = 250;
  acc_25deg = 106; // = acc_1G * sin(25 deg)
  accPresent = 1;
}

Моя инициализация гиры:

void i2c_Gyro_init() {
  delay(100);
  i2c_rep_start(0XD0+0);      // I2C write direction
  i2c_write(0x3E);            // Power Management register
  i2c_write(0x80);            //   reset device
  delay(5);                   // AP; by ziss_dm
  i2c_rep_start(0XD0+0);      // I2C write direction; AP; by ziss_dm
  i2c_write(0x16);            // register DLPF_CFG - low pass filter configuration & sample rate
//  i2c_write(0x1D);            //   10Hz Low Pass Filter Bandwidth - Internal Sample Rate 1kHz
//  i2c_write(0x19);            //   188Hz Low Pass Filter Bandwidth - Internal Sample Rate 1kHz
  i2c_write(0x18);            //   256Hz Low Pass Filter Bandwidth - Internal Sample Rate 8kHz
  i2c_rep_start(0XD0+0);      // I2C write direction; AP; by ziss_dm
  i2c_write(0x3E);            // Power Management register
  i2c_write(0x01);            //   PLL with X Gyro reference
  delay(100);
  gyroPresent = 1;
}

P.S. Кстати, Кук тоже от вибраций не трясется.

Covax
Prikupets:

Значит дело в математике MultiWii или в сенсорах.

У меня ff imu с самыми зачетными сенсорами, тоже треясется при снижении когда хочешь затормозить газом, правда ПИДы все стоковые, но явно в математике что-то не доделано… На неделе перехожу с этим же железом на Мегапирата, вот тогда и скажу где проблема более точно.

funtik26

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

Covax

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

funtik26

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