2015-04-16 1 views
1

Я работаю над приложением AR.Drone 2.0. Я использую javadrone API и библиотеку в своем проекте. Вот моя проблема с кодом: всякий раз, когда я нажимаю кнопку TakeOff в своем приложении, он будет продолжать отправлять команды взлета на беспилотный. И он игнорирует выпуск следующей команды AT, которую я хотел отправить. Например, я подключаюсь к drone, нажимаю кнопку TakeOff (он должен отправить AT TakeOffCommand, он отлично работает), но следующая команда (например, Flying Up) не выдаст & отправку на drone. Почему это происходит? Любая идея, что вызывает эту ошибку?Отправка команды AT TakeOffCommand [ID = REF, param =, 290718208] нон-стоп

My Java Code: 
     **Connect Button in my apps** 
     private void jButtonConnectActionPerformed(java.awt.event.ActionEvent evt) {            

     try { 
      // Create ARDrone object, 
      // connect to drone and initialize it. 
      drone = new ARDrone(); 
      drone.playLED(10,10,10); 
      drone.connect(); 
      drone.clearEmergencySignal(); 

      // Wait until drone is ready 
      drone.waitForReady(CONNECT_TIMEOUT); 
      System.err.println("Drone State: " + drone.getState()); 
      // do TRIM operation 
      drone.trim(); 
     } catch (UnknownHostException ex) { 
      Logger.getLogger(arDroneFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(arDroneFrame.class.getName()).log(Level.SEVERE, null, ex); 
     }    
    } 

    **Take Off Button in my apps** 
    private void jButtonTakeOffActionPerformed(java.awt.event.ActionEvent evt){ 
    try 
    {  
     // Take off 
     System.err.println("Taking off"); 
     drone.takeOff(); 
     Thread.sleep(5000); 
     }catch (IOException ex) { 
      Logger.getLogger(arDroneFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(arDroneFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    **Flying Up Button in java apps:** 
    private void jButtonUpActionPerformed(java.awt.event.ActionEvent evt) {           

    try 
     {   
      // Flying Up 
      drone.playAnimation(1,10); 
      drone.move(0,0,5,0); 
      // Fly a little :) 
      Thread.sleep(5000);     
     } catch (UnknownHostException ex) { 
      Logger.getLogger(arDroneFrame.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(arDroneFrame.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(arDroneFrame.class.getName()).log(Level.SEVERE, null, ex); 
    }           
} 

**Output here:** 
Current Drone State : CONNECTING 
Taking off 
6819 [AWT-EventQueue-0] DEBUG ardrone.ARDrone - State changed from CONNECTING to TAKING_OFF 
6819 [Thread-6] DEBUG ardrone.CommandSender - Q[1]Sending AT command TakeOffCommand [ID=REF, param=,290718208] 
Take off command! 
7028 [Thread-6] DEBUG ardrone.CommandSender - Q[1]Sending AT command TakeOffCommand [ID=REF, param=,290718208] 
7129 [Thread-6] DEBUG ardrone.CommandSender - Q[1]Sending AT command TakeOffCommand [ID=REF, param=,290718208] 
7230 [Thread-6] DEBUG ardrone.CommandSender - Q[1]Sending AT command TakeOffCommand [ID=REF, param=,290718208] [These TakeOff AT commands will continuously send to drone] 
Flying Up! 
TakeOffCommand [ID=REF, param=,290718208] 
Movement Command Sending! 
0.0 
0.0 
5.0 
0.0 
9847 [Thread-6] DEBUG ardrone.CommandSender - Q[2]Sending AT command TakeOffCommand [ID=REF, param=,290718208] <--Why it still sending TakeOffCommand instead of MoveCommand ? 
Movement Command Sent Done! 
9947 [Thread-6] DEBUG ardrone.CommandSender - Q[3]Sending AT command TakeOffCommand [ID=REF, param=,290718208] 
10047 [Thread-6] DEBUG ardrone.CommandSender - Q[3]Sending AT command TakeOffCommand [ID=REF, param=,290718208] 

Я работаю над этим кодом в течение нескольких недель и не может идентифицировать проблему. Пожалуйста, помогите мне решить эту проблему. Большое спасибо.

ответ

0

Это поведение в порядке и даже необходимо. Из AR.Drone Developer Guide:

Есть два случая, когда локальная (на стороне клиента) счетчика последовательности должны быть сброшены:

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

Так беспилотник должен получить что-то из вашего приложения через каждые 50 миллисекунд, чтобы продолжать работать в обычном режиме. SDK, которые я видел, обычно отправляют команды REF и/или PCMD. javadrone, похоже, спроектирован по-разному и отправляет сообщения COMWDG (сторожевые устройства связи) для предотвращения тайм-аутов).

[ред включать небольшую рабочую программу испытаний]

Я не знаю, почему ваш код не работает, но вот пару вещей, которые вы можете попробовать:

  • I см. вы звоните playLED, прежде чем вы действительно подключитесь к гуду; , вы, вероятно, не хотите этого делать.
  • Я считаю, что аргументы move должны быть поплавков в диапазоне [0,0, 1,0] - Вы называете его 5.

Вот короткая программа, которая взлетает, а затем начинает двигаться в обратном направлении , Я протестировал его на своем AR.Drone 2.0 со свежей проверкой и построил javadrone, и он работает. Существует множество исключений, но он работает: javadrone на данный момент довольно устарел и в первую очередь нацелен на AR.Drone 1.0. Во-первых, кажется, что он не может разобрать навдату беспилотника.

Когда я запускаю эту программу, я вижу, что она посылает команды REF с того времени, когда я расскажу о беспилотном взлете, пока беспилотный корабль не закончит взлететь.Затем он отправляет команды COMWDG до тех пор, пока код не сообщит, чтобы drone переместился, и в этот момент он отправляет PCMD, а затем COMWDG сообщений.

Я рекомендую попробовать эту программу с вашим дроном, чтобы узнать, работает ли она. Убедитесь, что вы используете новую проверку javadrone.

import com.codeminders.ardrone.ARDrone; 
import java.io.IOException; 
import java.net.UnknownHostException; 

public class DroneTest { 

    private static final long CONNECT_TIMEOUT = 10000L; 

    public static void main(String[] args) { 
    try { 
     ARDrone drone = new ARDrone(); 
     drone.connect(); 

     // Wait until drone is ready 
     drone.waitForReady(CONNECT_TIMEOUT); 

     drone.clearEmergencySignal(); 
     System.err.println("Drone State: " + drone.getState()); 
     // do TRIM operation 
     System.err.println("**********\nTRIM\n**********"); 
     drone.trim(); 
     Thread.sleep(5000); 

     System.err.println("**********\nTAKEOFF\n**********"); 
     drone.takeOff(); 
     Thread.sleep(10000); 

     System.err.println("**********\nMOVE\n**********"); 
     drone.move(0.0f, 0.5f, 0.0f, 0.0f); 

    } catch (UnknownHostException ex) { 
     System.err.println(ex); 
    } catch (IOException ex) { 
     System.err.println(ex); 
    } catch (InterruptedException ex) { 
     System.err.println(ex); 
    } 
    } 
} 
+0

Thanks John за то, что указал на это важное сообщение. Да, я тоже это заметил. Тем не менее, эта проблема влияет на мою следующую летную инструкцию для беспилотных летательных аппаратов. Как только я подключился к дрону с помощью команды drone.takeOff(), он просто игнорирует другие команды AT, которые я отправил. На самом деле, похоже, он застрял в команде Sending AT TakeOffCommand [ID = REF, param =, 290718208]. Например, я пролетаю вверх/вниз (шаг вверх/вниз) или поворачиваю влево/вправо. Приложения просто продолжают отправлять TakeOffCommand вместо правильной команды. Любая идея, что произойдет и как это решить? Ваш ответ очень ценится! –

+0

Что должно произойти, когда вы укажете дрону двигаться вверх/вниз/влево/вправо/и т. Д. следует также начать отправку PCMD. Команды REF не являются проблемой, но если она не отправляет PCMD, это проблема. Можете ли вы опубликовать остальную часть своего кода, которая не работает? –

+0

После подключения к беспилотнику предположим, что я могу выпустить любые простые команды полета, такие как движение вверх/вниз/влево/вправо/и т. Д. Беспилотник должен реагировать соответствующим образом. Однако он не отправляет соответствующие команды REF и/или PCMD после нажатия кнопки TakeOff, как я упоминал выше. Он продолжает посылать команды взлета бесконтрольно. Если я нажму кнопку «Вверх», предположим, что вы отправляете команду MoveCommand-PCMD. Но он не выдаёт MoveCommand, тогда как команда takeoff просто продолжает отправлять. –

Смежные вопросы