Как получить Parrot AR.Drone 2.0 fly? Произошла ошибка состояния
Я пытаюсь реализовать javadrone (AR.Drone Java API) в моем проекте. Тем не менее, произошла ошибка изменения состояния, когда я компилирую свой Java-код и пытаюсь его запустить. Мне удалось отправить команду в AR.Drone и вылететь впервые. После успешного взлета в первый раз, он не взлетит снова из-за ошибки "состояние изменено". Я понятия не имею, что пошло не так в моем коде. Пожалуйста, помогите мне. Спасибо! В этом проекте требуется 3 файла. Мой java-файл (arDroneFrame.java),NavData.java(из javadrone) и ARDrone.java(из javadrone). Основной java-файл: arDroneFrame.java. Когда я нажимаю кнопку TakeOff, она должна заставить AR.Drone летать и приземляться после этого.
В моем arDroneFrame.java,
private void jButtonTakeOffActionPerformed(java.awt.event.ActionEvent evt) {
com.codeminders.ardrone.ARDrone drone;
try{
drone = new com.codeminders.ardrone.ARDrone();
drone.connect();
drone.clearEmergencySignal();
// Wait until drone is ready
drone.waitForReady(CONNECT_TIMEOUT);
// do TRIM operation
drone.trim();
// Take off
System.err.println("Taking off");
drone.takeOff();
// Fly a little :)
Thread.sleep(5000);
//Land
System.err.println("Landing");
drone.land();
// Give it some time to land
Thread.sleep(2000);
// Disconnect from the done
drone.disconnect();
} 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);
}
}
В ARDrone.java я закомментировал некоторое кодирование Java. Это потому, что только когда я закомментирую этот код Java, он может работать только. Если я раскомментирую их, моя программа застрянет там (вообще не отвечает).
public void waitForReady(long how_long) throws IOException
{
/*long since = System.currentTimeMillis();
synchronized(state_mutex)
{
while(true)
{
if((System.currentTimeMillis() - since) >= how_long)
{
try
{
disconnect();
} catch(IOException e)
{
}
// Timeout, too late
throw new IOException("Timeout connecting to ARDrone");
} else if(state == State.DEMO)
{
return; // OK! We are now connected
} else if(state == State.ERROR || state == State.DISCONNECTED)
{
throw new IOException("Connection Error");
}
long p = Math.min(how_long - (System.currentTimeMillis() - since), how_long);
if(p > 0)
{
try
{
state_mutex.wait(p);
} catch(InterruptedException e)
{
// Ignore
}
}
}
}*/
while(state == State.DEMO)
{
System.out.println("Changed to DEMO !");
return; // OK! We are now connected
}
}
Выход программы:
126 [Thread-7] DEBUG ardrone.ARDrone - State changed from TAKING_OFF to ERROR with exception
java.lang.NullPointerException
at com.codeminders.ardrone.NavData$FlyingState.fromControlState(NavData.java:58)
at com.codeminders.ardrone.NavData.getFlyingState(NavData.java:622)
at com.codeminders.ardrone.ARDrone.navDataReceived(ARDrone.java:431)
at com.codeminders.ardrone.NavDataReader.run(NavDataReader.java:92)
at java.lang.Thread.run(Thread.java:745)