powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / AR.Drone квадрокоптер. Программирование на java и С
25 сообщений из 92, страница 1 из 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
25 сообщений из 92, страница 1 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / AR.Drone квадрокоптер. Программирование на java и С
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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