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

Sir_Alex
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…

Если гира работает с меньшей частотой (250Hz), то мы просто не “увидим” то что гира повернулась на (например) 90гр. Т.к. у нее произойдет переполнение. Что бы этого не было, надо увеличить частоту гиры (Например 500Hz или 1KHz), тогда она станет чаще отдавать информацию и мы увидим поворот два раза по 45гр (или 22.5 для 1KHz). Суммирование нам даст 90гр при той же частоте fast_loop’a (250Hz).

ligor73

итак, OSD, который писал Олег, но так и не добавил в коптерную версию прошивки

Спасибо SovGVD что взялись за адаптацию Олеговского OSD.
Давно уже лежит E-OSD прошитая прошивкой Олега.
Всё не как не мог дождаться, когда Олег освободит время и для нас.
Ну теперь благодаря Вам будем пробовать😁

Кто нить подскажите, чет запутался😵
Пока пробовал прошивки как работают в Планере, просмотрел а как у нас теперь включаются моторы?

Sir_Alex
SovGVD:

имхо чето с GPS, например спутников мало или еще чего (код i2c вроде как всё еще тестовый) - в планере то нормально показывает положение?

Я то же думаю, что проблема в GPS. Алексей, у тебя есть какая нибудь телеметрия? Ну через APC/Xbee/Bluetooth? Тогда бы можно было в планере посмотреть, что творилось с координатами. Либо можно прикрутить SD карточку и писать лог на нее…

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 =)