Проект Мегапират на самик!

LeonVS
ukkr:

АрдуПилота для самолётов 28й и 26й версии.

Осталось только портировать ее на нашу железяку 😃

Syberian:

sport.write((byte)(g_gps->ground_speed*0.01));

Залил, сегодня затестимс 😃
К стати кто выключает компас, на автовзлете обязательно отключать удержание курса, иначе очень вероятен краш, ГПС на земле не знает направление, и нос самуля в понимании АП смотрит как правило не по линии взлета, АП начинает по его мнению нос направить по линии взлета, в следствии чего большой крен а на маленькой скорости это смерть 😃

LeonVS

В полях сегодня было свежо 😃 -20 😃 После отключения удержания курса, автовзлет без компаса стал идеальным 😃 Отключил по деревянному, тупо закоментив лишнее 😃
case MAV_CMD_NAV_TAKEOFF:
//if (hold_course > -1) {
// calc_nav_roll();
//} else {
nav_roll = 0;
//}
Теперь просто тупо держит крен в нуле, что и требуется 😃
Исправления Олегом по скорости, так же дали положительный результат 😃 Скачки все равно есть (в некоторых случаях все же кто то перетирает данную переменную…) но в остальное время кажет уже не попугаи, а то что требуется 😃
При -20 за бортом, температура платки в полете опускалась до -3, когда же самуль просто лежит на земле поднималась до +8 +10.
dpiter.info/sky4.wmv

ukkr:
  1. Пофикшен тупой баг в FastSerial.cpp, было _txBuffer->tail = _rxBuffer->head; , а надо было _txBuffer->tail = _txBuffer->head;

А к чему этот баг приводил? Случаем не к ресетам при слабой телеметрии?

Вопрос к гуру аурдино 😃
Где хранятся процедуры в арду? На данный момент интересно тельце вот этой гадости 😃
calc_throttle();

ukkr
LeonVS:

Где хранятся процедуры в арду? На данный момент интересно тельце вот этой гадости
calc_throttle();

Это не Ардуиновская функция. Она находится в MegaPiratePlane\Attitude.pde Это один из самых важных файлов в MegaPiratePlane. Фактически он и выполняет расчёт yaw, pitch, рулит сервами и т.д.

LeonVS:

А к чему этот баг приводил? Случаем не к ресетам при слабой телеметрии?

Эмм, этот ахтунг приводил к тому, что хвост( указатель конца) буффера на трансмит указывал не на начало буффера на тринсмит, а на начало буффера на ресив. Т.е. на данные предназначенные не для передачи, а для приёма. Приводить могло к много чему. К стати, вроде как общение с ОСД в EOSD идёт через тот же FastSerial. Времени пока смотреть нету.

LeonVS

Хм… как же оно тогда сейчас у меня работает??? В каком модуле сие строчка находится?

ukkr

У нас FastSerial от 26й версии, \MegaPiratePlane2.26\libraries\FastSerial\FastSerial.cpp 197я строка. Там этот же баг есть.
А отразиться на функциональности он может только, если дергается соответствующий метода в котором эта строка, flush()

LeonVS

Костя, дай мастер класс 😃 Хочу подрыгать сервой на свободном канале, как в арду задается задержка чтоб не мешать основному коду? Допустим:
Дергаем сервой в одну сторону;
надо сделать задержку в 2 секунды;
дергаем сервой в другую сторону;
?

LeonVS

Можно конечно по деревянному задать переменную плюсовать к ней единицу при каждом цикле, и потом по определенному значению сбрасывать выполняя нужное действо, но может в аурдино это делается как то более цивилизованно 😃?

ukkr

Вопрос к Олегу.
radio.pde
процедура init_rc_out():

static void init_rc_out()
{
	APM_RC.OutputCh(CH_1, 	g.channel_roll.radio_trim);					// Initialization of servo outputs
	APM_RC.OutputCh(CH_2, 	g.channel_pitch.radio_trim);
	APM_RC.OutputCh(CH_3, 	g.channel_throttle.radio_min);
	APM_RC.OutputCh(CH_4, 	g.channel_rudder.radio_trim);

	APM_RC.OutputCh(CH_5, 	g.rc_5.radio_trim);
	APM_RC.OutputCh(CH_6, 	g.rc_6.radio_trim);
	APM_RC.OutputCh(CH_7,   g.rc_7.radio_trim);
	APM_RC.OutputCh(CH_8,   g.rc_8.radio_trim);

	APM_RC.Init();		// APM Radio initialization

	APM_RC.OutputCh(CH_1, 	g.channel_roll.radio_trim);					// Initialization of servo outputs
	APM_RC.OutputCh(CH_2, 	g.channel_pitch.radio_trim);
	APM_RC.OutputCh(CH_3, 	g.channel_throttle.radio_min);
	APM_RC.OutputCh(CH_4, 	g.channel_rudder.radio_trim);

	APM_RC.OutputCh(CH_5, 	g.rc_5.radio_trim);
	APM_RC.OutputCh(CH_6, 	g.rc_6.radio_trim);
	APM_RC.OutputCh(CH_7,   g.rc_7.radio_trim);
    APM_RC.OutputCh(CH_8,   g.rc_8.radio_trim);
}

На кой они тут один и тот же код дважды повторяют? Чё-то я глубинный смысл этого не понимаю.

Леонид. Можно поподробнее, что надо сделать? Т.е., при срабатывании какого-то переключателя на пульте, серва должна повернуться в одну сторону, постоять покурить н-е время, а потом повернуться в другую сторону? Или же этот процесс должен быть постоянным, т.е., на одном из каналов постоянно серва должна работать в крайнее положение–> подождать–> повернуться в другую сторону. И так по циклу, пока пепелац не грохнется?. 😉

LeonVS
ukkr:

пока пепелац не грохнется?

Ага, типа того 😃 Реализовываю срабатывание фотика 😃 В общем то через накопление счетчика можно реализовать, но хочется красиво чтоб было 😃 В общем как в арду сделать задержку без прерывания основного кода программы?

ukkr:

На кой они тут один и тот же код дважды повторяют?

Копи-пасте случайно два раза нажали 😃))))))

ukkr
LeonVS:

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

Ну, это достаточно цивилизованно. Влепить в MegaPiratePlane.pde в функцию one_second_loop() что-то вида

  if(xxx_wait>2){
          xxx_pos=xxx_pos*sign;//change servo direction
          xxx_wait=0;
  }else{
          xxx_wait++;
  }
  g.rc_8.closest_limit(xxx_pos);

Вместо g.rc_8 – нужный вам канал.
Ну и в самом MegaPiratePlane.pde вверху объявить переменные

int16_t xxx_pos=1800;//angle*10 deg
int xxx_wait=0;
int16_t sign=-1;

Проверить не могу, на работе ща.

LeonVS

На ардупилоте все же реализовали то что я хочу 😃
diydrones.com/…/full-autonomous-slope-soaring-with…

ukkr:

Влепить в MegaPiratePlane.pde в функцию one_second_loop() что-то вида

А можно для особо одаренных описать каждую строчку 😃? Читот я тут половины не понял…

ukkr
LeonVS:

На ардупилоте все же реализовали то что я хочу

А Вы планерист? А то я в Термопилоте по фичам кроме авто-поиска термиков ничего принципиально нового не нашёл.

LeonVS

Надо срочно портировать v2.28ThP5 прошивку 😃

Ага, есть немного 😃 Хотел сам попытаться переделать режим FBW_B в режим поиска термо, алгоритм то в общем элементарный 😃

ukkr
LeonVS:

А можно для особо одаренных описать каждую строчку ? Читот я тут половины не понял…

Смотрите, в MegaPiratePlane.pde есть основная функция

 void loop()

которая дёргает 3 основные подцикла.

fast_loop();

– для тайм-критикл вещей типа считывание команд с радио, расчёт DCM и т.д. Второй подцикл

medium_loop()

– для менее критических вещей. Ну и 3й подцикл

one_second_loop() 

– дёргается ориентировочно раз в секунду. Вот в этот цикл я и предлагаю вставить код для управления определённым каналом:

 if(xxx_wait>2){//если мы уже прождали больше 2х секунд
          xxx_pos=xxx_pos*sign;//изменить направление сервы на противоположное
          xxx_wait=0;//обнулить счётчик, сколько секунд мы стоим в текущем положении
  }else{
          xxx_wait++;//увеличить счётчик, сколько секунд мы стоим в текущем положении на 1 сек
  }
  g.rc_8.closest_limit(xxx_pos);//вызываете у нужного вам канала установку положения в градусах*10. Метод closest_limit принимает градусы*10, если правильно помню. Вместо g.rc_8 -- нужный вам канал

int16_t xxx_pos=1800;//angle*10 deg

– изначально серва на 180 градусов повёрнута. Ставьте на любой нужный вам угол. Через 2 секунды оно повернётся в положение -180. Я бы начал с небольщих углов (45*=450)для проверки, чтоб не попалить серву.

int xxx_wait=0;

//сколько секунд мы уже ждём в последнем положении

int16_t sign=-1;

//просто константа, на неё домножается текущее положение, чтоб повернуть серву в противоположную сторону каждые 2 секунды.

LeonVS
ukkr:

one_second_loop()

Кость, не совсем въезжаю как понять где начало, а где конец данного цикла?
static void one_second_loop() - начало?
А где конец? до конца кода идет все этот подцикл?
Опять же странность… если это так, ниже идет обновление данных ГПС
static void update_GPS(void) - зачем тогда ставят 10Гц модули если обновление идет раз в секунду???

ukkr

Леонид, если не против я на “ты” перейду. Возраст у нас почти одинаковый, а с “Вы”-канием много не объяснишь.

Смотри, вот вся функция этого лупа

static void one_second_loop()
{

	// send a heartbeat
	gcs_send_message(MSG_HEARTBEAT);
    gcs_data_stream_send(1,3);
    if(()!=g.sensor_cal_x) (g.sensor_cal_x);
    if(imu.ay()!=g.sensor_cal_y) imu.ay(g.sensor_cal_y);
}

Всё остальное – совсем другие функции; к этому лупу отношения не имеют.

Модифицированная функция этого лупа будет выглядеть приблизительно так:

static void one_second_loop()
{

if(xxx_wait>2){
          xxx_pos=xxx_pos*sign;//change servo direction
          xxx_wait=0;
  }else{
          xxx_wait++;
  }
  g.rc_8.closest_limit(xxx_pos);
// send a heartbeat
gcs_send_message(MSG_HEARTBEAT);
gcs_data_stream_send(1,3);
if(()!=g.sensor_cal_x) (g.sensor_cal_x);
if(imu.ay()!=g.sensor_cal_y) imu.ay(g.sensor_cal_y);
}
LeonVS
ukkr:

если не против я на “ты” перейду

Буду только рад 😃

ukkr:

Смотри, вот вся функция этого лупа

Теперь все ясно 😃

LeonVS

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

ukkr

Ха, так а кода то и не видно. Закрытый какой-то это форк.
А про фичу поиска термика я в описалове нашёл:

" The ThermoPilot is a full enhancement of the ArduPlane v2.28 which adds the Thermal Hunting capabilitie and some others features for the gliders pilots. "

отсюда diydrones.com/…/full-autonomous-slope-soaring-with…

Есть сырцы этого самого Термопилота, но по дате уж больно старые: code.google.com/p/ardupilotdev/…/Thermopilot

LeonVS

Код к стати запустил, усе пашет как полагается, СПАСИБ за ликбез 😃 Правда исполняемую команду пришлось подшаманить, твоя не заработала, ну и еще добавил чтоб эта фишка включалась только в режиме авто 😃 Дрыгает выходом М7, М8 у меня отдан на закрылки 😃

if(control_mode == AUTO){
if(xxx_wait>2){
xxx_pos=xxx_pos*sign; //change servo direction
xxx_wait=0;
}else{
xxx_wait++;
}
//g.rc_7.closest_limit(xxx_pos);
APM_RC.OutputCh(9, xxx_pos);
}

К стати есть мысли как ему принудительно в любое время врубить режим CIRCLE, тобишь аварийный режим посадки с кружением и выключением двигла?
Суть сие действа в следующем, летит самуль по маршруту, тут по какой то причине захотелось чтоб оно летело на базу в срочном порядке, врубаем РТЛ оно летит, но по прилету АП будет тупо кружить пока не сдохнет батарейко, а хотелось бы его заставить сесть, но не в ручном режиме, а все же на автомате 😃 В общем надо или вызвать LAND, с координатами что прописаны в конце миссии, или чего вполне было бы достаточно режим CIRCLE.

К стати походу где то еще надо крутнуть для безглючности прошивки… из доп выходов адекватными являются только 7 и 8, на 5 и 6 хаотичное дикое дерганье сервы… Команду видит, но дико дергается в районе заданного положения…

И еще обнаружил косяк… думал прицепить бароскорость, но не на одном аналоговом входе данные не идут… Походу в ардупилоте с пиратом в аналоге совпадает только 1 порт с которого берется вольтаж АКБ…

ukkr

Леонид,

Смотреть в полноэкранном режиме надо, канал 6
Код – тот же, что я копировал, только чуть лучше, убрано умножение на sign. Вы у себя можете точно также соптимизировать.

 if(xxx_wait>2){
          xxx_pos=-xxx_pos;//change servo direction
          xxx_wait=0;
  }else{
          xxx_wait++;
  }
  g.rc_6.closest_limit(xxx_pos);

Леонид, сорри за нубский вопрос, а как заставить эту Чёрного Пирата подёргать сервами? Я в какой “М” серву не втыкал, но Пират даже не думает начинать дёргать сервами. При том, что подключен на вход ему и приёмник и на АРМ Планёре смотрю, на каналах в channel_XX_in циферя от моего радио бегут. А вот на Мки оно нифига не шлёт. Должен же он рулить yaw,pitch и т.д. просто после включения? Или ему надо скормить миссию какую-то или в режим какой перевести? А то хотел проверить, чего

исполняемую команду пришлось подшаманить, твоя не заработала

, ведь в показометре у меня на 6м канале всё чётко в АРМ Планёре, а в реальности ты говоришь дохлый номер.