Структура fly-файла

Ответить
Crazy
Новоприбывший
Сообщения: 7
Зарегистрирован: 12 май 2010, 10:21
Репутация: 0

Структура fly-файла

Сообщение Crazy » 12 май 2010, 10:36

Здравствуйте всем! Руководство поручило разобраться в структуре и командах fly-файла. Часть команд понять получилось, но остались вопросы, в мануале по автопилоту ответа на них не нашла. Ниже привожу текст fly-файла с пояснениями напротив каждой команды, где смогла разобраться, и со знаками вопроса там, где нуждаюсь в помощи.

metric //единицы измерения
takeoff //команда взлета
climb 350 //высота полета 350 метра
waitclimb 50 //ждать наборы высоты 50 метров

flyto (1225,-273) //путевая точка
flyto (1191,-294) //путевая точка
fromto (1123,-337) //путевая точка
fromto (921,-466) //путевая точка
[1239] = 1 //???????

fromto (152,-953) //путевая точка
fromto (-639,-1484) //путевая точка
fromto (-1256,-1917) //путевая точка
fromto (-1592,-2123) //путевая точка
fromto (-1798,-2177) //путевая точка
fromto (-2275,-2166) //путевая точка
fromto (-2914,-2090) //путевая точка
fromto (-3033,-2069) //путевая точка
fromto (-3650,-2015) //путевая точка
[1239] = 0 //??????

flyto (-4010,-2015) //путевая точка
flyto (-3970,-2015) //путевая точка
fromto (-3890,-2015) //путевая точка
fromto (-3650,-2015) //путевая точка
[1239] = 1 //??????

fromto (-3628,-2015) //путевая точка
[1239] = 0 //??????

climb 100 //высота полета 100 метров
flyto [home] //лететь в точку взлета
[1461] = 7 //??????
wait 3 //??????
[fServo8] = 32767 //??????
wait 4 //??????
[fServo8] = 0 //??????

[6505] = 0 //??????
circuit //команда посадки
return //??????

fixed //??????

thread 1 //??????
[1239] = 0 //??????
[1240] = 0 //??????
[1236] = 262 //camera interval (feets) //??????
waitequal [1239], 1 //??????
[1235] = [1453] //assign current distance travelled //??????
waitgreaterthan [1453], [1235] //wait until its time to take a picture //??????
[1461] = 7 //force wings level (time is units) //??????
wait 3 //??????
[fServo8] = 32767 //??????
wait 4 //??????
[fServo8] = 0 //??????
push [1235] //put distance travelled on stack //??????
add [1236] //add camera interval to stack //??????
pop [1235] //put new distance back //??????
push [1240] //??????
add 1 //??????
pop [1240] //??????
skipequal [1239], 0 //??????
repeat -13 //??????
repeat -16 //??????

thread 2 //records flight time //??????
push 0 //??????
pop [1238] //??????
waitlessthan [currentAltitude], 50 //??????
push [1238] //??????
add 1 //??????
pop [1238] //??????
wait 3 //??????
repeat -4 //??????

//land //алгортим посадки
definepattern 0 //
climb 100 //
flyto [home] //
circuit //
return

//manually take a picture //алгоритм получения снимка
definepattern 1 //
[fServo8] = 32767 //
wait 4 //
[fServo8] = 0 //
return //

//perform a right hand circuit //подготовка к посадке
definepattern 2 //
[6505] = 0 //
return //

pattern EngineFailed //алгортим поведения при неисправности двигателя
[elDrivesAlt]=0 //
flyto [home] //
[stopEngine]=1 //
turn [runwayDirection] //
climb 0 //
wait 999999 //

pattern gpsFailed //алгортим поведения при неисправности gps
setControl rollFixed, 0 //
wait 50 //
setControl thFixed, 0 //
wait 999999 //

pattern batVFailed //алгортим поведения при неисправности батарей
[elDrivesAlt]=0 //
flyto [home] //
[stopEngine]=1 //
turn [runwayDirection] //
climb 0 //
wait 999999 //

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Структура fly-файла

Сообщение Mavka » 12 май 2010, 11:08

Как программист могу предположить:
return - окончание подпрограммы
thread - подпрограмма, которая выполняется параллельно основной; т.е. у вас есть основной поток - откуда/куда лететь, и попутно выполнять фотосъемку и записывать время

Ждать пока выполняется условие
waitequal [что],с_чем - равно (==)
waitlessthan [что],с_чем - меньше (<)
waitgreaterthan [что],с_чем - больше (>)

Аналогичные условные операторы со skip* видимо значат "если условие выполняется, то перескочить (не выполнять) команду в следующей строке".

wait - таймер, задержка на сколько то секунд (?)

Код: Выделить всё

thread 2 //records flight time //??????
push 0 //??????
pop [1238] //??????
waitlessthan [currentAltitude], 50 //??????
push [1238] //??????
add 1 //??????
pop [1238] //??????
wait 3 //??????
repeat -4 //??????    
Я бы прочитал так:
Создаем переменную с именем 1238 с начальным значением 0, ждем пока высота меньше 50 (и ничего в это время не делаем), кладем 1238 в стэк, прибавляем 1, достаем (т.е. "1238" = "1238" + 1), ждем 3 сек, повторяем последние 4 строки (как бы прыжок goto на 4 назад к push [1238]).

Операции со стеком легче понять если вспомните калькулятор Электроника МК-61 :roll:
лангольеры под окном жрали время ом-ном-ном

EXP
Интересующийся
Сообщения: 48
Зарегистрирован: 21 июл 2009, 16:53
Репутация: 0
Контактная информация:

Re: Структура fly-файла

Сообщение EXP » 12 май 2010, 14:44

К сожалению, я далеко не программист, но как писал автор выше, это файл полета с непрерывной (с заданым интервалом) съемкой, в файле с заданным базисом фотографирования в каждой путевой точке (кроме разворотных) стоит команда "серво 8"-это команда на ИК-диод фотокамеры (в лог-файле любая цифра отличная от нуля)

Аватара пользователя
amir
Активный участник
Сообщения: 108
Зарегистрирован: 26 янв 2010, 21:41
Репутация: 25
Откуда: Moscow
Контактная информация:

Re: Структура fly-файла

Сообщение amir » 15 май 2010, 17:52

[1239]=1 или [1239]=0 - прямая запись значения в так называемое "поле". "Полями" в Микропилоте называют ячейки памяти, отвечающие за работу Микропилота.
Если посмотреть в мануал, на стр. 190 в разделе Servo & Flight Control Fields написано, что поля с 1227 по 1258 отвечают за Fine Servo positions. Это 32 поля, первые 24 из которых отвечают за 24 рулевые машинки, с 1 по 24. 1239-1227+1= 13, т.е. это поле, отвечающее за рулевую машинку S13. Насколько я понимаю, для CropCam дается только одна серво-плата, значит это поле используется просто как переменная, в данном случае для работы параллельно используемого процесса (thread), в котором используется это поле при управлении фотокамерой. .

[1461] - поле, отвечающее за полет без крена в течении n*0.2 сек. Т.е. если этому полю присвоить какое-то значение, например 7, как в данной программе, то в течении 7*0.2=1.4 сек крен самолета будет удерживаться равным 0, независимо от того, какой крен хочет удерживать автопилот. Потом сам автопилот обнуляет это поле.

wait 3 - ничего не делать в течении n*0.2 сек, в данном случае 0.6 сек дается самолету на то, чтобы стабилизироваться с креном 0 градусов.

[fServo8] = 32767 // Если это серво выпуска парашюта, т.е. дается команда на max отклонение серво. Хотя из дальнейших комментариев видно, что эта серва отвечает за фотокамеру.

wait 4 // серво удерживается на максимальном отклонении 0.8 секунды.

[fServo8] = 0 //Возвращает парашютную серву в исходное положение.

[6505] = 0 // заход на посадку для первой (нулевой для Микропилота) ВПП с правым разворотом (т.е. коробочка исполняется всегда с поворотом направо)

circuit //команда посадки

return //это команда завершения подпрограммы (pattern) в микропилоте. Судя по положению команды, кусок fly-файла вырван из контекста, потому что все описанное должно содержаться в паттерне. Не вижу начала паттерна.

fixed //все команды и программы после этого оператора не могут быть удалены из памяти, даже при перепрограммировании в полете.

thread 1 //Объявление первого параллельного потока вычислений, которые в Микропилоте называются thread. Один маленький нюанс. Если это 2028, то треды практически не работают из-за низкого быстродействия самого автопилота. Треды работают только в 2128.

[1239] = 0 //инициализация поля (см. выше) в нулевое значение, чтобы тред при включении не включил фотокамеру
[1240] = 0 //тоже использование свободного поля под переменную.
[1236] = 262 //camera interval (feets) //аналогично, только тут задали интервал для фотографирования. Программист обозначил, что это число в футах. После пролета этого расстояния камера фотографирует, счетчик дальности обнуляется, далее опять через 262 фута фотографировать. Если его менять, то фотографирование будет выполняться через другой интервал.

waitequal [1239], 1 //ничего не выполнять дальше, пока поле [1239] не примет значение, равное 1 (это делает нулевой тред, по которому автопилот управляет полетом)

[1235] = [1453] //assign current distance travelled //В поле [1235] записывается пройденное к этому моменту расстояние (оно постоянно обновляется в поле [1453]).

waitgreaterthan [1453], [1235] //тред ничего не делает, пока поле [1453] не станет больше поля [1235]. Далее будет понятно, что тред записывает в ячейку 1235 текущее пройденное расстояние плюс интервал фотографирования. В каждый следующий момент 1453 непрерывно увеличивается, пока не достигнет нового вычисленного значения. Как только "долетит", тут же срабатывает кусок программы дальше, выполняя фотографирование.

take a picture //Почему этот текст без двух слешей перед ним? Микропилот этого не понимает и fly-файл должен выдавать ошибку. Этот текст может быть только комментарием.

[1461] = 7 //force wings level (time is units) //убирается крен на 0.2*7=1.4 секунды.

wait 3 // Пауза на 0.6 секунд, чтобы крен стабилизировался в 0.

[fServo8] = 32767 //Это команда на срабатывание фотокамеры. Непонятно, почему и выпуск парашюта (см. ранее) и срабатывание фотокамеры управляется одной рулевой машинкой. Разве что при долете домой камера фотографирует точку старта...

wait 4 // 0.8 секунд жмется кнопка фотокамеры.

[fServo8] = 0 //Кнопка фотокамеры отпускается.

push [1235] //put distance travelled on stack //В верхнюю ячейку стека записывается пройденное расстояние из 1235.

add [1236] //add camera interval to stack //К верхнему значению стека прибавляется расстояние фотографирования.

pop [1235] //put new distance back //В поле 1235 "выталкивается" верхняя ячейка стека, в котором вычислен значение пройденного пути, при котором должен сработать фотоаппарат.

push [1240] //Это счетчик кадров. Он сначала записывается в верхнюю ячейку стека,

add 1 // потом к нему прибавляется 1,

pop [1240] // и увеличенное на 1 значение снова "выталкивается" в свою переменную.

skipequal [1239], 0 //Если в поле 1239 записан 0, то следующая команда (repeat -13) пропускается и выполняется (repeat -16), которая возвращает точку исполнения треда на 16 строк выше к команде ожидания новой линии фотографирования. Если же поле 1239=1, то цикл фотографирования повторяется с команды waitgreaterthan [1453], [1235]

repeat -13 // см. выше комментарий к skipequal [1239], 0

repeat -16 // см. выше комментарий к skipequal [1239], 0

В треде 2 записан алгоритм подсчета времени полета в секундах, если самолет набрал высоту 50 м. В стек записывается число 0, затем это значение "выталкивается" в переменную 1238. Далее ждется, пока самолет не наберет высоту 50 метров (в начале программы стоит metric). Как только взлетит выше 50 метров, значение из переменной записывается в стек, к нему прибавляется 1 и снова выталкивается в переменную, дальше ждут 0.6 секунды и процесс повторяется. Видимо 0.4 секунды уходит на исполнение. Таким образом в ячейке 1238 пишется время полета в секундах. Видимо эта ячейка отображается где-то на экране.

thread 2 //records flight time //??????
push 0 //??????
pop [1238] //??????
waitlessthan [currentAltitude], 50 //??????
push [1238] //??????
add 1 //??????
pop [1238] //??????
wait 3 //??????
repeat -4 //??????

Аватара пользователя
amir
Активный участник
Сообщения: 108
Зарегистрирован: 26 янв 2010, 21:41
Репутация: 25
Откуда: Moscow
Контактная информация:

Re: Структура fly-файла

Сообщение amir » 15 май 2010, 18:00

И что у Вас за мануал? В Микропилотовском это все описано... И команды и поля и т.д. и т.п.
Может быть при покупке CropCam выдавался какой-то усеченный вариант? Чтобы пользователь не напортачил чего-нибудь...

EXP
Интересующийся
Сообщения: 48
Зарегистрирован: 21 июл 2009, 16:53
Репутация: 0
Контактная информация:

Re: Структура fly-файла

Сообщение EXP » 17 май 2010, 19:52

Амир Вильевич !, 5+!, аплодирую стоя!, вот "разложил все по полочкам".... , даже фотограмметрист все понял!

Crazy
Новоприбывший
Сообщения: 7
Зарегистрирован: 12 май 2010, 10:21
Репутация: 0

Re: Структура fly-файла

Сообщение Crazy » 18 май 2010, 10:22

Мануал есть, только он на английском, а в английском я не очень :oops: Что смогли, то перевели. Огромное спасибо за разъяснения)

Ответить

Вернуться в «Беспилотники»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 18 гостей