ArduCopter Mega: порт на обычную Arduino (тестим)
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).
итак, OSD, который писал Олег, но так и не добавил в коптерную версию прошивки
Спасибо SovGVD что взялись за адаптацию Олеговского OSD.
Давно уже лежит E-OSD прошитая прошивкой Олега.
Всё не как не мог дождаться, когда Олег освободит время и для нас.
Ну теперь благодаря Вам будем пробовать😁
Кто нить подскажите, чет запутался😵
Пока пробовал прошивки как работают в Планере, просмотрел а как у нас теперь включаются моторы?
имхо чето с GPS, например спутников мало или еще чего (код i2c вроде как всё еще тестовый) - в планере то нормально показывает положение?
Я то же думаю, что проблема в GPS. Алексей, у тебя есть какая нибудь телеметрия? Ну через APC/Xbee/Bluetooth? Тогда бы можно было в планере посмотреть, что творилось с координатами. Либо можно прикрутить SD карточку и писать лог на нее…
Давно уже лежит E-OSD прошитая прошивкой Олега.
мне бы только разобраться как компилить без avrstudio, используя только avg-gcc =))
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кГц. Попробую сейчас в быстром цикле опрашивать гиру и суммировать.
может пора переходить на 2 ардуинки? а то чето ни прерваний, ни мощности
Точно! +5 градусов -5 +5 -4 +6 -4 (super_fast_loop) = 0 (отдали в fast_loop)
Если +5-5… то нам пофигу, т.к. коптер вернулся обратно и нам не важно, что его чуток поштормило! Про эту ситуацию речи нет!
Подумай, что будет если Гира может увидеть максимальный наклон 30гр (при 250Гц, для примера), а мы повернули на 45гр, а потом на 30 назад… в итоге гира скажет 0, а на самом деле 15гр!
в итоге гира скажет 0, а на самом деле 15гр!
Нужно поднять частоту опроса и интегрирования. Сейчас поставил ФНЧ 256Гц, сэкмплирование 1кГц, посмотрю, что будет. Еще не думал, как сумму отдавать в IMU.
мне бы только разобраться как компилить без avrstudio, используя только avg-gcc =))
Компилю через avrstudio, к сожалению avg-gcc не знаю:(
Сейчас попробовал подключил камеру,очки,OSD.
Замечательно всё показывает.
попробовал подключил камеру
сколько строк камера? у меня 420 строк и вижу не всё, да и сам горизонт смещен вниз
переключение режимов показывает? по идее надо всего лишь в коде OSD поменять их названия и будет вообще идеально
Подумай, что будет если Гира может увидеть максимальный наклон 30гр (при 250Гц, для примера), а мы повернули на 45гр, а потом на 30 назад… в итоге гира скажет 0, а на самом деле 15гр!
а нам надо так сильно коптер крутить? ну кроме акро режима и при попытках поиграться в аса пилотирования
у меня такой же косяк был с гирой L3G4200D, даже еще сильнее (там градусов под 90 и больше было при резком вращении платки, грешил на переполнение), но вполне хорошо летал блинчиком
а нам надо так сильно коптер крутить? ну кроме акро режима и при попытках поиграться в аса пилотирования у меня такой же косяк был с гирой L3G4200D, даже еще сильнее (там градусов под 90 и больше было при резком вращении платки, грешил на переполнение), но вполне хорошо летал блинчиком
Хз, но я предпочитаю отладить полностью работу с датчиками (сонар, баро, гира, аксель) - что бы потом не думать, а где порылась собака и почему коптер так колбасит или падает или…
Хитро, однако:
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; И работает только гира. Явно видно, что быстрые повороты она “прозевала”. Доводка шла только за счет акселя!
Если +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…
сколько строк камера? у меня 420 строк и вижу не всё, да и сам горизонт смещен вниз
переключение режимов показывает? по идее надо всего лишь в коде OSD поменять их названия и будет вообще идеально
Брал такую BEV OSC 480-PAL вроде 480,показывает ровненько. Режимы показывает, но перепутаны надо поискать в коде.
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гр/с
i2c_write(0x4); // 1000/ 4+1 = 250 Hz ??? 1000/5 = 200Гц
Опа, еще одна ошибочка в коде походу. Значит и dt надо было отдавать не 4000, а 5000… (200Гц = 5мкс)
Значит и dt надо было отдавать не 4000, а 5000… (200Гц = 5мкс)
Может, лучше i2c_write(0x3); // 1000 / 1+3 = 250Hz
И оставить время цикла 4мс?
Или специально цикл 250Гц, а гира 200Гц, чтобы гарантировано успеть за ней?
Или специально цикл 250Гц, а гира 200Гц, чтобы гарантировано успеть за ней?
Логики выбора частоты я не знаю. Попробовал 250Гц, стало получше, но не намного… надо 500 или килогерц.
Вру, стало значительно лучше!
Попробовал 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 мс
Режимы показывает, но перепутаны надо поискать в коде.
в 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;
}
тогда всё будет работать как надо
Адекватно работает!
Не совсем понял, зачем DCM обновлять на этой частоте? Оригинальный код AC, просто усредняет (т.е. сумма/кол-во считываний) показания гиры между вызовами DCM. Думаю, нам можно так же поступить 😃
Кстати, я еще задействовал INT_Baro… это так же нам может дать дополнительные микросекунды 😃
Не совсем понял, зачем DCM обновлять на этой частоте?
Я не знаю, как отправить суммарный угол в DCM и учесть G_dt super_fast_cycle (
Может, в super_fast_cycle считать гиру new_gyro_vector и Gdt, а в f ast_cycle вызывать readAHRS(new_gyro_vector, Gdt); ?
Хочется аналоговые гиры, чтобы быстро считывать. Или отдельную ардуинку выделить под AHRS. Пусть возвращает вектор XYZ =)