Dji Mobile SDK 基础实现(二)

本文简要介绍如何通过调用DJI Mobile SDK,实现获取和释放无人机的控制权限、模拟遥控器按钮控制无人机的飞行、获取无人机的回传视频、获取无人机参数、实现和onboard SDK的数据透传。

下面逐个介绍以上内容,余下内容在前面文章已作介绍(文章末尾附上GitHub链接):

  • 获取无人机的回传视频
  • 获取无人机参数
  • 实现和onboard SDK的数据透传

获取无人机的回传视频


1、调用并实例化TextureView控件,并在调用类中实现SurfaceTextureListener接口;

2、设置回调接口并初始化回传视频:

  /**
 *设置回调接口 
*/
  protected DJICodecManager mCodecManager = null;//视频编码
  private DJIFlightControllerDelegate.FlightControllerReceivedDataFromExternalDeviceCallback mRecvCallback = null;
  protected CameraReceivedVideoDataCallback mReceivedVideoDataCallBack = null;
  protected DJIOnReceivedVideoCallback mOnReceivedVideoCallback = null;
  private DJIBaseProduct mProduct = null;//无人机实例
//设置视频的回调
         mReceivedVideoDataCallBack = new CameraReceivedVideoDataCallback() {
             @Override
            public void onResult(byte[] videoBuffer, int size) {
                 count++;
                 if (mCodecManager != null) {
                         mCodecManager.sendDataToDecoder(videoBuffer, size);
                 } else {
                     Log.e(TAG, "mCodecManager is null");
                 }
             }
         };

 /**
 *初始化回传视频
 */
 private void initVideo() {
         try {
             mProduct = VirtualStickApplication.getProductInstance();
         } catch (Exception exception) {
             mProduct = null;
         }

         if (null == mProduct || !mProduct.isConnected()) {
             mCamera = null;
         } else {
             if (null != mVideoSurface) {
                 mVideoSurface.setSurfaceTextureListener(this);
             }

             if (!mProduct.getModel().equals(Model.UnknownAircraft)) {
                 mCamera = mProduct.getCamera();
                if (mCamera != null) {
                     mCamera.setDJICameraReceivedVideoDataCallback(mReceivedVideoDataCallBack);
                 }
             } else {
                 if (null != mProduct.getAirLink()) {
                     if (null != mProduct.getAirLink().getLBAirLink()) {
                         // Set the callback
                         mProduct.getAirLink().getLBAirLink().setDJIOnReceivedVideoCallback(mOnReceivedVideoCallback);
                         mProduct.getAirLink().getLBAirLink().setFPVQualityLatency(DJILBAirLink.LBAirLinkFPVVideoQualityLatency.LowLatency,new DJIBaseComponent.DJICompletionCallback() {
                             @Override
                             public void onResult(DJIError djiError) {
                                if (djiError != null)
                                     VirtualStickApplication.logError("setFPVQualityLatency()error:", djiError);
                             }
                        });
                     }
                 }
             }
         }
     }

获取无人机参数


获取获取无人机的剩余电量,以百分比的形式返回

private DJIBaseProduct mProduct = null;//无人机实例
   try {
                  mProduct = VirtualStickApplication.getProductInstance();
              } catch (Exception exception) {
                  mProduct = null;
              }
              if(mProduct != null && mProduct.isConnected()) {
                  //获取无人机的剩余电量,以百分比的形式返回
                  try{
                     mProduct.getBattery().setBatteryStateUpdateCallback(new DJIBattery.DJIBatteryStateUpdateCallback() {
                         @Override
                         public void onResult(DJIBatteryState djiBatteryState) {
                             if(djiBatteryState == null){
                                 VirtualStickApplication.logInfo("电量为空");
                             }else{
                                 StringBuffer mBuffer = new StringBuffer();
                                 mBuffer.append(djiBatteryState.getBatteryEnergyRemainingPercent());
                                 tvBattery.setText(mBuffer.toString()+"%");
                                 if(djiBatteryState.getBatteryEnergyRemainingPercent() != 0 && djiBatteryState.getBatteryEnergyRemainingPercent() <= 30){
                                      if(entry){
                                           AlertDialog.Builder builder =  new  AlertDialog.Builder(VirtualStickActivity.this);
                                           builder.setTitle("警告" )
                                                   .setMessage("电池电量不足!" )
                                                   .setPositiveButton("确认" ,  null )
                                                   .setNegativeButton("取消" , null)
                                                   .show();
                                           entry = false;
                                       }
                                 }else{
                                     entry = true;
                                 }
                             }
                         }
                     });
                 }catch(Exception e){
                     Toast.makeText(VirtualStickActivity.this,"1"+e.toString(),Toast.LENGTH_LONG).show();
                     e.printStackTrace();
                 }

获取飞行器所在所在高度、飞行速度、无人机姿态、GPS信号 
1、获取flightController 对象;

 DJIFlightController flightController;
  public void setAircraft(DJIBaseProduct djiAircraft){
          if(djiAircraft==null){
 
              return;
          }
         flightController=((DJIAircraft)djiAircraft).getFlightController();
          if(flightController!=null) {
  
         }
 
     }

2、通过flightController对象调用方法获取飞行器所在所在高度、飞行速度、无人机姿态、GPS信号; 
所在高度

   public String getHeight(){
        if(flightController != null){
            DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
            if (currentState != null) {
                return currentState.getAircraftLocation().getAltitude() + "";
            }
        }
        return null;
    }

飞行速度

//获取前后速度
      public String getX(){
          if(flightController != null){
          DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
              if (currentState != null) {
                  currentState.getGpsSignalStatus();
                  return currentState.getVelocityX() + "";
              }
          }
 
         return null;
     }
 
     //获取左右速度
    public String getY(){
         if(flightController != null){
             DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
             if (currentState != null) {
                 return currentState.getVelocityY() + "";
             }
         }
         return null;
     }
 
     //获取上下速度
     public String getZ(){
         if(flightController != null){
            DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
             if (currentState != null) {
                 return currentState.getVelocityZ() + "";
             }
         }
        return null;
     }

 

 

 

 无人机姿态(roll、yaw、pitch)

 

public String getYaw(){
         if(flightController != null){
              DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
              if (currentState != null) {
                  return "pitch:"+currentState.getAttitude().pitch+"  Yaw:"+currentState.getAttitude().yaw
                          +"  Roll:"+currentState.getAttitude().roll;
              }
          }
          return null;
     }

 

GPS信号

 public String getGPS(){
        if(flightController != null){
            DJIFlightControllerDataType.DJIFlightControllerCurrentState currentState = flightController.getCurrentState();
            if (currentState != null) {
                  return currentState.getGpsSignalStatus().value()+"";
            }
        }
        return null;
    }

 

实现和onboard SDK的数据透传


发送数据到onboard SDK device 
1、获取flightController 对象,如上所示; 
2、通过flightController对象调用响应函数实现数据发送; 

public void sendDataToOnboard(byte[] data){
              if(flightController.isOnboardSDKDeviceAvailable()){
                  flightController.sendDataToOnboardSDKDevice(data, new DJIBaseComponent.DJICompletionCallback() {
                      @Override
                      public void onResult(DJIError djiError) {
                          if(djiError!=null) {
                              VirtualStickApplication.logError("SendDataToOnBoard error:", djiError);
                          }else{
                              VirtualStickApplication.logInfo("发送指令成功!");
                         }
                     }
                 });
             }
         }
     }

从onboard SDK获取数据 
1、获取flightController 对象,如上所示; 
2、通过flightController对象调用响应函数实现数据回传;

 

  /**
  *设置回调接口
  */
  flightController.setReceiveExternalDeviceDataCallback(flightControllerReceivedDataFromExternalDeviceCallback);
  /**
  *初始化并接受回传数据
  */
   flightControllerReceivedDataFromExternalDeviceCallback = new DJIFlightControllerDelegate.FlightControllerReceivedDataFromExternalDeviceCallback() {
              @Override
             public void onResult(byte[] bytes) {
 
             }
         };

 

注意事项: 
  1、在向onboard SDK device发送数据时,发送的数据需要调用String.getbytes(),转换为byte[]类型的数据; 
  2、在onboard device端,由于接收到的数据为int8类型的,因此需要强制转换为char类型的数据,再减去 ‘0’才可得到发送的值; 
  3、接收到的数据需要进行组装才可得到大于一位的数据。


[Github链接](https://github.com/MrJoeyM/sky-app)

欢迎关注我的公众号:

编程技术与生活(ID:hw_cchang)

 

DJI Thermal SDK大疆热成像摄像头的软件开发工具包,旨在帮助开发者实现与热成像摄像头相关的功能和应用。以下是关于如何使用 DJI Thermal SDK 的教程: 第一步,下载和安装 DJI Thermal SDK:访问大疆官方网站,进入开发者页面,下载 Thermal SDK 并按照指示进行安装。 第步,创建一个新的项目:使用开发工具(如 Android Studio)创建一个新的项目,并配置 SDK 的基本设置。确保你已经添加了 Thermal 相机 dependenciy。 第三步,初始化和连接热成像摄像头:在你的项目代码中,实例化一个 DJIThermalSession 对象,并使用 connect() 方法连接到摄像头。确保你已经将设备与手机或平板电脑成功地连接。 第四步,获取热成像图像:通过设置回调函数或定期轮询的方式,从热成像摄像头中获取数据流或图像帧。你可以将这些图像用于进一步的处理或分析,如温度测量或热成像图像显示。 第五步,实现其他功能:根据你的需求,可以使用 SDK 中的其他功能和方法来扩展你的应用程序。例如,你可以使用相机的控制方法调整图像的亮度、对比度或中心温度,或者使用图像处理方法应用滤波或增强算法。 第六步,测试和调试:在真实场景中测试你的应用程序,并根据需要进行调试和优化。确保你的应用程序能够准确地获取并处理热成像图像,并满足项目的要求。 总结:使用 DJI Thermal SDK 可以帮助开发者创建与热成像摄像头相关的应用程序。通过下载和安装 SDK,初始化和连接热成像摄像头,获取热成像图像,实现其他功能以及测试和调试,你可以成功地开发出满足需求的应用程序。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cchangcs

谢谢你的支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值