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

tusik
nemo61:

не могу подключиться

Только что проверил. Все нормально подключается

nemo61
tusik:

Только что проверил. Все нормально подключается

На 1.0.76 не получается. Не могу найти 1.0.74. Подскажите.

Sir_Alex
nemo61:

На 1.0.76 не получается. Не могу найти 1.0.74. Подскажите.

Если вы подключаетесь по USB, то когда в планере нажимаете “Connect”, сделайте Reset Ардуины. Mavlink при подключении по USB коннектиться только в самом начале работы ардуины, потом переходит на порт телеметрии. Я точно не помню, в старых планерах, происходил или нет автоматический Reset фрдуины при подключении…

nemo61
Sir_Alex:

Если вы подключаетесь по USB, то когда в планере нажимаете “Connect”, сделайте Reset Ардуины. Mavlink при подключении по USB коннектиться только в самом начале работы ардуины, потом переходит на порт телеметрии. Я точно не помню, в старых планерах, происходил или нет автоматический Reset фрдуины при подключении…

Не помогло.
Вообще не могу понять! В 1.0.74 не могу, 1.0.76 не могу, а в 1.0.54 подключаюсь!

alexeykozin
iBat:

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

Почему в китае делают а у нас нет? Чем мы хуже?
собрать народ и каждый что может кто детали подбирает, кто платы клепает, у кого есть выходы на штучный робомонтаж, или помочь кому нить в провинцию выслать комплект плата + детали и не как в мастерките а чтоб дешевле чем если собирать по детальке самому (изза опта).

личные задумки
-сделать ардупилот отработать его на модели, посмотреть как он с автономной посадкой,
доработать и поковырятся
-сделать наземную станцию не только пульт телеметрии но и кгс , предачу давления и коррекции gps координат впп в автомате на борт

ну и совсем думки дурачка -фантаста: сделать грузовой самоль, чтоб сбрасывал на парашюте заказы по мособласти )) представляете ардупилот который развозит ардупилоты вместо курьера

iBat
alexeykozin:

Почему в китае делают а у нас нет? Чем мы хуже?
собрать народ и каждый что может кто детали подбирает, кто платы клепает, у кого есть выходы на штучный робомонтаж, или помочь кому нить в провинцию выслать комплект плата + детали и не как в мастерките а чтоб дешевле чем если собирать по детальке самому (изза опта).

личные задумки
-сделать ардупилот отработать его на модели, посмотреть как он с автономной посадкой,
доработать и поковырятся
-сделать наземную станцию не только пульт телеметрии но и кгс , предачу давления и коррекции gps координат впп в автомате на борт

ну и совсем думки дурачка -фантаста: сделать грузовой самоль, чтоб сбрасывал на парашюте заказы по мособласти )) представляете ардупилот который развозит ардупилоты вместо курьера

Задумки здравые. Есть сильно пересекающийся с вашими задумками проект - OpenPilot.

Sir_Alex
nemo61:

Не помогло. Вообще не могу понять! В 1.0.74 не могу, 1.0.76 не могу, а в 1.0.54 подключаюсь!

Выберите “Help” в планере и поставьте в самом низу экрана “Show console” и перезапустите планер. Теперь у вас кроме основного окна, будет еще консоль. Так вот нажимая Ресет в момент подключения, вы там должны увидеть, что ваша Ардуинка пошла на перезагрузку. У меня почему то ресет срабатывает не с первого раза (именно когда MAVLink пытается подцепится, в других случаях ресет отрабатывает нормально)!

Musgravehill

Удалось считывать с гиры показания x,y,z в супер_быстром_цикле 500Гц и отдавать в dcm.update_fast(x,y,z);
Продолжаю копаться.

SovGVD
Musgravehill:

Продолжаю копаться.

а где код? теперь горизонт не уплывает?

Sir_Alex
Musgravehill:

Удалось считывать с гиры показания x,y,z в супер_быстром_цикле 500Гц и отдавать в dcm.update_fast(x,y,z); Продолжаю копаться.

А у меня какая то ерундень… Вроде задействовал 1КГц у гиры, читаю с помощью INT Gyro и суммирую показания. DCM Обновляется на 250Гц. Без акселя, вроде с большего гира правильно показывает, а если включить аксель то какой то неадекват… поворачиваешь коптер на 90 гр, он сразу становится на 90, а потом начинает плыть обратно. Хотя показания акселя то же верные… в общем, я в непонятках, что не так…

SovGVD
Sir_Alex:

поворачиваешь коптер на 90 гр, он сразу становится на 90, а потом начинает плыть обратно.

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

Sir_Alex
SovGVD:

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

Если я правильно понимаю процесс, то с точки зрения DCM ничего не должно было изменится. Я считываю показания гиры в 4 раза быстрее, сам усредняю и отдаю в DCM как будто гира работает на 250Гц…

Кстати, посмотрите кто нибудь код инициализации акселя, я правильно понимаю что он на 10Гц работает???

Musgravehill
SovGVD:

а где код?

Горизонт теперь уплывает быстро! Это говорит о том, что идет частый опрос гиры (и ошибка интегрирования растет быстрее). Аксель отключил. IMU точно следует за быстрыми движениями руки только за счет гиры.
Выкладываю то, что пока есть:
ArduCopter.pde


static unsigned long     super_fast_loopTimer;  //my new timer
...........

///раздел с LOOP-ами
   //мой цикл 500Гц
   if ((timer - super_fast_loopTimer) >= 2000) {

		super_fast_loopTimer 		= timer;
		super_fast_loop();
    }
   //конец мой цикл 500Гц

if ((timer - fast_loopTimer) >= 4000) {   //250ГЦ, ничего не менял тут
                              G_Dt    = (float)(timer - fast_loopTimer) / 1000000.f;
..........

float r,p,y;   //глобальные переменные: по гире roll, pitch, yaw
int adc_val[6];
uint8_t sen[6]  = { 0, 1, 2, 4, 5, 6};

static void super_fast_loop()
{
        adc.Ch6(sen, adc_val);
        y += adc_val[0];
        r += adc_val[1];
        p += adc_val[2];      //в супер_быстром_цикле 500Гц будем опрашивать Гиру и суммировать значения по осям

}
.......

///обычный цикл 250Гц, ничего в нем не менял.
static void fast_loop()
{
    // try to send any deferred messages if the serial port now has
    // some space available
    gcs.send_message(MSG_RETRY_DEFERRED);
#if HIL_PROTOCOL == HIL_PROTOCOL_MAVLINK && (HIL_MODE != HIL_MODE_DISABLED || HIL_PORT == 0)
    hil.send_message(MSG_RETRY_DEFERRED);
#endif

	// Read radio
	// ----------
	read_radio();

	// IMU DCM Algorithm
	read_AHRS();               //вызывается функция! ДЕЛЬТА= 4000 мс, потому что цикл 250Гц

	// Look for slow loop times
	// ------------------------
	//if (delta_ms_fast_loop > G_Dt_max)
	//	G_Dt_max = delta_ms_fast_loop;
	// custom code/exceptions for flight modes
	// ---------------------------------------
	update_yaw_mode();
	update_roll_pitch_mode();

	// write out the servo PWM values
	// ------------------------------
	set_servos_4();
}

static void read_AHRS(void)
{
	// Perform IMU calculations and get attitude info
	//-----------------------------------------------
	#if HIL_MODE == HIL_MODE_SENSORS
		// update hil before dcm update
		hil.update();
	#endif

	dcm.update_DCM_fast(y,r,p);  //отдадим готовые суммированные значения ГИРЫ в эту функцию. А в ней гиру уже не будем считывать!!
	y=0; r=0; p=0;                   // обнулим суммированные значения гиры по осям.
	//omega = dcm.get_gyro();   // закомментировал! и не ругается!
}

APM_DCM.h



void update_DCM(void);
        float           r,p,y; //суммарные значения ГИРЫ, которые мы передаем раз в 4000мс и обнуляем. А суммы накапливаем в супер_быстром_цикле
void update_DCM_fast(float r, float p, float y); //эту функцию вызываем раз в 4000мс из read_AHRS(void) в фаст_лооп

.......

AP_DCM.cpp


AP_DCM::update_DCM_fast(float y,float r,float p)
{
	float delta_t;

	//мы копили ГИРЫ в течении 4000мс, передали их в эту функцию.
        //умножаем на gyro_gain, как это происходит в  ap_adc_ads7844.срр
	_gyro_vector.x  = 0.0012141421*r;   //gyro_gain* axis  from ap_adc_ads7844.h
	_gyro_vector.y  = - 0.0012141421*p;  //gyro_gain* axis  from ap_adc_ads7844.h
	_gyro_vector.z  = -0.0012141421*y;   //gyro_gain* axis  from ap_adc_ads7844.h


	_imu->update();
	//_gyro_vector 	= _imu->get_gyro(); //У НАС УЖЕ ЕСТЬ ГИРА! НЕ будем вызывать. Get current values for IMU sensors
	_accel_vector 	= _imu->get_accel();			// Get current values for IMU sensors

	delta_t = _imu->get_delta_time();  //4000мс - столько мы копили ГИРЫ
        .........

-----------------
Гиру запустил на 500Гц i2c_write(0x15); // register Sample Rate Divider
i2c_write(0x1); // 7: 1000Hz/(1+1) = 500Hz

------------------
static void read_AHRS(void)
{
//omega = dcm.get_gyro(); // закомментировал! и не ругается! Но точно не знаю. У меня только плата. Без моторов и полетов!

--------------
Сделал функцию adc.Ch3(sen, adc_val) - возвращает только Гиру. sen[3] = {0,1,2}; adc_val[3] = {y,r,p};
--------------
Pitch & Yaw надо отдавать со знаком минус. Тогда при вращении Yaw быстро достигается нужное положение за счет согласования Гиры и компаса. Питч - видно по наклонам. Если Yaw отдавать с “+”, то идет рывок в противоположную сторону за счет гиры, а потом доводка компасом в обратную.

nemo61
Sir_Alex:

Выберите “Help” в планере и поставьте в самом низу экрана “Show console” и перезапустите планер. Теперь у вас кроме основного окна, будет еще консоль. Так вот нажимая Ресет в момент подключения, вы там должны увидеть, что ваша Ардуинка пошла на перезагрузку. У меня почему то ресет срабатывает не с первого раза (именно когда MAVLink пытается подцепится, в других случаях ресет отрабатывает нормально)!

Слов нет! Спасибо. Помогло.

SovGVD
Sir_Alex:

я правильно понимаю что он на 10Гц работает???

если 0<<4 это 0000xxxx то на 10гц можно до 1200 Гц поднять =)

Musgravehill

Сократил super_fast_loop до 960 мкс, задал ему частоту 1 кГц. Гира тоже на 1кГц.
Спец функция опрашивает только гиру и суммирует с прошлыми значениями, пока fast_loop не отправит в dcm.fast_update(y,r,p) и обнулит.

Вся фишка в том, что в Планнере угол не доворачивается, все равно. Крен на 90 - поворот картинки на 50-60 градусов. Остальное доводят аксели.
Похоже, гнаться за частотой опроса бесполезно. Или надо что-то придумать, не знаю, что.

Зато с барометром точно разобрался. Сделал рассчет высоты по общепринятой формуле и повысил разрядность переменной, чтобы прыгающий последний разряд был не 1Па, а 0.01 Па. Теперь надо ждать MS5611 =)
--------
Понял, зачем нужно accel_weight = constrain(1 - 3 * fabs(1 - accel_magnitude), 0, 1); // upped to (<0.66G = 0.0, 1G = 1.0 , >1.33G = 0.0)!!!

Когда коптер делает вираж или сильно вибрирует, аксель врет. Он учитывает центробежную силу (и Кориолисову?) или перегрузки от сильной вибрации. Поэтому в этот момент его весовой коэффициент => 0. А когда все спокойно - происходит коррекция горизонта по акселю.
Тут надо экспериментально подобрать ограничения по перегрузкам, чтобы все-таки происходила коррекция по акселю.

nemo61
nemo61:

Решил попробовать MegaPirateNG.2.0.44
При настройке режимов полета в GUI выбираю ALT_HOLD и STABILIZE.
При этом при переключении в консоли вижу AUTO и STABILIZE. Теперь настраиваю через консоль ALT_HOLD и STABILIZE.
В GUI получаю SIMPLE и STABILIZE. Чему верить… В полете еще не проверял.

Продолжаю с Planer 1.0.76. В GUI 1 - STABILIZE, 6 - ALT_HOLD.
При переключении в терминале меняется STABILIZE и SIMPLE.

Sir_Alex
iBat:

Кстати он там представил еще платки для дальнобойной телеметрии (не реклама) www.rcgroups.com/forums/showp...&postcount=460

120 ойро за комплект… ммм… дороговато однако. Коптероводам наверное не нужна такая дальность (5-10км).
Вот что более интересно для нас, так это AllInOne и FreeIMU с новым барометром 😃

SovGVD
iBat:

По просьбе Александра (ака CSG_EU) выкладываю версию 2.0.42

а чего он сам не выложит? у его теперь же есть доступ к проеут MegaPirateNG на гуглокоде

Sir_Alex
SovGVD:

а чего он сам не выложит? у его теперь же есть доступ к проеут MegaPirateNG на гуглокоде

Что то он так и не добавил информацию в вики по BV…
Кстати, было бы неплохо, встроить поддержку BV в текущие наши прошивки… вроде там ничего особого не надо менять.

SovGVD
Sir_Alex:

вроде там ничего особого не надо менять.

там имхо вообще ничего не надо менять, только вот не факт что всякие int gyro|baro подведены

Musgravehill
SovGVD:

только вот не факт что всякие int gyro|baro подведены

Посмотрел код, опрос датчиков не изменился, как и у нас. Только в dcm.cpp delta_time передается внутри каждой функции в виде dcm.function (float _G_dt). Время G_dt = время быстрого цикла. А раньше время интегрирования запрашивалось из IMU при вызове массива датчиков и не зависело от времени основного цикла. Было неудобно менять.