powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / AR.Drone квадрокоптер. Программирование на java и С
92 сообщений из 92, показаны все 4 страниц
AR.Drone квадрокоптер. Программирование на java и С
    #37966715
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишем приложение на java с использованием библиотеки на С, для android

Есть существенная разница между компиляторами языков java и С. Компилятор java делает код понятный для виртуальной java машины, которая преобразует его в код конкретной платформы, то есть в машинный код. Компилятор языка С сразу делает машинный код, то есть для каждой платформы у языка должен быть свой компилятор.

Систематического руководства по этой задаче не нашел. Английский мой - нулевой. Погрузился в "поток сознания" русского сегмента. Как говорится - аллах акбар.

Эту проблему для приложений на android решает пакет NDK.

В общем надо его скачать, он существует в виде архива и распаковать в любое удобное место.

Кроме NDK все советуют использовать пакет Sequoyah

Чтобы его установить делаем в eclipse : Help - Install New Software, далее в поле Work with определяем адрес сетевой сервера откуда скачиваем пакет - Indigo repository - http://download.eclipse.org/releases/indigo/

Внизу появляется список, раскрываем пакет - Mobile and Device Development, и в нем выбираем "Sequoyah Android Native Code Support". Я не стал разбираться и отметил все позиции со словом Sequoyah

Говорят, что eclipse использует для компиляции и сборки команду make и типа под windows можно сделать эмулятор linux c помощью cygwin. Сходил на сайт cygwin.com и установил его. Потренировался в создании библиотек и написании make-файлов

Надо задать NDK location. Для этого в главном меню eclipse выбираем команду window - Preferences. Потом в диалоге Android - Native Development и NDK

Собственно из приготовительных работ все.

В качестве шаблона проекта использовал "hello-jni" из папки samples в NDK

Сборка проекта. Создал проект hello-jni, скопировал туда файлы из шаблона. Выполнил операцию Add Native Support. Чтобы ее выполнить выделяем корневую папку проекта в окне "Project Explorer" eclipse, затем вызываем контекстное меню, правой кнопкой мыши, далее в списке команд ищем "Add Native Support", у меня их там две , выбираем ту которая со зеленным значком слева от текста.

Теперь смотрим за изменениями в составе проекта. Оказывается появилась новая папка - "jni". В ней два файла - текст библиотеки на С и make-файл Amdroid.mk

Кроме того если повезет появится еще папка include и в ней список путей к папкам.c заголовочными файлами Я говорю так потому что у меня eclipse на двух машинах. На одной после операции создается папка include и в нее помещаются каталоги с заголовочными файлами, а на другой нет. Почему так происходит - не знаю.

Если не повезло придется самому писать пути. Делается это так. Выделяем корневую папку проекта, потом вызываем контекстное меню и там команду Properties. Выбираем C/C++ General - Paths and Symbols

У меня к этому проекты определенны такие пути к include :

D:/dev/android/android-ndk-r8b/platforms/android-14/arch-mips/usr/include
D:/dev/android/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/lib/gcc/arm-linux-androideabi/4.6.x-google/include
D:/dev/android/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/lib/gcc/arm-linux-androideabi/4.6.x-google/include-fixed
D:/dev/android/android-ndk-r8b/sources/cxx-stl/system/include

Теперь берем из шаблона NDK содержимое для файла библиотеки hello-jni.

Далее надо создать заголовочный файл для HelloJni.class. Для этого определяем значение classpath и выполняем создание заголовка с помощью javah. Я делаю это в командной строке Far. Получается две команды

>set classpath=d:\dev\android\workspaces\hello-jni\bin\classes;d:\android-16\*
>javah -jni com.example.hellojni.HelloJni

После чего имеем в текущей папке файл com_example_hellojni_HelloJni.h. Копируем его в папку jni проекта. Для вставки выделяю папку jni в "Project Explorer" eclipse

Собственно все. Осталось создать динамическую библиотеку. Тут тоже несколько путей. Как вариант - в среде Far делаю текущим каталог проекта и выполняю команду ndk-build.cmd

После этого запускаю проект - Run. Все
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37966816
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эт чо? инструкция для себя, чтобы не забыть что ли?
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37968581
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Купил wifi адаптер и подсоединил его к своему PC
Включил AR.Drone
В списке беспроводных сетей нашел сеть drone и подключился к ней

Вот ссылка на программу

https://projects.ardrone.org/attachments/194/ARDrone.java

После того как eclipse создал класс идем в Far, выбираем каталог в котором находится класс и в командной строку Far пишем

java ARDrone 192.168.1.1 AT*CONFIG=605,\"leds:leds_anim\",\"3,1073741824,2\"

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

Второй аргумент команды - это строка, опция указывающая на конкретное содержание команды

Третий аргумент - это строка состоящая из трех чисел, разделенных запятой. Первое число - это номер анимации в списке из файла ARDroneLib/Soft/Common/led_animation.h

Второй аргумент это частота, выраженная в форме числа с плавающей запятой

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

http://gauth.fr/2011/09/control-the-ar-drone-leds/
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37972280
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритм получения данных с ARDrone. Например : заряд аккумулятора, скорость, высота и так далее

1. Отправляем 4 байта {0x01, 0x00, 0x00, 0x00} на порт 5554
2. Отправляем команду AT*CONFIG=" + 1 + ",\"general:navdata_demo\",\"TRUE\" на порт 5556
3. Принимаем данные и выбираем из них нужные. Данные структурированы

Код: 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.
/* 
 * Принимаем данные NavData 
 */ 

import java.net.*; 
import java.util.*; 


public class Test { 

   /** 
    * @param args 
    */ 
    
    static final int NAVDATA_PORT = 5554; 
    static final int AT_PORT      = 5556; 

    //NavData offset 
    static final int NAVDATA_STATE    =  4; 
    static final int NAVDATA_BATTERY  = 24; 
    static final int NAVDATA_ALTITUDE = 40; 


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

    public static void main(String[] args) throws Exception { 
      // TODO Auto-generated method stub 
        InetAddress inet_addr; 
        DatagramSocket socket_at; 
        DatagramSocket socket_nav; 
        int cnt = 0; 
        
// Создаем значение для переменной 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); 
        
       socket_nav = new DatagramSocket(NAVDATA_PORT); 
       socket_nav.setSoTimeout(3000); 

       try { 
// создаем содержимое пакета для отправки на NAVDATA_PORT        
       byte[] buf_snd = {0x01, 0x00, 0x00, 0x00}; 
// создаем пакет 
       DatagramPacket packet_snd = new DatagramPacket(buf_snd, buf_snd.length, inet_addr, NAVDATA_PORT); 
// отправляем пакет        
       socket_nav.send(packet_snd); 
       System.out.println("Sent trigger flag to UDP port " + NAVDATA_PORT);        


// создаем новый пакет для отправки на AT_PORT       
       String at_cmd="AT*CONFIG=" + 1 + ",\"general:navdata_demo\",\"TRUE\""; 
       byte[] buf_snd_1 = (at_cmd + "\r").getBytes(); 
      DatagramPacket packet_snd_1 = new DatagramPacket(buf_snd_1, buf_snd_1.length, inet_addr, AT_PORT); 
      socket_at.send(packet_snd_1); 
       
// Получаем сообщение с NAVDATA_PORT 
        byte[] buf_rcv = new byte[10240]; 
       DatagramPacket packet_rcv = new DatagramPacket(buf_rcv, buf_rcv.length);            

       while(true) { 
         try { 
             socket_nav.receive(packet_rcv); 
             
             cnt++; 
             if (cnt >= 2) { 
                cnt = 0; 
                System.out.println("NavData Received: " + packet_rcv.getLength() + " bytes"); 
                 

                 StringBuffer sb = new StringBuffer(); 
                 for (int i = 0; i < 4; i++) { 
                     String tmp = Integer.toHexString(((int) buf_rcv[NAVDATA_BATTERY + i]) & 0xFF); 
                     for(int t = tmp.length();t<2;t++) 
                     { 
                         sb.append("0"); 
                     } 
                     sb.append(tmp); 
                     sb.append(" "); 
                 } 
                 
                 
                 
                 
                 
                int tmp_1 = 0, n = 0; 
                System.out.println("get_int(): data = " + sb);  
                for (int i=3; i>=0; i—) {    
                    n <<= 8; 
                    tmp_1 = buf_rcv[NAVDATA_BATTERY + i] & 0xFF;    
                    n |= tmp_1;    
                } 
                 
                System.out.println("Battery: " + n); 
                 
                 
             } 
         } catch(SocketTimeoutException ex3) { 
                 System.out.println("socket_nav.receive(): Timeout"); 
         } catch(Exception ex1) { 
             ex1.printStackTrace(); 
         } 
          } 
      } catch(Exception ex2) { 
          ex2.printStackTrace(); 
      } 
   } 
    
} 



В этой теме есть обсуждение принимаемых данных

https://projects.ardrone.org/boards/1/topics/show/4805
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37972458
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erbolg,

StringBuffer sb = new StringBuffer(); // в этом месте лучше StringBuilder
sb.append("0"); // лучше sb.append('0');
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37972516
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, спасибо посмотрю
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37980487
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два случая когда счетчик номера команд (sequence counter) должен быть сброшен клиентом drone

1. drone не получает трафика в течение более 50 мс, будет установлен бит ARDRONE_COM_WATCHDOG_MASK в поле ardrone_state (2-е поле) пакета navdata. Чтобы выйти из этого режима, клиент должен послать AT-команду AT * COMWDG.
2. drone не получает трафика более чем 2000 мс, будет остановлена связь с клиентом, и установлен бит ARDRONE_COM_LOST_MASK. Клиент должен повторно инициализировать связь с drone.

ARDrone_Developer_Guide, стр. 40
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37980501
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О чем это?
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37980587
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvО чем это?типа блог
насколько я понимаю )
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37981146
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу принимать данные в вертолета и потом обрабатывать их. Типа тюнинг
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37981208
Oleg SP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
erbolgХочу принимать данные в вертолета и потом обрабатывать их. Типа тюнинг


тоже думал об этой задаче
думал о связке Arduino (на борту птички) и программы на Processing (фреймфорк Java) на компе который данные собирает
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37982302
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот эта программа умеет принимать данные и летать

Осталось джойстик добавить для android

Код: 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.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
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.*; 
import java.nio.FloatBuffer; 
import java.nio.IntBuffer; 
import java.util.*; 


public class Test1 extends Frame implements KeyListener{ 

   /** 
    * @param args 
    */ 
    
    static final int NAVDATA_PORT = 5554; 
    static final int AT_PORT      = 5556; 

    //NavData offset 
    static final int NAVDATA_STATE    =  4; 
    static final int NAVDATA_BATTERY  = 24; 
    static final int NAVDATA_PITCH   = 28; 
    static final int NAVDATA_ROLL    = 32; 
    static final int NAVDATA_YAW     = 36; 
    static final int NAVDATA_ALTITUDE = 40; 
    static final int NAVDATA_VX = 44; 
    static final int NAVDATA_VY = 48; 
    static final int NAVDATA_VZ = 52; 
    
    static final int MYKONOS_TRIM_COMMAND_MASK   = 1 <<  7; /*!< Trim command ACK : (0) None, (1) one received */ 
    static final int MYKONOS_TRIM_RUNNING_MASK   = 1 <<  8; /*!< Trim running : (0) none, (1) running */ 
    static final int MYKONOS_TRIM_RESULT_MASK    = 1 <<  9; /*!< Trim result : (0) failed, (1) succeeded */ 
    static final int MYKONOS_ANGLES_OUT_OF_RANGE = 1 << 19; /*!< Angles : (0) Ok, (1) out of range */ 
    static final int MYKONOS_WIND_MASK           = 1 << 20; /*!< Wind : (0) Ok, (1) too much to fly */ 
    static final int MYKONOS_ULTRASOUND_MASK     = 1 << 21; /*!< Ultrasonic sensor : (0) Ok, (1) deaf */ 
    static final int MYKONOS_CUTOUT_MASK         = 1 << 22; /*!< Cutout system detection : (0) Not detected, (1) detected */ 
    static final int MYKONOS_COM_WATCHDOG_MASK   = 1 << 30; /*!< Communication Watchdog : (1) com problem, (0) Com is ok */ 
    static final int MYKONOS_EMERGENCY_MASK      = 1 << 31; /*!< Emergency landing : (0) no emergency, (1) emergency */ 
    
    static InetAddress inet_addr; 
    
    static String at_cmd_last = ""; 
    
    static int seq = 1; //Send AT command with sequence number 1 will reset the counter 

    final static int INTERVAL = 100; 
    
    float speed = (float)0.1; 
    boolean shift = false; 
    FloatBuffer fb; 
    IntBuffer ib; 
    boolean space_bar = false; //true = Takeoff, false = Landing 
    
    static float attitude_pitch, attitude_roll, attitude_yaw; 
    
    static DatagramSocket socket_at; 
    static DatagramSocket socket_nav; 
    
    
    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 { 
      // TODO Auto-generated method stub 
        

        int cnt = 0; 
        
// Создаем значение для переменной 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); 
        
       socket_nav = new DatagramSocket(NAVDATA_PORT); 
       socket_nav.setSoTimeout(3000); 

       try { 
// создаем содержимое пакета для отправки на NAVDATA_PORT        
       byte[] buf_snd = {0x01, 0x00, 0x00, 0x00}; 
// создаем пакет 
       DatagramPacket packet_snd = new DatagramPacket(buf_snd, buf_snd.length, inet_addr, NAVDATA_PORT); 
// отправляем пакет        
       socket_nav.send(packet_snd); 
       System.out.println("Sent trigger flag to UDP port " + NAVDATA_PORT);        

       Test1 ardrone = new Test1("ARDrone", args, inet_addr);        
       
// создаем новый пакет для отправки на AT_PORT       
       String at_cmd="AT*CONFIG=" + 1 + ",\"general:navdata_demo\",\"TRUE\""; 
       byte[] buf_snd_1 = (at_cmd + "\r").getBytes(); 
      DatagramPacket packet_snd_1 = new DatagramPacket(buf_snd_1, buf_snd_1.length, inet_addr, AT_PORT); 
      socket_at.send(packet_snd_1); 
       
// Получаем сообщение с NAVDATA_PORT 
        byte[] buf_rcv = new byte[10240]; 
       DatagramPacket packet_rcv = new DatagramPacket(buf_rcv, buf_rcv.length);            

       while(true) { 
         try { 
             socket_nav.receive(packet_rcv); 
             
             int state = get_int(buf_rcv, NAVDATA_STATE); 
              
              if ((state & MYKONOS_COM_WATCHDOG_MASK) > 0) { 
                 System.out.println("MYKONOS_COM_WATCHDOG_MASK"); 
                 send("AT*COMWDG=1"); 
                 Thread.sleep(30);    
              } 
              
                 if ((state & MYKONOS_TRIM_COMMAND_MASK) > 0) { 
                 System.out.println("MYKONOS_TRIM_COMMAND_MASK"); 
//                 send("AT*LED=1,4,1056964608,5"); 
//                 Thread.sleep(30);    
                  
              } 

              if ((state & MYKONOS_TRIM_RESULT_MASK) > 0) { 
                 System.out.println("MYKONOS_TRIM_RESULT_MASK"); 
              } 

              if ((state & MYKONOS_ANGLES_OUT_OF_RANGE) > 0) { 
                 System.out.println("MYKONOS_ANGLES_OUT_OF_RANGE"); 
              } 

              if ((state & MYKONOS_WIND_MASK) > 0) { 
                 System.out.println("MYKONOS_WIND_MASK"); 
              } 

              if ((state & MYKONOS_ULTRASOUND_MASK) > 0) { 
                 System.out.println("MYKONOS_ULTRASOUND_MASK"); 
              } 

              if ((state & MYKONOS_CUTOUT_MASK) > 0) { 
                 System.out.println("MYKONOS_CUTOUT_MASK"); 
              } 

              if ((state & MYKONOS_EMERGENCY_MASK) > 0) { 
                 System.out.println("MYKONOS_EMERGENCY_MASK"); 
              } 
              
              int battery = get_int(buf_rcv, NAVDATA_BATTERY); 
              float altitude = ((float)get_int(buf_rcv, NAVDATA_ALTITUDE)/1000); 
              attitude_pitch = get_float(buf_rcv, NAVDATA_PITCH)/1000;
              attitude_roll = get_float(buf_rcv, NAVDATA_ROLL)/1000; 
              attitude_yaw = get_float(buf_rcv, NAVDATA_YAW)/1000; 
              
             
             cnt++; 
             if (cnt >= 5) { 
                cnt = 0; 
                System.out.println("NavData Received: " + packet_rcv.getLength() + " bytes"); 
                 
                System.out.println("get_int(): data = " + byte2hex(buf_rcv, NAVDATA_BATTERY, 4));  

                System.out.println("Battery: " + battery); 
                 
                System.out.println("Altitude: " + altitude); 
                 
                 System.out.println("Pitch: " + attitude_pitch); 
                 System.out.println("Roll: " + attitude_roll); 
                 System.out.println("Yaw: " + attitude_yaw); 
                 
             } 
         } catch(SocketTimeoutException ex3) { 
                 System.out.println("socket_nav.receive(): Timeout"); 
         } catch(Exception ex1) { 
             ex1.printStackTrace(); 
         } 
          } 
      } catch(Exception ex2) { 
          ex2.printStackTrace(); 
      } 
   } 
    
    public static int get_int(byte[] data, int offset) { 
        int tmp = 0, n = 0; 
        for (int i=3; i>=0; i—) {    
            n <<= 8; 
            tmp = data[offset + i] & 0xFF;    
            n |= tmp;    
        } 
        return n;    
    } 
    
    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 float get_float(byte[] data, int offset) { 
        return Float.intBitsToFloat(get_int(data, offset)); 
    } 
    
    public static String byte2hex(byte[] data, int offset, int len) { 
       StringBuilder sb = new StringBuilder(); 
        for (int i = 0; i < len; i++) { 
            String tmp = Integer.toHexString(((int) data[offset + i]) & 0xFF); 
            for(int t = tmp.length();t<2;t++) 
            { 
                sb.append('0'); 
            } 
            sb.append(tmp); 
            sb.append(' '); 
        } 
        return sb.toString(); 
    } 
    
    public static synchronized int get_seq() { 
       return seq++; 
    } 
    
    public static synchronized void send_at_cmd(String at_cmd) throws Exception { 
       System.out.println("AT command: " + at_cmd);    
       at_cmd_last = at_cmd; 
   byte[] buf_snd = (at_cmd + "\r").getBytes(); 
   DatagramPacket packet_snd = new DatagramPacket(buf_snd, buf_snd.length, inet_addr, AT_PORT); 
   socket_at.send(packet_snd); 

    /* AR.Drone does not send back ack message (like "OK") 
    byte[] buf_rcv = new byte[64]; 
   DatagramPacket packet_rcv = new DatagramPacket(buf_rcv, buf_rcv.length);            
   socket_at.receive(packet_rcv); 
   System.out.println(new String(packet_rcv.getData(),0,packet_rcv.getLength())); 
   */      
    } 
    
    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) { 
        int keyCode = e.getKeyCode(); 
        //if (keyCode >= KeyEvent.VK_1 && keyCode <= KeyEvent.VK_9) speed = (float)0.1; //Reset speed 
        if (keyCode == KeyEvent.VK_SHIFT) shift = false; 
    } 
    
    //Control AR.Drone via AT commands per key code 
    public void control(int keyCode) throws Exception { 
        //System.out.println("Key: " + keyCode + " (" + KeyEvent.getKeyText(keyCode) + ")"); 
        
       switch (keyCode) { 
            case KeyEvent.VK_1: 
               speed = (float)0.05; 
              break; 
           case KeyEvent.VK_2: 
               speed = (float)0.1; 
              break; 
           case KeyEvent.VK_3: 
               speed = (float)0.15; 
              break; 
           case KeyEvent.VK_4: 
               speed = (float)0.25; 
              break; 
           case KeyEvent.VK_5: 
               speed = (float)0.35; 
              break; 
           case KeyEvent.VK_6: 
               speed = (float)0.45; 
              break; 
           case KeyEvent.VK_7: 
               speed = (float)0.6; 
              break; 
           case KeyEvent.VK_8: 
               speed = (float)0.8; 
              break; 
           case KeyEvent.VK_9: 
               speed = (float)0.99; 
              break; 
           case KeyEvent.VK_SHIFT: 
               shift = true; 
              break; 
           case KeyEvent.VK_UP: 
              if (shift) { 
              System.out.println("Go Up (gaz+)"); 
                  send_pcmd(1, 0, 0, speed, 0); 
              } else { 
                  System.out.println("Go Forward (pitch+)"); 
                  send_pcmd(1, speed, 0, 0, 0); 
              } 
              break; 
           case KeyEvent.VK_DOWN: 
              if (shift) { 
                  System.out.println("Go Down (gaz-)"); 
                  send_pcmd(1, 0, 0, -speed, 0); 
              } else { 
                  System.out.println("Go Backward (pitch-)"); 
                  send_pcmd(1, -speed, 0, 0, 0); 
              } 
                 break; 
           case KeyEvent.VK_LEFT: 
               if (shift) { 
                   System.out.println("Rotate Left (yaw-)"); 
                   send_pcmd(1, 0, 0, 0, -speed); 
      } else { 
          System.out.println("Go Left (roll-)"); 
          send_pcmd(1, 0, -speed, 0, 0); 
      } 
             break; 
           case KeyEvent.VK_RIGHT: 
          if (shift) { 
              System.out.println("Rotate Right (yaw+)"); 
              send_pcmd(1, 0, 0, 0, speed); 
      } else { 
          System.out.println("Go Right (roll+)"); 
          send_pcmd(1, 0, speed, 0, 0); 
      } 
              break; 
           case KeyEvent.VK_SPACE: 
              // Операция  Не равно "= !" 
              space_bar = !space_bar; 

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

              break;                              
           case KeyEvent.VK_PAUSE: 
              System.out.println("Hovering"); 
              send_pcmd(1, 0, 0, 0, 0); 
      speed = (float)0.1; //Reset speed 
              break; 
           default: 
              break; 
       } 
        
       if (keyCode >= KeyEvent.VK_1 && keyCode <= KeyEvent.VK_9) System.out.println("Speed: " + speed); 
    } 
    
    public void send_pcmd(int enable, float pitch, float roll, float gaz, float yaw) throws Exception { 
       System.out.println("Speed: " + speed); 
   send_at_cmd("AT*PCMD=" + get_seq() + "," + enable + "," + intOfFloat(pitch) + "," + intOfFloat(roll) 
                       + "," + intOfFloat(gaz) + "," + intOfFloat(yaw)); 
    } 
    
    public int intOfFloat(float f) { 
        fb.put(0, f); 
        return ib.get(0); 
    } 

    
    
    
} 
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37982307
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Author: MAPGPS, я только немного отредактировал
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37982392
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erbolgВот эта программа умеет принимать данные и летатьа ты не мог бы этот код в спойлер убирать?
а то я читаю с интересом только русские твои слова
а эти вот буквы на этом языке достали уже
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37982461
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь. В следующий раз уберу
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37989121
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед рисованием джойстика надо сделать попробовать поработать сделать не консольное приложение на ПК, а приложение на android

Программа Взлет/посадка состоит из 2 -х классов. На форме (activity) расположим две кнопки

Вот оформление из файла activity_main.xml



Код: xml
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.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/textView1"
        android:layout_marginRight="40dp"
        android:layout_marginTop="36dp"
        android:text="Взлет"
        android:onClick="onMyButtonClick" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/button1"
        android:layout_below="@+id/button1"
        android:layout_marginTop="30dp"
        android:text="Посадка" 
        android:onClick="onMyButtonClick1" />

</RelativeLayout>




Файл формы (activity)


Код: 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.
package com.example.test3;



import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;


public class MainActivity extends Activity {
	
    boolean app_running = true;
    NavData navdata;
    private static final String TAG = "ARDrone";


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
 //       navdata = new NavData(this);
 //   	navdata.start();

    }
    
    public MainActivity() {
    	navdata = new NavData(this);
    	navdata.start();
    }
    
    
    public void destroyApp(boolean unconditional) {
    	app_running = false;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    public void onMyButtonClick(View view)  
    {  
        // выводим сообщение
    	//Log.d(TAG, "msg");
    	try {
    	//navdata.send("AT*CONFIG=605,\"leds:leds_anim\",\"3,1073741824,2\"");
    	navdata.erbol = true;
    	} catch (Exception e)
    	{}
    	Toast.makeText(this, "Зачем вы нажали?", Toast.LENGTH_SHORT).show();  
    }
    
    public void onMyButtonClick1(View view)  
    {  
        // выводим сообщение
    	navdata.satiga = true;
        Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();  
    }
    
    
 
}




А это класс с помощью которого взаимодействуем с drone


Код: 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.
package com.example.test3;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.StringTokenizer;
import android.util.Log;

public class NavData extends Thread{
	
	static final int AT_PORT 	  = 5556;
	static InetAddress inet_addr;
	
	static String at_cmd_last = "";
    
    static int seq = 1; //Send AT command with sequence number 1 will reset the counter

    FloatBuffer fb;
    IntBuffer ib;

    static DatagramSocket socket_at;
    
    MainActivity mAct;
    private static final String TAG = "ARDrone";
    boolean erbol=false;
    boolean satiga=false;
    
    public NavData(MainActivity mAct) {
    	this.mAct = mAct;
    }
    
    
    public void run() {

    	try {
        	socket_at = new DatagramSocket(AT_PORT);
        	socket_at.setSoTimeout(3000);
    	} catch (Exception ex){}
    	
    	int ch = 0;
    	while(mAct.app_running) {
    		ch++;
    		try {
    			if (erbol) {
    				//send("AT*CONFIG=605,\"leds:leds_anim\",\"3,1073741824,2\"");
    				send("AT*REF=605,290718208");
    				erbol=false;
    			}
    			
    			if (satiga) {
    				send("AT*REF=606,290717696");
    				send("AT*CONFIG=606,\"leds:leds_anim\",\"4,1073741824,2\"");
    				//send_at_cmd("AT*REF=" + get_seq() + ",290717696");
    				satiga=false;
    			}
    		}
    		catch (Exception ex) {}
    		//if (ch>1) erbol=false ;
    	}
    }
    
    public int get_int(byte[] data, int offset) {
        int tmp = 0, n = 0;
        for (int i=3; i>=0; i--) {   
            n <<= 8;
            tmp = data[offset + i] & 0xFF;   
            n |= tmp;   
        }
        return n;   
    }
    
    public void send(String msg) throws Exception {
    	byte[] bytes = (msg + "\r").getBytes();
    	
    	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);
    	DatagramPacket ds = new DatagramPacket(bytes, bytes.length, inet_addr, 5556);
    	//Log.d(TAG, bytes.toString());
    	//Log.d(TAG, msg);
    	Log.d(TAG, inet_addr.toString());
    	socket_at.send(ds);
    	Log.d(TAG, inet_addr.toString());
    	
    }
    
    public float get_float(byte[] data, int offset) {
        return Float.intBitsToFloat(get_int(data, offset));
    }
    
    public String byte2hex(byte[] data, int offset, int len) {
    	StringBuilder sb = new StringBuilder();
        for (int i = 0; i < len; i++) {
            String tmp = Integer.toHexString(((int) data[offset + i]) & 0xFF);
            for(int t = tmp.length();t<2;t++)
            {
                sb.append('0');
            }
            sb.append(tmp);
            sb.append(' ');
        }
        return sb.toString();
    }
    
    public synchronized int get_seq() {
    	return seq++;
    }
    
    public static synchronized void send_at_cmd(String at_cmd) throws Exception {
    	//System.out.println("AT command: " + at_cmd);    
    	at_cmd_last = at_cmd;
	byte[] buf_snd = (at_cmd + "\r").getBytes();
	DatagramPacket packet_snd = new DatagramPacket(buf_snd, buf_snd.length, inet_addr, AT_PORT);
	socket_at.send(packet_snd);

 	/* AR.Drone does not send back ack message (like "OK")
 	byte[] buf_rcv = new byte[64];
	DatagramPacket packet_rcv = new DatagramPacket(buf_rcv, buf_rcv.length);           
	socket_at.receive(packet_rcv);
	System.out.println(new String(packet_rcv.getData(),0,packet_rcv.getLength()));
	*/  	
    }
    


}


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

Ты там пиши код осторожнее, ходют слухи что четыре квадрокоптера в КРОК уже разбили, смотри как бы по результатам конкурса еще должен не остался. Какой бы миниатюрный нибыл, всё таки вертолёт, стоит недешево.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37991001
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, спасибо за информацию.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #37991004
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо команду создать, а денежки пополам
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38004776
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня работал над своей программой по управлению drone. Выполнил команду взлет-Take Off , вертолет поднялся на 0,8 метра, потому говорю посадка-Landing, он не реагирует. Еще раз попробовал взлет-посадка не реагирует - висит в воздухе и тихонько сдвигается к дивану. Вышел из программы, мысль пронеслась, что при прекращении связи с вертолетом, он сам сядет, типа - умный. Нет, висит в воздухе и потихоньку дрейфует к дивану. Адреналин начинает заполнять сознание, не могу сосредоточится, руки дрожат.

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

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

Шок. Потитоньку отходил минут десять.
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38004797
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, круто!! )
а чо видео не снял?
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38004816
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не до видео было. Как будто ушел за "горизонт событий"
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38004823
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erbolgНе до видео было. Как будто ушел за "горизонт событий"чето набрёл случайно
http://habrahabr.ru/post/149282/
...
Рейтинг: 0 / 0
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
AR.Drone квадрокоптер. Программирование на java и С
    #38071043
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался как можно понизить прошивку drone с помощью программы DroneControl HD 2.1

1. Устанавливаем соединение с internet
2. Входим в программу
3. Выбираем Tools Firmware
4. Выбираем Firmwate Manager
5. Выбираем Downloader
6. Затем выбираем нужную прошивку для AR.Drone 2

Затем подключаемся к сети AR.Drone и устанавливаем нужную прошивку
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38096477
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда мне надоедает разбираться с проблемами в программировании drone я читаю тему про multiwii

http://forum.rcdesign.ru/f123/thread221574.html

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

Направление вертолет берет у датчиков - гироскопа, магнитометра и акселерометра

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

Пусть надо передать квадрат пикселов 2*2. Каждый пиксел имеет три цветовые координаты R,G,B. Информацию необходимую для передачи цвета 4 пикселов можно представить в виде трех массивов

R1, R2, R3, R4

G1...G4

B1...B4

Пусть каждое значение имеет размер один байт, т.е.для передачи информации о цвете пикселов нужно 12 байтов

Более экономно передавать цветовую информацию с помощью цветового пространства YCrCb

Структура дискретизации описывается соотношением x:a:b

где x - частота дискретизации яркостного канала, a - число выборок каналов Cr, Cb в вертикальном направлении в первой строке, b - то же самое во второй строке

Если используется схема 4:2:0 , то для кодирования пикселов нужно 6 байт

Экономия в 2 раза
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38111428
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С помощью цветового пространства можно уменьшить количество байтов необходимых для кодирования цвета пиксела.

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

Например

WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWW
WWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW

Если мы применим простое кодирование длин серий к этой строке, то получим следующее:

12W1B12W3B24W1B14W

" http://ru.wikipedia.org/wiki/Кодирование_длин_серий " target="_blank"> http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BB%D0%B8%D0%BD_%D1%81%D0%B5%D1%80%D0%B8%D0%B9%22%5Dhttp://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BB%D0%B8%D0%BD_%D1%81%D0%B5%D1%80%D0%B8%D0%B9]http://ru.wikipedia.org/wiki/Кодирование_длин_серий"]http://ru.wikipedia.org/wiki/Кодирование_длин_серий

Отлично. Надо только найти схему преобразования кодов пикселов к форме где много повторяющихся символов. И такая форма есть, так называемое дискретно-косинусное преобразование

http://habrahabr.ru/post/102521/

http://en.wikipedia.org/wiki/JPEG

В результате получаем матрицу коэффициентов в которой после квантования нули скапливаются в правом нижнем углу

[img] http://e.bunker.kz/uploads/1355840426/gallery_13_4_425.png [/img]
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38111508
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь надо найти способ записи элементов матрицы в строку. Для этого используется Zigzag-упорядочение.







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

«Для всех организаторов проект стал настоящим зарядом позитива: столько у нас интересных, азартных и технически одаренных людей… Мы получили свыше 500 заявок, а именно 295 командных заявки и 241 от индивидуальных участников; проект активно обсуждается – и в Интернете, и в офлайне мы получаем массу вопросов. Очень надеюсь на то, что у участников все получится!», – поделился своими впечатлениями Алексей Добровольский, директор по разработке программного обеспечения компании КРОК.

Среди участников работники авиационного КБ, космической компании "Энергия" и пр.

Представление участников с ссылками на их страницы в vk.com
http://www.robots.croc.ru/heroes/team.php
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38116758
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Представление своего проекта участия в конкурсе от Гудина Владимира

http://robots.croc.ru/heroes/detail.php?ID=189
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38116759
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YouTube Video
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38118294
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YouTube Video
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38120779
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С программой YADrone я могу анализировать видео с drone

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

src/com.shigeodayo.ardrone.video/VideoManager.java

@
// And finally, convert the BGR24 to an Java buffered image
BufferedImage javaImage = Utils.videoPictureToImage(newPic);
int crgb = javaImage.getRGB(10, 10);
//String srgb = Integer.toString(crgb);
String srgb = Integer.toHexString(crgb);
System.out.println("RGB: " + srgb);
@
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38122838
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что и как. О программе YADrone

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


Всю конкретную работу по декодированию и оформлению приходящему с вертолета потоку видеоданных выполняет класс VideoManager, который является потомком класса AbstractTCPManager

У класса AbstractTCPManager четыре метда

public void connect(int port)
public void close()
protected void ticklePort(int port)
protected InputStream getInputStream()
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38125625
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обсуждение алгоритма перемещения по полигону



1. Задача локализации вертолета на готовой модели (карте) полигона сориентированной по компасу и GPS
2. Построение части карты - препятствие и квадрат посадки
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38126716
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня ipad 3, AR.Drone 2, AR.DroneFreeFlight 2.2 v. 2.2.7, Firmware 2.3.3

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

Входные параметры для алгоритма Хафа

1. входное изображение. Оно должно быть 8-битным, но будет трактоваться как двоичное изображение (т.е. все ненулевые значения пикселей будут восприниматься как равные единичные величины).

2. Количество возвращаемых линий

3. Следующие два параметра, rho и theta, устанавливают желательное разрешение для линий (т.е. разрешение плоскости накопителя). Параметр rho вычисляется в пикселях, а параметр theta – в радианах, поэтому плоскость накопителя можно рассматривать как двухмерную гистограмму с ячейками размерностью rho пикселей на theta радиан.

4. Значение параметра threshold определяет величину, которая должна быть достигнута на плоскости накопителя, чтобы сообщить о нахождении линии. Этот последний параметр на практике несколько мудрёный, при чем он не нормализуется, поэтому ожидается, что пользователь сам будет его масштабировать с ростом размерности входного изображения для алгоритма SHT. Этот параметр, в действительности, определяет количество точек (на входном изображении), которые должны поддерживать линию, чтобы линия была добавлена в возвращаемый список.

http://locv.ru/wiki/6.6.1_Преобразование_Хафа_для_линий

Пусть наше изображение состоит из пикселов двух типов - "фоновых" и "точек интереса". Допустим фоновые пикселы имеют белый цвет, а точки интереса - черный

Задача алгоритма Хафа состоит в нахождении прямых образованных точками интереса. Идея алгоритма состоит в нахождении прямых проходящих через "достаточное" количество точек интереса

Сканируем изображение сверху-вниз, слева-направо в поисках точек интереса, пикселов имеющих черный цвет

Если нашли "черный пиксел" то надо построить множество пар R, teta для прямых которые проходят через этот пиксел

Для примера имеем матрицу 7*7 пикселов. Для каждой точки интереса строим 20 прямых, с углами по отношению к оси x - 0.314, 0.628 и так далее с интервалом дискретизации по углу равным 0.314

Для каждой прямой ищем ортогональный к ней вектор из центра координат из уравнения

R = x*cos (teta) + y*sin (teta) , где x и y координаты точки интереса

Теперь собственно алгоритм заполнения аккумуляторной матрицы

Цикл по j от нуля до 2*PI с шагом dteta
teta = j*dteta
R = j*dteta
R1 = 0
k = 0
Пока |R1 - R| > dR/2
R1 = R1 +dR
k = k+1
Конец Пока
A[k][j] = A[k][j] + 1
Конец цикла по j

http://masters.donntu.edu.ua/2012/iii/lidke/diss/index.htm
http://www.ict.edu.ru/ft/002407/num1degt.pdf
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38134759
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка в алгоритме

R = Xi*cos(dteta) + Yi*sin(dteta)

вместо

R = j*dteta
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38134767
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложение для управления drone

http://www.msh-tools.com/ardrone/
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38135259
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для рисунка



имеем следующую табличку

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

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

2. Пролетаем через боковой проем в коридор2

3. Определяем расстояние до препятствия и положение проема в препятствии. Перемещаем робота прямо напротив проема и начинаем движение к препятствию

4. На расстоянии нескольких метров от препятствия снова позиционируем робота посередине проема и продолжаем движение с контролем расстояния от боковой стенки коридора

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

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

7. Взлет и движение по камере

8. Посадка
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38160070
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Определен список участников, прошедших во второй тур конкурса летающих роботов, организованного компанией КРОК. По итогам первой контрольной точки, в гонке остается 150 команд и 87 индивидуальных участников. В марте, мае и июле участники должны будут пройти еще три контрольные точки, а финальное соревнование состоится в августе 2013 года. Главный приз конкурса – 1 000 000 рублей*

http://www.robots.croc.ru/news/detail.php?ID=847
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38282402
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бывает такое , пишешь сообщение на форум , включаешь в него код и коротко описываешь алгоритм, кажется что все понятно читателю и нет необходимости подробно описывать алгоритм (идею) кода

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

Сейчас пишу программу для вертолета чтобы он летал по квадрату и решил воспользоваться кодом для поворота на фиксированный угол

Алгоритм такой

Постановка: Допустим нужно повернуться справа-налево (против часовой стрелки) на определенный угол.

Решение: Сначала измеряем текущий (начальный) угол, потом вычисляем конечный, то есть прибавляем к начальному углу значение угла на который требуется повернуть вертолет. Начинаем поворот, в цикле все время проверяем условие, что текущий угол меньше конечного. Если условие истинно то продолжаем поворот, если ложно то выходим из цикла

Такой способ работает если в процессе поворота не встретилась особая точка в которой угол поворота меняется скачком от плюс 180 до минус 180 градусов.

Что же делать если это случилось?

Допустим начальный угол равен 100 градусам, а повернуться надо на угол 90 градусов. Следуя нашему алгоритму складываем 100 и 90, получаем 190

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

Хотя это условие корректно с логической точки зрения при вращательном движении, в реальности, перед началом вращения, когда вертолет еще не среагировал на команду move3D(vx, vy, vz, vr), он будет шарахаться в разные стороны от своего начального направления в режиме hover (зависания в точке) и поэтому может случится, что условие будет выполнено в самом начале поворота и произойдет выход из цикла. Визуально это выглядит как микродерганье вертолета

Поэтому я использовал другое для установки флажка, который устанавливается в true при проходе "особой точки"

Код: sql
1.
2.
3.
4.
			if (angle_current < 0 && angle_prev > 170) {
				angle_current = angle_current + 360;
				flag = true;
			}



Это ключевое условие которое позволяет нам зафиксировать факт наличия "особой точки" в процессе измерения углов поворота и путем прибавления к измеренному отрицательному углу числа 360, получить положительное значение угла которое будет больше чем предыдущее значение

Зафиксировать наличие "особой точки" в программе можно с помощью логической переменной, которая будет менять свое значение если точка пройдена в процессе поворота. И далее для получения значения угла поворота к измеренному отрицательному значению будем прибавлять число 360

Сама процедура поворота на заданный угол выглядит следующим образом

Код: sql
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.
// Поворот на заданный угол
void ARDrone::loopCommand5(void)
{

	double angle_start, angle_finish, angle, angle_current, angle_prev;
	angle = 90; // угол поворота
	angle_start = getYaw()*RAD_TO_DEG; // начальный угол
	angle_prev = angle_start;
	angle_finish = angle_start + angle - 10; // конечный угол
	double vx = 0.0, vy = 0.0, vz = 0.0, vr = 1.0;
	boolean flag = false;

	while (1) {
		

		move3D(vx, vy, vz, vr);
		angle_current = getYaw()*RAD_TO_DEG; // текущий угол
		// если "особая точка" пройдена, то прибавляем к измеренному значению число 360
		if (flag) angle_current = angle_current + 360;
		// Если текущее и предыдущее значение углов не равны

		if (angle_current != angle_prev) {

			if (angle_current < 0 && angle_prev > 170) {
				angle_current = angle_current + 360;
				flag = true;
			}

			if (angle_current >= angle_finish) break;
			
		}
		angle_prev = angle_current;

		msleep(1);
	}
	vx = 0.0, vy = 0.0, vz = 0.0, vr = 0.0;
	move3D(vx, vy, vz, vr);
}



Еще нужно сделать такое замечание. Хотя повернуть в данном случае вертолет нужно на 90 градусов, формула для расчета конечного угла выглядит так

angle_finish = angle_start + angle - 10; // конечный угол

Видно что из угла вычитается 10 градусов. Это связано с инерцией срабатывания двигателей вертолета. То есть команда остановки выполняется не сразу, с запозданием. Поэтому нужно выдавать с упреждением
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38289085
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысл параметров функции cvHoughLines2

Параметры rho и theta функции cvHoughLines2, используются при создании аккумуляторной матрицы. Определяют число элементов матрицы.

Из всех параметров функции самым важным для нахождения линий на рисунке является параметр threshold.

threshold — пороговый параметр. Линия возвращается, если аккумулирующий параметр больше порогового значения. Изменяя его значение изменяем чувствительность функции к линиям отображенным на рисунке

С помощью алгоритма Canny можно искать границы (контуры) предметов изображенных на рисунке.

Если на рисунке провести линию, то ее контуром будет прямоугольник. Вот так

Сам рисунок



Результат , после обработки функцией cvCanny



В данном случае интенсивность пиксела меняется сверху и снизу от прямой , поэтому Canny рисует две линии, сверху и снизу от исходной линии.

Если исходная картинка такая



то после обработки функцией cvCanny получим

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



Вот картинка с изображением полученная с вертолета и на нее выводятся данные с сенсоров

Хочу еще сделать окно в которое будет выводится информация в виде векторов мгновенной скорости и текущего значения вектора перемещения
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38346214
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
puku0x обновил свой проект cvdrone. Библиотеки используемые для работы с изображениями и для работы с видео обновил и изменил код класса ardrone для работы с новыми библиотеками. Добавлена новая структура данных в описание пакета навигационных данных для работы с GPS

https://github.com/puku0x/cvdrone
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38367005
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Китайцы победили

http://iarc.angel-strike.com/

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

Сегодня лидером оказался дрон команды Robodem с результатом 6:45

https://twitter.com/Gagarin_project/status/371226319213699072
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38376831
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видео полета команды Robodem

YouTube Video
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38376849
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erbolg,
а как сделан вот этот робот? И в чём отличие (аппаратная...программная часть), если он по характеристикам поживее IMHO будет.
YouTube Video
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38376870
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Robodem , поздравляю !!!
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38376873
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 ,

У этого робота сенсоры расположены вовне и обработка данных тоже не на нем происходит. Шустрая железяка.

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

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



Картинка после калибровки камеры

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

1. Первый алгоритм. Метка - белая полоса на черной. Drone увидев полосу через вертикальную камеру тормозит и останавливается

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

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

Используемое устройство - AR.Drone 2.0
ПО - Visual C++ и и проект Puku

Условия конкурса http://www.robots.croc.ru/about/

Обсуждение различных проблем связанных с проведением конкурса

http://forum.rcdesign.ru/f123/thread291488.html

Мои темы связанные с программированием летающих роботов

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

YouTube Video
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38397444
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erbolgVisual C++
а Java каким боком?
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38398566
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас никаким. Первые программы были на java
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38485607
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amazon планирует доставлять товары автономными дронами

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

Vanishing point detection sample based on
http://dasl.mem.drexel.edu/wiki/index.php/Vanishing_point_detection_for_corridors_and_hallways

Напомню, что в этом алгоритме на картинке получаемой от робота выбираются прямые линии удовлетворяющие условию

angle1 < fabs(m) < angle2

где m = -ctg(teta), где teta это угол между прямой линией и осью х

У меня angle1 = 0.3, angle2 =10.0

То есть отбрасываются линии которые близки к горизонтальным и вертикальным направлениям на картинке

В результате обработки картинки получаем так называемую "точку схода". Ее положение на картинке можно использовать для контроля направления зрения камеры относительно стенок лабиринта

Если х-координата "точки схода" совпадает с центром картинки, то камера параллельна стенкам лабиринта

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

В нашем случае каждый элемент последовательности хранит два числа - угол прямой к оси х и длину перпендикуляра от начала координат к прямой

CvSeq *lines = cvHoughLines2(canny_out, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, th3);

Количество возвращаемых элементов задано с помощью функции MIN( a, b ), она возвращает минимальное значение из пары величин a и b

Для обработки параметров найденных линий используем цикл

for (int i = 0; i < MIN(lines->total,20); i++ )

где lines->total это число элементов в последовательности lines
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38529235
erbolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угловой обзор горизонтальной камеры - 92 градуса. Камера робота как и глаз человека измеряет именно угловые размеры объекта

Допустим мы имеем картинку от робота размером n*m пикселов, где n - ширина картинки, m - высота картинки

Пусть q - ширина объекта на картинке, тогда угловой размер объекта равен q*92/n

Алгоритм "точка схода" дает координаты точки. Можно определить угол поворота робота вокруг вертикальной оси

Зная координату х точки схода можно определить расстояние от точки схода до центра картинки следующим образом

d = x - x0

x0 - координата центра картинки
x - координата точки схода

Пусть

psi = d * 92 / width

где width - ширина картинки в пикселах

тогда угол psi будет давать отклонение камеры от оси коридора лабиринта
...
Рейтинг: 0 / 0
AR.Drone квадрокоптер. Программирование на java и С
    #38531498
MsDatabaseru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
программирование контроллеров ботов штука занятная,
только стоит ли вкладываться своим временем, знаниями в ардрон?
с точки зрения полетных характеристик - как игрушка да, как реальный бот - нет
ни полетного времени ни грузоподъемности.
Опять же если переставлять контроллер на крупную раму - не факт что "ядро" по контроллера не залочит функционал при других масштабах высоты полета, дальности итд, позволит управлять более мощными регуляторами оборотов моторов (у ардрона если неошибаюсь свои регуляторы управляемые по i2c в собственном протоколе)

при серьезном подходе лучше инвестировать свои трудозататы в свой полетный контроллер
а стартануть можно было бы с чегонить неплохого опенсоурсного
например с arducopter. конечно же arduino atmega2560 не потянет обработку видео,
но arducopter уже портирован на скоростные ARM процессоры (контроллер PX4 и еще какието там)
...
Рейтинг: 0 / 0
92 сообщений из 92, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / AR.Drone квадрокоптер. Программирование на java и С
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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