ArduCopter Mega: порт на обычную Arduino (тестим)
1.0.54
Надо бы 1.0.74. Чтобы запускался, надо установить НетФрамеворк версии 3,5
Примечание 5 - Планер надо использовать последний (1.0.74)
Пост 2883
спасибо за ответы,
у меня даже дух сперло, думаю малоли опенсорц софт да мало ли сделали привязку к железу, а я тут построил “мегапланы” по стимулированию в РФ самостоятельной сборки (технологии, инструкции, помощь в поиске комплектухи и совместный заказ печатных плат) доколе то китайское покупать будем?
посему ищутся единомышленники 😃
сначала закончу ардупилот и иму v2 потом можно и коптеровскую плату сделать, тем более с самолем я очень плохо дружу даже со стабилизацией 😃 , я больше по электронной части, а квс у меня женька- сосед.
трикоптер буду собирать обязательно и уже есть задумка что он будет иметь простейшее управление шагом винта - без перекоса на каждом из винтов (чтобы обеспечить стабильность во всех режимах)
А расскажите поподробнее про свои “мегапланы”. В чем задумка? А там м.б. и единомышленники подтянутся 😃
Надо бы 1.0.74. Чтобы запускался, надо установить НетФрамеворк версии 3,5
Там сейчас 1.0.76. Запустился, но пока не могу подключиться. Точнее в log/setup mode цепляется.
не могу подключиться
Только что проверил. Все нормально подключается
Только что проверил. Все нормально подключается
На 1.0.76 не получается. Не могу найти 1.0.74. Подскажите.
Не могу найти 1.0.74. Подскажите
На 1.0.76 не получается. Не могу найти 1.0.74. Подскажите.
Если вы подключаетесь по USB, то когда в планере нажимаете “Connect”, сделайте Reset Ардуины. Mavlink при подключении по USB коннектиться только в самом начале работы ардуины, потом переходит на порт телеметрии. Я точно не помню, в старых планерах, происходил или нет автоматический Reset фрдуины при подключении…
Если вы подключаетесь по USB, то когда в планере нажимаете “Connect”, сделайте Reset Ардуины. Mavlink при подключении по USB коннектиться только в самом начале работы ардуины, потом переходит на порт телеметрии. Я точно не помню, в старых планерах, происходил или нет автоматический Reset фрдуины при подключении…
Не помогло.
Вообще не могу понять! В 1.0.74 не могу, 1.0.76 не могу, а в 1.0.54 подключаюсь!
А расскажите поподробнее про свои “мегапланы”. В чем задумка? А там м.б. и единомышленники подтянутся 😃
Почему в китае делают а у нас нет? Чем мы хуже?
собрать народ и каждый что может кто детали подбирает, кто платы клепает, у кого есть выходы на штучный робомонтаж, или помочь кому нить в провинцию выслать комплект плата + детали и не как в мастерките а чтоб дешевле чем если собирать по детальке самому (изза опта).
личные задумки
-сделать ардупилот отработать его на модели, посмотреть как он с автономной посадкой,
доработать и поковырятся
-сделать наземную станцию не только пульт телеметрии но и кгс , предачу давления и коррекции gps координат впп в автомате на борт
ну и совсем думки дурачка -фантаста: сделать грузовой самоль, чтоб сбрасывал на парашюте заказы по мособласти )) представляете ардупилот который развозит ардупилоты вместо курьера
Почему в китае делают а у нас нет? Чем мы хуже?
собрать народ и каждый что может кто детали подбирает, кто платы клепает, у кого есть выходы на штучный робомонтаж, или помочь кому нить в провинцию выслать комплект плата + детали и не как в мастерките а чтоб дешевле чем если собирать по детальке самому (изза опта).личные задумки
-сделать ардупилот отработать его на модели, посмотреть как он с автономной посадкой,
доработать и поковырятся
-сделать наземную станцию не только пульт телеметрии но и кгс , предачу давления и коррекции gps координат впп в автомате на бортну и совсем думки дурачка -фантаста: сделать грузовой самоль, чтоб сбрасывал на парашюте заказы по мособласти )) представляете ардупилот который развозит ардупилоты вместо курьера
Задумки здравые. Есть сильно пересекающийся с вашими задумками проект - OpenPilot.
Не помогло.
А прошивку перезалить?
Не помогло. Вообще не могу понять! В 1.0.74 не могу, 1.0.76 не могу, а в 1.0.54 подключаюсь!
Выберите “Help” в планере и поставьте в самом низу экрана “Show console” и перезапустите планер. Теперь у вас кроме основного окна, будет еще консоль. Так вот нажимая Ресет в момент подключения, вы там должны увидеть, что ваша Ардуинка пошла на перезагрузку. У меня почему то ресет срабатывает не с первого раза (именно когда MAVLink пытается подцепится, в других случаях ресет отрабатывает нормально)!
Удалось считывать с гиры показания x,y,z в супер_быстром_цикле 500Гц и отдавать в dcm.update_fast(x,y,z);
Продолжаю копаться.
Продолжаю копаться.
а где код? теперь горизонт не уплывает?
Удалось считывать с гиры показания x,y,z в супер_быстром_цикле 500Гц и отдавать в dcm.update_fast(x,y,z); Продолжаю копаться.
А у меня какая то ерундень… Вроде задействовал 1КГц у гиры, читаю с помощью INT Gyro и суммирую показания. DCM Обновляется на 250Гц. Без акселя, вроде с большего гира правильно показывает, а если включить аксель то какой то неадекват… поворачиваешь коптер на 90 гр, он сразу становится на 90, а потом начинает плыть обратно. Хотя показания акселя то же верные… в общем, я в непонятках, что не так…
поворачиваешь коптер на 90 гр, он сразу становится на 90, а потом начинает плыть обратно.
имхо аксель задушен сильно, когда игрался с кастомными датчиками такой же косяк был - сильновато поделил аксель и в итоге гира сразу показывала, а потом корретировалась задушенным акселем (уезжал обратно)
имхо аксель задушен сильно, когда игрался с кастомными датчиками такой же косяк был - сильновато поделил аксель и в итоге гира сразу показывала, а потом корретировалась задушенным акселем (уезжал обратно)
Если я правильно понимаю процесс, то с точки зрения DCM ничего не должно было изменится. Я считываю показания гиры в 4 раза быстрее, сам усредняю и отдаю в DCM как будто гира работает на 250Гц…
Кстати, посмотрите кто нибудь код инициализации акселя, я правильно понимаю что он на 10Гц работает???
а где код?
Горизонт теперь уплывает быстро! Это говорит о том, что идет частый опрос гиры (и ошибка интегрирования растет быстрее). Аксель отключил. 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 отдавать с “+”, то идет рывок в противоположную сторону за счет гиры, а потом доводка компасом в обратную.
Выберите “Help” в планере и поставьте в самом низу экрана “Show console” и перезапустите планер. Теперь у вас кроме основного окна, будет еще консоль. Так вот нажимая Ресет в момент подключения, вы там должны увидеть, что ваша Ардуинка пошла на перезагрузку. У меня почему то ресет срабатывает не с первого раза (именно когда MAVLink пытается подцепится, в других случаях ресет отрабатывает нормально)!
Слов нет! Спасибо. Помогло.
я правильно понимаю что он на 10Гц работает???
если 0<<4 это 0000xxxx то на 10гц можно до 1200 Гц поднять =)
Сократил 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. А когда все спокойно - происходит коррекция горизонта по акселю.
Тут надо экспериментально подобрать ограничения по перегрузкам, чтобы все-таки происходила коррекция по акселю.