ArduCopter Mega: порт на обычную Arduino (тестим)

SovGVD
ligor73:

Давно уже лежит E-OSD прошитая прошивкой Олега.

мне бы только разобраться как компилить без avrstudio, используя только avg-gcc =))

Musgravehill
mahowik:

V takom sluchae “bistrie” uskoreniya giri budut usrednyatsya i nichego novogo mi ne poluchim po idee, t.e. adekvatnogo povedeniya sistemi na bistrie izmenenia uglovih skorostey - boltanku t.e

Точно! +5 градусов -5 +5 -4 +6 -4 (super_fast_loop) = 0 (отдали в fast_loop)
Нужно в самом super_fast_loop вычислять матрицу DCM и отдавать команды моторам, по времени затратная процедура.
С другой стороны, просто суммируя в super_fast_loop, мы точнее получим итоговый угол наклона. Т.е. ошибка интегрирования будет меньше, потому что отчеты чаще.

в коде i2c itg3200:
i2c_write(0x4); // 7: 1000Hz/(4+1) = 250Hz .
1000Гц/5 = 200 Гц хм

Если поставить фильтр 256Гц, то Finternal = 8кГц вместо 1кГц. Попробую сейчас в быстром цикле опрашивать гиру и суммировать.

SovGVD

может пора переходить на 2 ардуинки? а то чето ни прерваний, ни мощности

Sir_Alex
Musgravehill:

Точно! +5 градусов -5 +5 -4 +6 -4 (super_fast_loop) = 0 (отдали в fast_loop)

Если +5-5… то нам пофигу, т.к. коптер вернулся обратно и нам не важно, что его чуток поштормило! Про эту ситуацию речи нет!
Подумай, что будет если Гира может увидеть максимальный наклон 30гр (при 250Гц, для примера), а мы повернули на 45гр, а потом на 30 назад… в итоге гира скажет 0, а на самом деле 15гр!

Musgravehill
Sir_Alex:

в итоге гира скажет 0, а на самом деле 15гр!

Нужно поднять частоту опроса и интегрирования. Сейчас поставил ФНЧ 256Гц, сэкмплирование 1кГц, посмотрю, что будет. Еще не думал, как сумму отдавать в IMU.

ligor73
SovGVD:

мне бы только разобраться как компилить без avrstudio, используя только avg-gcc =))

Компилю через avrstudio, к сожалению avg-gcc не знаю:(

Сейчас попробовал подключил камеру,очки,OSD.
Замечательно всё показывает.

SovGVD
ligor73:

попробовал подключил камеру

сколько строк камера? у меня 420 строк и вижу не всё, да и сам горизонт смещен вниз
переключение режимов показывает? по идее надо всего лишь в коде OSD поменять их названия и будет вообще идеально

Sir_Alex:

Подумай, что будет если Гира может увидеть максимальный наклон 30гр (при 250Гц, для примера), а мы повернули на 45гр, а потом на 30 назад… в итоге гира скажет 0, а на самом деле 15гр!

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

Sir_Alex
SovGVD:

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

Хз, но я предпочитаю отладить полностью работу с датчиками (сонар, баро, гира, аксель) - что бы потом не думать, а где порылась собака и почему коптер так колбасит или падает или…

Musgravehill

Хитро, однако:

arducopter.pde-> readAHRS() -> AP_DCM::update_DCM_fast -> delta_t = _imu->get_delta_time(); ->AP_ADC_ADS7844::Ch6( return 1000; // Gyro sample rate 1kHz)

arducopter.pde -> readAHRS() -> AP_DCM::update_DCM_fast -> matrix_update(delta_t);

-----
Кто объяснит математику??
itg3200.init
i2c_write(0x15); // register Sample Rate Divider
i2c_write(0x 4); // 1000/ 4+1 = 250 Hz ??? 1000/5 = 200Гц

-----
APM_DCM.cpp accel_weight = 0.0; И работает только гира. Явно видно, что быстрые повороты она “прозевала”. Доводка шла только за счет акселя!

mahowik
Sir_Alex:

Если +5-5… то нам пофигу, т.к. коптер вернулся обратно и нам не важно, что его чуток поштормило! Про эту ситуацию речи нет!
Подумай, что будет если Гира может увидеть максимальный наклон 30гр (при 250Гц, для примера), а мы повернули на 45гр, а потом на 30 назад… в итоге гира скажет 0, а на самом деле 15гр!

tirrrrrrrrrr… prrrrrr 😃
postoyteka! o chem mi tut rassujdaem?! gira to otdaet uglovie skorosti a ne ugi !!!
t.e. poluchaetsya chto usrednyatsya budet skorost a ne ugol… %)

P.s. t.e. esli prinimat skorost postoyannoy v kvant vremeni (vremya iteracii bistrogo cicla) togda mogno i skorost usrednyat. No esli schitat chto v etot kvant ona takje ne postoyanna, to usrednenie ne katit…

ligor73

сколько строк камера? у меня 420 строк и вижу не всё, да и сам горизонт смещен вниз
переключение режимов показывает? по идее надо всего лишь в коде OSD поменять их названия и будет вообще идеально

Брал такую BEV OSC 480-PAL вроде 480,показывает ровненько. Режимы показывает, но перепутаны надо поискать в коде.

Sir_Alex
mahowik:

postoyteka! o chem mi tut rassujdaem?! gira to otdaet uglovie skorosti a ne ugi !!! t.e. poluchaetsya chto usrednyatsya budet skorost a ne ugol… %)

Разумеется, имеется ввиду не просто угол, а скорость, например 60гр/с

Musgravehill:

i2c_write(0x4); // 1000/ 4+1 = 250 Hz ??? 1000/5 = 200Гц

Опа, еще одна ошибочка в коде походу. Значит и dt надо было отдавать не 4000, а 5000… (200Гц = 5мкс)

Musgravehill
Sir_Alex:

Значит и dt надо было отдавать не 4000, а 5000… (200Гц = 5мкс)

Может, лучше i2c_write(0x3); // 1000 / 1+3 = 250Hz
И оставить время цикла 4мс?

Или специально цикл 250Гц, а гира 200Гц, чтобы гарантировано успеть за ней?

Sir_Alex
Musgravehill:

Или специально цикл 250Гц, а гира 200Гц, чтобы гарантировано успеть за ней?

Логики выбора частоты я не знаю. Попробовал 250Гц, стало получше, но не намного… надо 500 или килогерц.

Вру, стало значительно лучше!

Musgravehill
Sir_Alex:

Попробовал 250Гц, стало получше, но не намного… надо 500 или килогерц.

Вру, стало значительно лучше!

Сделал 333 Гц super_fast_loop. ITG3200 LPF=20Hz, Fi = 1 000Hz. Sample Rate = 1 000/ (2+1) = 333 Hz
А fast_loopTimer >= 5000 т.е. 200Гц


if ((timer - super_fast_loopTimer) >= 3300)
{
		G_Dt 				= (float)(timer - super_fast_loopTimer) / 1000000.f;		// used by PI Loops
		super_fast_loopTimer 		= timer;
		super_fast_loop();
}

super_fast_loop()
{
     readAHRS();   //только в супер_быстром цикле! Из fast_loop убрал!
}

Адекватно работает! Дрейф гироскопа по оси менее градуса в минуту.

-----------------------------------
readAHRS(); занимает 3200 мкс = 3.2 мс

SovGVD
ligor73:

Режимы показывает, но перепутаны надо поискать в коде.

в mpo.c

switch(pak_buf0[7])
        {case 0: print(30,"MANUAL");break;
         case 1: print(30,"CIRCLE");break;
        case 2: print(30,"STABILIZE");break;
        case 5: print(30,"WIRE A");break;
        case 6: print(30,"WIRE B");break;
        case 10: print(30,"AUTOPILOT");break;
        case 11: print(30,"RETURN");break;
        case 12: print(30,"HOLD");break;
        case 13: print(30,"TAKEOFF");break;
        case 14: print(30,"LANDING");break;
        default: print(30,"UNKNOWN");break;

        }

должно быть для коптера (по идее)

switch(pak_buf0[7])
        {case 0: print(30,"STABILIZE");break;
         case 1: print(30,"ACRO");break;
        case 2: print(30,"ALT_HOLD");break;
        case 3: print(30,"AUTO");break;
        case 4: print(30,"GUIDED");break;
        case 5: print(30,"LOITER");break;
        case 6: print(30,"RLT");break;
        case 7: print(30,"CIRCLE");break;
        default: print(30,"UNKNOWN");break;

        }

тогда всё будет работать как надо

Sir_Alex
Musgravehill:

Адекватно работает!

Не совсем понял, зачем DCM обновлять на этой частоте? Оригинальный код AC, просто усредняет (т.е. сумма/кол-во считываний) показания гиры между вызовами DCM. Думаю, нам можно так же поступить 😃
Кстати, я еще задействовал INT_Baro… это так же нам может дать дополнительные микросекунды 😃

Musgravehill
Sir_Alex:

Не совсем понял, зачем DCM обновлять на этой частоте?

Я не знаю, как отправить суммарный угол в DCM и учесть G_dt super_fast_cycle (

Может, в super_fast_cycle считать гиру new_gyro_vector и Gdt, а в f ast_cycle вызывать readAHRS(new_gyro_vector, Gdt); ?

Хочется аналоговые гиры, чтобы быстро считывать. Или отдельную ардуинку выделить под AHRS. Пусть возвращает вектор XYZ =)

Sir_Alex
Musgravehill:

Хочется аналоговые гиры, чтобы быстро считывать. Или отдельную ардуинку выделить под AHRS.

Дык это уже получается оригинальный ArduCopter OilPan 😃

Musgravehill:

Я не знаю, как отправить суммарный угол в DCM и учесть G_dt super_fast_cycle

Я сейчас пробую это сделать, если получится выложу код.

alexeykozin

Подскажите пожалуйста новичку в чем концепция группы ардупираты?
У офф. ардукоптеров защита от чужих плат?
Другой процессор?

Covax

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