Parrot AR.Drone 2.0 - JavaDrone(获取无人机详细信息E.G.电池电量,海拔高度,速度等)?

时间:2015-06-18 06:19:14

标签: java ar.drone

我正在研究Parrot AR。无人机项目。这些库是从JavaDrone网站(https://code.google.com/p/javadrone/downloads/list)下载并在该项目中实现的。但是,虽然我确实包含了所有正确的库并且正确调用了类来获取方法,但它仍然无法返回正确的信息。返回的所有结果似乎都是" false"。知道这段代码发生了什么吗?请帮帮我:(

所以我做的是我有2个按钮:(i)连接(ii)取下按钮。 Connect按钮功能用于建立与无人机的连接,而Take off按钮用于使无人机飞行移动一点并返回无人机的NAV导航数据。遗憾的是,所有返回的资产净值数据似乎都不起作用。

注意:此代码在代码编译时工作正常。但它只是不能回报我正确的&来自无人机的有效资产净值数据。

private void jButtonConnectActionPerformed(java.awt.event.ActionEvent evt) {    
          System.out.println("Connect?");
          drone = new ARDrone();
          data = new NavData();
          drone.playLED(10,10,10);
          drone.connect();
          drone.clearEmergencySignal();

          System.err.println("Ready to connect!!");
          // Wait until drone is ready
          drone.waitForReady(CONNECT_TIMEOUT);
          System.err.println("Drone State: " + drone.getState());
          // do TRIM operation
          drone.trim();  
          System.err.println("Congratulation! You have connected to Drone!");
          System.out.println("You can issue flight commands now!");
          batteryStatus.setText("0" + "%");
          batteryStatus.setForeground(Color.ORANGE);       
          batteryStatus.setText("" + data.getBattery());
    }

 private void jButtonTakeOffActionPerformed(java.awt.event.ActionEvent evt) {  
       System.err.println("Current Drone State : " + drone.getState().toString());           
       System.err.println("Taking off");
       drone.takeOff();
       Thread.sleep(4000);
       System.err.println("**********\nMOVE\n**********");
       drone.move(0.0f, 150.5f, 500.0f, 0.0f);
       Thread.sleep(1000);            
       System.err.println("******************************************");
       System.err.println("Drone Infomation"); 
       System.err.println("Battery Too High ? " + data.isBatteryTooHigh());
       System.err.println("Battery Too Low ? " + data.isBatteryTooLow());
       System.err.println("Drone Flying ? " + data.isFlying());
       System.err.println("Control Received ? " + data.isControlReceived());
       System.err.println("Motor Down ? " + data.isMotorsDown());
       System.err.println("Not Enough Power ?" +  data.isNotEnoughPower());
       System.err.println("Trim Received ? " + data.isTrimReceived());
       System.err.println("Trim Running? " + data.isTrimRunning());
       System.err.println("Trim succeded? " + data.isTrimSucceeded());
       System.err.println("PIC Number OK? "+ data.isPICVersionNumberOK());
       System.err.println("******************************************");
       Thread.sleep(5000);
       drone.sendAllNavigationData();
       drone.land();
}

输出

******************************************
Drone Infomation
Battery Life: 0.0%
Battery Too High ? false
Battery Too Low ? false
Drone Flying ? false
Control Received ? false
Motor Down ? false
Not Enough Power ?false
Trim Received ? false
Trim Running? false
Trim succeded? false
PIC Number OK? false
********************************************

更新 我所做的是按照约翰的建议。我确实实现了所有必要的方法和NavDataListener来从无人机获取NavData。

    import com.codeminders.ardrone.ARDrone;
    import com.codeminders.ardrone.ARDrone.VideoChannel;
    import com.codeminders.ardrone.NavData;
    import com.codeminders.ardrone.NavDataListener;

    public class arDrone extends javax.swing.JFrame implements Runnable, NavDataListener{

    public ARDrone drone;
    public NavData data = new NavData();

    public arDrone(String text) {
       //FreeTTS speech text
       this.text=text;          
     }

    public arDrone() {
      initComponents(); 
      setIcon();
      initDrone();
    }

    private void initDrone() {
       try {
         drone = new ARDrone();
         data = new NavData();
         drone.addNavDataListener(this);
       } catch (UnknownHostException ex) {                        
         System.err.println(ex);
         return; 
       }      
   }

    public void navDataReceived(NavData nd) {
        System.err.println("Testing navDataReceived is running...");
        updateBatteryStatus(nd.getBattery());
        this.flying.set(nd.isFlying());
    }

    private void updateBatteryStatus(final int value) {
        java.awt.EventQueue.invokeLater(new Runnable() {      
        @Override
        public void run() {       
            batteryStatus.setText(value + "%");
            if (value < 15) {
                batteryStatus.setForeground(Color.RED);
            } else if (value < 50) {
                batteryStatus.setForeground(Color.ORANGE);
            } else {
                batteryStatus.setForeground(Color.GREEN);
            }
          }
       });
     }

2 个答案:

答案 0 :(得分:0)

您是否设置了无人机IP地址?根据消息来源,无人机的默认IP是192.168.1.1。

您可以调用另一个构造函数来设置IP:

drone = new ARDrone(InetAddress.getByName("xxx.xxx.xxx.xxx"));

将xxx.xxx.xxx.xxx替换为实际的无人机IP。

答案 1 :(得分:0)

问题是你没有做任何实际获得navdata的事情。您不能只创建一个Exception in thread "main" java.lang.RuntimeException: Unable to instantiate MessageBodyReader at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1371) at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1310) at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1232) at org.jboss.resteasy.spi.ResteasyProviderFactory.register(ResteasyProviderFactory.java:2364) at org.jboss.resteasy.spi.ResteasyProviderFactory.register(ResteasyProviderFactory.java:97) at org.jboss.resteasy.util.FeatureContextDelegate.register(FeatureContextDelegate.java:37) at org.jboss.resteasy.util.FeatureContextDelegate.register(FeatureContextDelegate.java:12) at org.glassfish.jersey.media.multipart.MultiPartFeature.configure(MultiPartFeature.java:65) at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1673) at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1310) at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1232) at org.jboss.resteasy.spi.ResteasyProviderFactory.register(ResteasyProviderFactory.java:2364) at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.register(ResteasyClientBuilder.java:361) at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.register(ResteasyClientBuilder.java:48) at cKanTest.CkanAlpha.main(CkanAlpha.java:17) Caused by: java.lang.IllegalArgumentException: Unable to find a public constructor for provider class org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide at org.jboss.resteasy.spi.ResteasyProviderFactory.createConstructorInjector(ResteasyProviderFactory.java:2184) at org.jboss.resteasy.spi.ResteasyProviderFactory.createProviderInstance(ResteasyProviderFactory.java:2173) at org.jboss.resteasy.spi.ResteasyProviderFactory.addMessageBodyReader(ResteasyProviderFactory.java:748) at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1366) ... 14 more 对象,并希望用有效数据填充它 - 它不会。

您需要使用NavData界面。

  1. 实施NavDataListener interface, and the navDataReceived method
  2. 使用ARDrone method addNavDataListener添加您的听众。
  3. 使用com.codeminders.ardrone.NavDataListener方法 您将收到带有有效遥测数据的NavData对象。