powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / AR.Drone квадрокоптер. Программирование на java и С
25 сообщений из 92, страница 2 из 4
AR.Drone квадрокоптер. Программирование на java и С
    #38004828
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы пилоты
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38004835
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erbolgМы пилотыну, это да
но всё равно
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38016941
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполняю проверку битов состояния drone

Бит MYKONOS_TRIM_COMMAND_MASK почему то всегда равен единице, но это в общем и не мешает нормальной работе с вертолетом.

Еще бывает такое, что сокет принимающий сообщения с порта 5554 (NavData) не может этого сделать. Закрываю периодически оба сокета (на передачу команд в порт 5556 и на прием навигационных данных 5554), открываю снова - результата никакого
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38017020
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот сервис для перевода десятичных чисел в формат IEEE-754

For online conversion do this:
http://users.minet.uni-jena.de/~sack/SS04/download/IEEE-754.html
enter the value (0.2) and press rounded
take the hexadecimal result (3E4CCCCD) and convert it to decimal. Thats the value :D
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38018187
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что drone имеет свой SDK это конечно большой плюс. Это избавляет программиста от необходимости изучать конкретное устройство сенсоров и моторов вертолета , не надо знать какие сигналы управляют этими устройствами и какие сигналы используются для передачи информации с сенсоров, и конечно не надо беспокоится о правильной интерпретации этих сигналов.

SDK это своего рода драйвер который берет на себя все общение с аппаратами устройства. Общаться с таким драйвером можно с помощью абстрактной модели устройства которую он создает для пользователя.

Например: прочитать, удалить , записать информацию на устройство.

Удобство использования SDK основано на хорошем описании модели устройства, гибкости модели и так далее.

Описание SDK drone не сказать что хорошее. Приходится сидеть на форумах чтобы определять те абстракции которые он использует для обмена данными с клиентом

За время работы с drone определил, что пакет навигационных данных в режиме demo имеет длину 500 байт.

В случае если что то идет не так, то drone может присылать пакет длиной 32 и 24 байта

Если пакет имеет длину 24 байта это означает что порт 5554 находится в режиме BOOTSTRAP и необходимо заново подсоединится к порту чтобы перевести его режим Demo

drone может передавать клиенту навигационные данные в двух формах

1. Сокращенной или demo, размер 500 байт
2. Полной

Чтобы получать demo версию данных надо отправить на порт 5554 сначала четыре байта 0x01, 0x00, 0x00, 0x00, а затем на порт 5556 команду

AT*CONFIG="+(seq++)+",\"general:navdata_demo\",\"TRUE\"

где seq - порядковый номер команды

Мне представляется такая логика поведения drone. Постоянно прослушивается порт 5554 на предмет получения сигнала прерывания (четыре байта - 0x01, 0x00, 0x00, 0x00). После того как сигнал прерывания получен drone, он ждет команды определяющей формат навигационных данных, типа так

AT*CONFIG="+(seq++)+",\"general:navdata_demo\",\"TRUE\"

Эту команду надо послать на порт 5556
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38023223
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Философия общения с drone

Так как для общения с вертолетом используется udp протокол, разработчик должен сам побеспокоится о надежной доставке своих сообщений. Лучшее что приходит в голову это дублирование важных сообщений.

Допустим если мы хотим посадить вертолет то надо отправить соответствующую команду несколько раз. Допустим так:


Код: java
1.
2.
3.
4.
5.
send("AT*PCMD=" + (seq++) + ",0,0,0,0,0");
Thread.sleep(INTERVAL);
send("AT*REF=" + (seq++) + ",290717696");
send("AT*REF=" + (seq++) + ",290717696");
Thread.sleep(INTERVAL);



В том смысле, что если вероятность попадания одной ракеты в цель - 0.9, то две ракеты сбивают эту цель с вероятностью - 0.99

Команда AT*PCMD=" + (seq++) + ",0,0,0,0,0 говорит drone, что надо зависнуть в одной точке
Команда AT*REF=" + (seq++) + ",290717696 говорит, что надо совершить посадку в режиме авторотации. Дублируем ее для верности.

Thread.sleep(INTERVAL); задает временной интервал между отправкой команд. Разработчики говорят что задержка в 30 мс улучшает выполнение команд веротолетом
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38024294
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблемы с вертолетом (AR.Drone). Даю команду вращаться вокруг вертикальной оси, а он движется по прямой. Почему, не знаю

Но это не проблема калибровки, по моему. Под управлением AR.FreeFlight летает нормально.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38025804
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще о движении

Команда AT*PCMD используется для определения скорости движения в разных направлениях. Она имеет шесть аргументов. Каждый их них имеет имя - sequence numberб flag, roll, pitch, gaz, yaw

Первый аргумент - порядковый номер команды. Для его определения при запуске программы инициализируем переменную целого типа и далее в каждой команде отправляемой вертолету на порт 5554 просто выполняем инкремент этой величины, то есть увеличиваем ее на единицу

Далее, второй аргумент. AR.Drone Developer Guide, p. 36. С помощью этого аргумента задается способ пилотирования вертолета.

Я знаю пока только два - обычный и так называемый "Абсолютный контроль". Способ вождения "абсолютный контроль" удобен тем, что направление перемещения ручки джойстика совпадает в реальным перемещением вертолета, независимо от того каким боком он находится по отношению к пилоту.

flag это 32-х значное двоичное число. Для задания способа пилотирования используется три младших бита. Относительно нулевого бита в руководстве сказано так :

Always set the flag (argument 2) bit zero to one to make the drone consider the other argu-
ments. Setting it to zero makes the drone enter hovering mode (staying on top of the same point
on the ground).

Перевод google : Всегда устанавливайте флаг (аргумент 2) бит нуля до единицы, чтобы сделать дрон рассмотреть другие аргументы. Установка в ноль делает дрон ввести режиме висения (пребывание на вершине той же точке на земле).

Постановка задачи - повернуть вертолет вокруг вертикальной оси на нужный угол.

У летчиков угол поворота вокруг вертикальной оси называется yaw
Но у меня при использовании команды

AT*PCMD=" +(seq++)+",1,0,0,0,1036831949

вертолет хотя и вращался вокруг вертикальной оси, но больше все таки дрейфовал по прямой.

Попробовал поставить поставить вместо единицы ноль, получилось

То есть для вращения вокруг вертикальной оси я использую команду

AT*PCMD=" +(seq++)+",1,0,0,0,1036831949

1036831949 это число 0,1 в формате IEEE-754. Это число задает скорость вращения в интервале от 1 до -1. В долях максимальной скорости которая принимается за единицу.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38025809
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напутал немного.

Должно быть так:

Попробовал поставить вместо единицы ноль, получилось то что надо

То есть для вращения вокруг вертикальной оси я использую команду

AT*PCMD=" +(seq++)+",0,0,0,0,1036831949
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38028212
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У AR.Drone есть трехосевой магнитометр который используется для полета в режиме "Абсолютный контроль".

В режиме Demo вертолет примерно пятнадцать раз в секунду отправляет навигационные данные клиенту, в режиме отладки (Debug) отправка данных происходит около двухсот раз в секунду.

TCP порт 5559 используется для отправки важных данных, он используется вертолетом для отправки данных о конфигурации

В AR.Drone 2 появилась новая команда AT*PCMD_MAG. Она имеет восемь аргументов и используется для управления движением в режиме "Абсолютный контроль". В этом режиме используется магнитометр и команды вперед/назад/влево/вправо исполняются не относительно вертолета, а относительно джойстиков управления движением клиента. В руководстве по использованию SDK Drone система управления движением клиента называется контроллером.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38030018
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поменял прошивку на drone и версию AR.FreeFlight

Была версия программы AR.Free Flight - 2.1.6, стала - 2.1.12

Была версия прошивки drone - 2.2.3, стала - 2.2.9
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38033570
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структура пакета навигационных данных. Обязательно в начале пакета присутствуют 4 именованных величины: Заголовок пакета, флаги состояния вертолета , порядковый номер последней команды переданной вертолету клиентом, vison flag и далее может идти еще что-либо. В моем случае это "что-либо" имеет длину 4 байта.

Заголовок пакета 32 бита, флаги состояния - 32 бита, порядковый номер команды - 32 бита и vision flag - 32 бита. Всего 16 байт.

Разбивка по байтам
Header : 0 - 3 (байты с нулевого по третий)
Drone State : 4 - 7
Sequence number : 8 - 11
Vision flag : 12 - 15
"Что-либо" : 16 - 19
Заголок опции navdata : 20-23.
Navdata это структура состоящая из восьми значений
BATTERY : 24 - 27 (восемь байтов, из них 2 первых байта отводятся под идентификатор опции, два следующих содержат размер передаваемой величины и далее идет значение величины, в нашем случае под него отводится четыре байта)


Собственно пакет предназначен для передачи клиенту текущих показаний сенсоров установленных на вертолете

Обратимся опять к схеме из руководства по применению SDK

[img] http://e.bunker.kz/uploads/1345783744/gallery_13_4_11305.jpg [/img]

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

Все блоки (субпакеты) имеют общую структуру. Вот как об этом говорится в руководстве

All the blocks share this common structure :

Listing 7.1: Navdata option structure
typedef struct _navdata_option_t {
uint16_t tag; /* Tag for a specific option */
uint16_t size; /* Length of the struct */
uint8_t data[]; /* Structure complete with the special tag */
} navdata_option_t;

The most important options are navdata_demo_t, navdata_cks_t, navdata_host_angles_t and
navdata_vision_detect_t. Their content can be found in the C structure, mainly in the navdata_common.h.

Опция navdata имеет следующие поля

BATTERY = 24; заряд батареи в процентах
PITCH = 28; угол наклона по продольной оси
ROLL = 32; угол наклона относительно поперечной оси
YAW = 36; угол поворота относительно вертикальной оси
ALTITUDE = 40; высота
VX = 44; скорость по оси Х
VY = 48; скорость по оси Y
VZ = 52; скорость по оси Z

После знака равно указано смещение относительно начала пакета. Общая длина субпакета navdata равна 16+16+8*8*4 = 288 бит
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38033596
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще можно сказать что частота отправки данных в вертолета в режиме demo примерно 15 раз в секунду, а в режиме all data - 200 раз в секунду.

Все данные доходят и коррелируют с поведением вертолета. Только скорость вертолета по оси Z всегда почему то равна нулю. Возможно это связанно с тем что для вычисления скорости используется барометр, может быть он включается на высотах выше 6 метров, а на более низких используется ультразвуковой сенсор, а я летаю в квартире.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38033651
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напутал, так будет правильно

PITCH - угол наклона по поперечной оси
ROLL - угол наклона относительно продольной оси
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38035043
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое простое что приходит в голову относительно программного (субъектного) управления полетом вертолета это поворот на месте на заданный угол.

Постановка : пусть нам нужно научить вертолет поворачивать на 90 градусов относительно вертикальной оси.

Действия - ставим вертолет носом на север, взлетаем, даем команду поворота на малой скорости и считываем периодически значение угла поворота, как только он достигает нужного значения даем команду - зависнуть в точке без движений (hovering)
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38039529
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачи управления вертолетом.

Пусть нужно повернуть парящий в точке вертолет вокруг вертикальной оси.

Наши действия.

1. Извлекаем из пакета данных передаваемых с вертолета текущий угол поворота yaw. Нуль это направление на север. По часовой стрелке, если смотреть сверху на вертолет отсчитываются положительные значения угла, от нуля до ста восьмидесяти градусов, против часовой от нуля до минус ста восьмидесяти. Таким образом в точке происходит переход от плюс 180 до -180.

2. Определяем сумму начальный угол (фи нач) плюс угол поворота (пси). Если сумма положительная, то периодически проверяем условие фи нач + пси < фи тек. Где "фи тек" это текущий угол поворота вертолета. Как только условие выполнено прекращаем поворот

3. Если сумма отрицательная, то при "фи тек" > 0 продолжаем поворот без проверки условия, Как только "фи тек" становится меньше нуля начинаем проверять условие фи нач + пси > фи тек.

Все.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38042984
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правило для вращения вертолета вокруг вертикальной оси

Правило выполняется циклически до тех пор, пока yaw = true. Состоит их 3 частей.

В первой части вычисляем угол относительно вертикальной оси когда поворот считается выполненным. Для расчета используем заданный угол поворота и текущее значение угла относительно оси.

Заданный угол поворота может иметь значение в интервале от нуля до ста восьмидесяти градусов. Начальный угол относительно оси определяется с помощью данных принятых с вертолета

Int angle_start = (int) get_float(buf_rcv, NAVDATA_YAW)/1000;

Где buf_rcv – буфер куда помещен принятый с вертолета пакет, NAVDATA_YAW – смещение первого байта величины угла относительно начала пакета, get_float – процедура выборки четырех байтов в которых хранится значение величины угла

Далее вычисляем angle_final.

Чтобы придумать алгоритм вычисления надо посмотреть как он определен. Нулю градусов соответствует направление на север, по ходу часовой стрелки идет рост угла от нуля до ста восьмидесяти, против часовой стрелки идет уменьшение значений угла от нуля до минус ста восьмидесяти. Таким образом значение угла меняется скачком от плюс 180 к минус 180 в направлении на юг.

Если сумма углов больше 180 , надо преобразовать ее к значению угла в системе отсчета углов вертолета. Надо найти остаток от деления суммы на 180 и правильное значение угла будет равно разности остатка и 180

Процедуры выхода из вращения

Если финальный угол больше нуля или равен, то выход выполняется при условии что текущий угол больше финального.

Но тут есть проблема связанная с дискретностью процесса измерения. При большой скорости вращения и большом финальном угле, близком к 180 градусам есть вероятность проскочить область положительных углов больших чем финальный и тогда вращение никогда не остановится.

В этом случае выход из вращения будет выполнен в случае если финальный угол больше нуля , текущее значение меньше начального и текущий угол отрицателен.
Последний случай это когда финальный угол меньше нуля. Выход выполняется при условии, что текущий угол больше финального и текущий угол отрицательный.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
// Правило первое. Поворот вокруг вертикальной оси на заданный угол

// yaw - логическая величина, которая позволяет в цикле обрабатывать правило
// когда правило обработанно yaw присваиваем значение false
    			if (yaw) {
    				

    				if (n_yaw==0){
    					angle_start = (int) get_float(buf_rcv, NAVDATA_YAW)/1000;
        				send("AT*PCMD=" + (seq++) + ",0,0,0,0,0");
        				send("AT*PCMD=" + (seq++) + ",0,0,0,0,0");
        				Thread.sleep(INTERVAL);
        				
        				
        				angle_final = angle_start + psi_angle;
     				
        				if (angle_final > 0) {
        					int ost = angle_final % 180 ;
        					int chast = angle_final / 180 ;
            				if (chast > 0) {
            					angle_final = ost - 180 ;
            				}
        				}

        				if (angle_final==180) angle_final = -180;
         				n_yaw++;
    				}

    				send("AT*PCMD=" +(seq++)+",0,0,0,0,1056964608");

    				int angle_current =  (int) get_float(buf_rcv, NAVDATA_YAW)/1000;
    				
    				if (angle_current > angle_final & angle_final > 0 ){
    					yaw=false;
    					
    					send("AT*PCMD=" + (seq++) + ",0,0,0,0,0");
    					Thread.sleep(INTERVAL);
	
    				}
    				
    				if (angle_current < angle_final & angle_final > 0 & angle_current < 0 ){
    					
    					yaw=false;
    					
    					send("AT*PCMD=" + (seq++) + ",0,0,0,0,0");
    					Thread.sleep(INTERVAL);
    					
    				}

    				
    				if (angle_current > angle_final & angle_final < 0 & angle_current < 0 ){
    					yaw=false;
    					
    					send("AT*PCMD=" + (seq++) + ",0,0,0,0,0");
    					Thread.sleep(INTERVAL);
    				}

    				Thread.sleep(INTERVAL);
    				
    			}



...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38043108
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка в условии

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    				if (angle_current < angle_final & angle_final > 0 & angle_current < 0 ){
    					
    					yaw=false;
    					
    					send("AT*PCMD=" + (seq++) + ",0,0,0,0,0");
    					Thread.sleep(INTERVAL);
    					
    				}



Надо так


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    				if (angle_final > 0 & angle_current < 0 & angle_current < angle_start){
    					
    					yaw=false;
    					
    					send("AT*PCMD=" + (seq++) + ",0,0,0,0,0");
    					Thread.sleep(INTERVAL);
    					
    				}




Выход из вращения будет выполнен в случае если финальный угол больше нуля , текущее значение меньше нуля и текущий угол меньше начального.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38047206
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не хочет вертолет прямо летать. Куда то в бок его тянет все время.

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

Говорят, что надо удалить файл trims.bin в папке data
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38049873
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписка с Arman

Он пишет :


Вот мне нужны такие задачи!
1) Среда разработки приложений для AR.Drone Parrot
2) Как программируется?
3) Примеры программ
4) Найти литературы
5) Алгоритмы

Как мне сказали как таковой среды разработки нету но есть SDK! Что такое это воопще SDK?)
Программируется через С, C++, Java, Python верно?
В этом SDK файле заключены и примеры программ, и литература(токо она на англиском это печально), и алгоритмы тоже в этом файле верно?


Я отвечаю :

SDK это набор инструментов облегчающих программисту управление устройством. Это программа преобразующая инструкции высокого уровня в инструкции которые понимают устройства вертолета - моторы, светодиоды и так далее.

Например, чтобы вертолет взлетел надо послать ему команду

"AT*REF=" + (seq++) + ",290718208"

seq - порядковый номер команды

А SDK уже переведет эту команду на язык низкого уровня, на язык управления моторами вертолета

Похоже на драйвер к устройству ПК

Вот здесь можно скачать Руководство пользователя на английском

https://projects.ardrone.org/boards/1/topics/show/4365

-------------------------


Программировать поведение drone можно на любом языке которым Вы владеете.

Можно себе представить вертолет как компьютерную систему которая создает wifi сеть и открывает несколько портов для общения. Чтобы подключиться к этой сети Ваш ПК должен иметь wifi адаптер

На порт 5556 посылаются команды управляющие поведением вертолета. Команда это текстовая строка в кодировке ASCII.

Перед отправкой команды она преобразуется в байтовый массив и отсылается в виде дейтаграммы, то есть используется протокол UDP

Для получения с вертолета навигационных данных используется его (вертолета) порт 5554
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38049875
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос от Arman

А есть ли SDK на windows?

Ответ

Управление вертолетом происходит с помощью передачи ему AT команд. Примеры этих команд я уже приводил в этой теме. Они избавляют разработчика (developer) от необходимости разбираться с аппаратным устройством вертолета

Кроме того фирма Parrot разработала две библиотеки, ARDroneLIB и ARDroneTool, которые осуществляют так называемый API-интерфейс к управлению. То есть на входе этих библиотек API-команды, а на выходе AT-команды, которые собственно и управляют вертолетом.

Эти две библиотеки называют SDK. Они написаны на языке C. То есть будут работать в любой системе, в частности под Windows

Я не использую SDK для управления вертолетом. Пользуюсь AT-командами.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38050974
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хочется покомандовать, а не кем, то можно покомандовать drone

Вот консольная программа на java с помощью которой можно поморгать светодиодами

spoiler Заголовок]
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.StringTokenizer;



public class Test1 extends Frame implements KeyListener{

    static final int AT_PORT 	  = 5556;

    
    static InetAddress inet_addr;
    
     
    static int seq = 1; //Send AT command with sequence number 1 will reset the counter


    boolean space_bar = false; //true = Takeoff, false = Landing
    
    
    static DatagramSocket socket_at;

    
    
    public Test1(String name, String args[], InetAddress inet_addr) throws Exception {
        super(name);
        //System.out.println("Speed: " + speed); 
    	addKeyListener(this);                  
    	setSize(320, 160);
    	setVisible(true);
    	addWindowListener(new WindowAdapter() {
    	    public void windowClosing(WindowEvent e) {
    		System.exit(0);
    	    }
      	});
        
    }
    
    public static void main(String[] args) throws Exception{
    	
    	// Создаем значение для переменной ip_addr        
    	String ip = "192.168.1.1";
    	StringTokenizer st = new StringTokenizer(ip, ".");
    	byte[] ip_bytes = new byte[4];
    	if (st.countTokens() == 4){
     	    for (int i = 0; i < 4; i++){
    		ip_bytes[i] = (byte)Integer.parseInt(st.nextToken());
    	    }
    	}
       inet_addr = InetAddress.getByAddress(ip_bytes);
        
    	
    	
    	socket_at = new DatagramSocket(AT_PORT);
    	socket_at.setSoTimeout(3000);
    	
    	Test1 ardrone = new Test1("ARDrone", args, inet_addr); 
    	
    	while(true) {
    		Thread.sleep(30);
    	}
    }


    
    public static void send(String msg) throws Exception {
    	byte[] bytes = (msg + "\r").getBytes();
    	DatagramPacket ds = new DatagramPacket(bytes, bytes.length, inet_addr, AT_PORT);
    	
    	socket_at.send(ds);
    }
    
 
    
    public static synchronized int get_seq() {
    	return seq++;
    }
    
    
    public void keyTyped(KeyEvent e) {
        ;
    }
    
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();

        try {
            control(keyCode);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public void keyReleased(KeyEvent e) {
        ;
        //if (keyCode >= KeyEvent.VK_1 && keyCode <= KeyEvent.VK_9) speed = (float)0.1; //Reset speed
        
    }
    
    //Control AR.Drone via AT commands per key code
    public void control(int keyCode) throws Exception {
   	
    	switch (keyCode) {

    	    case KeyEvent.VK_SPACE:
    	    	// Операция  Не равно "= !"
    	    	space_bar = !space_bar;

   	    	if (space_bar) {  
    	    	    System.out.println("Takeoff");
    	    	    send("AT*CONFIG=" + get_seq() + ",\"leds:leds_anim\",\"3,1073741824,2\"");  
    	    	    //send("AT*REF=" + get_seq() + ",290718208");
   		} else {
    	    	    System.out.println("Landing");
    	    	    send("AT*CONFIG=" + get_seq() + ",\"leds:leds_anim\",\"5,1073741824,2\"");  
    	    	    //send("AT*REF=" + get_seq() + ",290717696");
    		}

    	    	break;   	    			    		

    	    default:
    	    	break;
    	}
    	
    }
    
  
    
}




[/spoiler]
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38051731
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритмы поведения drone

Логика поведения drone

1. Таймер watchdog
2. Две секунды
3. Состояние emergency (Авария)
4. Алгоритмы стабилизации полета при ветре
5. Алгоритм полета в режиме hovering
6. Команды взлета и посадки.
7. Работа с конфигурационными данными.


Интересно, что будет если дать команду "Посадка", а потом не дожидаясь посадки дать команду "Газ".
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38051754
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему в памяти вертолета есть несколько полей состояний которые определяют его поведение. С помощью команд мы изменяем значения нужных битов в этих полях.

Несколько раз наблюдал, что в случае нештатной посадки, например emergency, взлете вертолет сразу резко начинает маневрировать непонятно. То есть вертолет помнит прошлые команды клиента. Если их не отменить он продолжает их выполнять.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38063704
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обсуждение алгоритмов drone/

Вернемся к алгоритмам которые помогают drone летать.

1. ультразвуковой датчик и барометр. Тут все понятно. Точно так же как корабль измеряет расстояние до дна. Скорость звука в воздухе известна. Есть излучатель и приемник. Создаем направленный импульс звуковой, затем ловим отраженный импульс и засекаем время между двумя событиями. Умножаем скорость на время получаем расстояние и длим пополам

С барометром тоже понятно, чем выше аппарат тем меньше давление. Есть наверное формула для расчета высоты от давления атмосферного.

2. Еще есть акселерометры и гироскопы трехмерные. С ними вроде бы все понятно, измеряют ускорения линейные и угловые.

3. Камеры видео. Их две. Фронтальная и вертикальная. Вертикальная камера измеряет скорость движения drone. Алгоритм по моему такой. Анализируется изображение, на нем выделяются точки неподвижные. Точка это типа яркое пятно с четкими границами с малым угловым размером. Вместе с расстоянием до Земли изменение положения точки на снимке дает скорость движения.
...
Рейтинг: 0 / 0
25 сообщений из 92, страница 2 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / AR.Drone квадрокоптер. Программирование на java и С
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]