Здравствуйте всем! Руководство поручило разобраться в структуре и командах 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			//
			
			
									
						
										
						Структура fly-файла
- 
				Crazy
- Новоприбывший
- Сообщения: 7
- Зарегистрирован: 12 май 2010, 10:21
- Репутация: 0
- Mavka
- Гуру
- Сообщения: 2060
- Зарегистрирован: 14 мар 2008, 17:36
- Репутация: 9
Re: Структура fly-файла
Как программист могу предположить:
return - окончание подпрограммы
thread - подпрограмма, которая выполняется параллельно основной; т.е. у вас есть основной поток - откуда/куда лететь, и попутно выполнять фотосъемку и записывать время
Ждать пока выполняется условие
waitequal [что],с_чем - равно (==)
waitlessthan [что],с_чем - меньше (<)
waitgreaterthan [что],с_чем - больше (>)
Аналогичные условные операторы со skip* видимо значат "если условие выполняется, то перескочить (не выполнять) команду в следующей строке".
wait - таймер, задержка на сколько то секунд (?)
Я бы прочитал так:
Создаем переменную с именем 1238 с начальным значением 0, ждем пока высота меньше 50 (и ничего в это время не делаем), кладем 1238 в стэк, прибавляем 1, достаем (т.е. "1238" = "1238" + 1), ждем 3 сек, повторяем последние 4 строки (как бы прыжок goto на 4 назад к push [1238]).
Операции со стеком легче понять если вспомните калькулятор Электроника МК-61
			
			
									
						
							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

лангольеры под окном жрали время ом-ном-ном
			
						- 
				EXP
- Интересующийся
- Сообщения: 48
- Зарегистрирован: 21 июл 2009, 16:53
- Репутация: 0
- Контактная информация:
Re: Структура fly-файла
К сожалению, я далеко не программист, но как писал автор выше, это файл полета с непрерывной (с заданым интервалом) съемкой, в файле с заданным базисом фотографирования в каждой путевой точке (кроме разворотных) стоит команда "серво 8"-это команда на ИК-диод фотокамеры (в лог-файле любая цифра отличная от нуля)
			
			
									
						
										
						- amir
- Активный участник
- Сообщения: 108
- Зарегистрирован: 26 янв 2010, 21:41
- Репутация: 25
- Откуда: Moscow
- Контактная информация:
Re: Структура fly-файла
[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 //??????
			
			
									
						
										
						Если посмотреть в мануал, на стр. 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-файла
И что у Вас за мануал? В Микропилотовском это все описано... И команды и поля и т.д. и т.п.
Может быть при покупке CropCam выдавался какой-то усеченный вариант? Чтобы пользователь не напортачил чего-нибудь...
			
			
									
						
										
						Может быть при покупке CropCam выдавался какой-то усеченный вариант? Чтобы пользователь не напортачил чего-нибудь...
- 
				EXP
- Интересующийся
- Сообщения: 48
- Зарегистрирован: 21 июл 2009, 16:53
- Репутация: 0
- Контактная информация:
Re: Структура fly-файла
Амир Вильевич !, 5+!, аплодирую стоя!, вот "разложил все по полочкам".... , даже фотограмметрист все понял!
			
			
									
						
										
						- 
				Crazy
- Новоприбывший
- Сообщения: 7
- Зарегистрирован: 12 май 2010, 10:21
- Репутация: 0
Re: Структура fly-файла
Мануал есть, только он на английском, а в английском я не очень  Что смогли, то перевели. Огромное спасибо за разъяснения)
 Что смогли, то перевели. Огромное спасибо за разъяснения)
			
			
									
						
										
						 Что смогли, то перевели. Огромное спасибо за разъяснения)
 Что смогли, то перевели. Огромное спасибо за разъяснения)Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей

