0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Mobile SDK V5版固件开发大疆无人机手机端遥控器(4)

jf_Vqngj70R 来源:美男子玩编程 2023-06-25 12:24 次阅读

概要

相较与V4版本开发,V5版本有了更方便简介的方式。V5不仅再功能上与V4增加更多的功能,而且在功能的使用及API的调用也做了优化。虽然V5现在很新也在不断地迭代,但是不免会出现对一些飞行或者遥控器出现bug,大疆的开发人员也在不断的完善这整个V5开发包,已提供更全更优的开发模式。下面是使用V5开发包进行的大疆无人机飞控系统的开发过程。

整体架构流程

DJI Mobile SDK V5拥有更加简洁易用的无人机硬件控制接口和软件服务接口,开放全开源的生产代码及 Sample 和丰富的教程,为开发者提供了具有竞争力的无人机移动端解决方案,极大的提升开发体验和效率。现目前所支持的飞机有以下几种:

Matrice 300 RTKMatrice 30 Series

DJI Mavic 3 Enterprise Series

DJI Mavic 3MDJI Mini 3

DJI Mini 3 Pro

现目前V5 SDK 有下面几种功能:

参数获取和设置:负载参数设置、无人机参数设置、负载状态监听、无人机状态监听。

飞行控制:航点自动飞行、虚拟摇杆飞行、RTK定位配置、Tracking飞行。

应用数据处理:实时码流直播、MOP数据通道、媒体文件管理、实时点云数据获取。

更多功能:健康管理、SD卡加密、升级提示、飞行记录、网络控制、备份链路。

技术细节

SDK 架构体系概述

Mobile SDK的体系结构被设计为高度可扩展的,其中使用了抽象产品类和组件类,以便应用程序可以使用相同的代码控制不同的产品。对于一些没法在不同产品中保持一致性的功能可以在运行时被查询调用,对于一些能保持一致性的功能则直接可以工作了。

例如,Phantom和Inspire系列产品的绝大多数功能是一致的。因此,为适配Phantom 4而编写的应用程序,除Inspire 1的一些独特功能外,将可以直接在Inspire 1机型上使用。

这也意味着当新产品发布时,就已经可以与现有的应用程序一起使用了(需要使用支持该新产品的最新SDK)。新产品中的任何新功能都需要添加到应用程序中,但是所有现有功能都不需要做修改了。

层级架构

移动应用程序一般通过下图所示的几个主要类来访问Mobile SDK:

75a643a4-130d-11ee-962d-dac502259ad0.png

SDKManager:MSDK工具包的入口类,管理MSDK的初始化,反初始化,MSDK注册,以及监听DJI硬件产品的连接事件。

KeyTools / KeyManager:MSDK V5版本使用了以Key为基础元素的参数设置和参数获取功能接口,KeyTools是创建Key的入口类,KeyManager是调用或者监听Key的入口类,大多数的功能都可以通过相应的Key来控制,例如控制云台旋转或者控制相机拍照、录像等。

MediaDataCenter:应用数据获取功能的入口类,通过MediaDataCenter可以获取到原始的码流数据管理类,以及多媒体文件数据的管理类。

WaypointMissionManager:航点任务自动飞行的入口类,可以控制无人机基于航点的自主飞行。

VirtualStickManager:虚拟摇杆飞行入口类,可以控制无人机进入虚拟摇杆控制模式,进入此模式之后可以通过实时发送动作命令的形式控制无人机飞行。

FlightLogManager:飞行日志管理类,可以获取手机端存储的日志路径。

DeviceHealthManager:设备健康管理模块,通过此类可以实时获取到设备的健康状态以提醒无人机的操纵者。

智能任务

智能任务可以轻松实现飞行自动化。其中基于航点和航点动作定义的航点飞行任务(WaypointMission)可以使无人机沿着定义好的航点和航点动作来自动飞行,使用WaypointMissionManager来控制航点任务的执行过程,航点动作和航点任务可以由KMZ文件定义。基于实时命令的虚拟摇杆飞行功能,也可以让飞机实现自动飞行,开发者可以基于自己的算法,调用VirtualStickManager中的接口来控制无人机进行自主飞行。

空白项目集成 MSDK

新建空白项目

1、在 Android Studio 启动页,选择 New Project > Phone and Tablet > Empty Activity。

2、完成配置。

Name:My Application Package。

name:com.dji.myapplication。

Minimum SDK:23。

3、compileSdkVersion 和 targetSdkVersion 为 29。

新建 MyApplication.kt 文件

1、新建 MyApplication.kt 文件。

2、参照 MSDK V5 Sample 的 DJIAllApplication 编辑成如下内容。代码的作用是引入 SDK 的解密加固包。

packagecom.dji.myapplication

importandroid.app.Application
importandroid.content.Context

classMyApplication:Application(){
overridefunattachBaseContext(base:Context?){
super.attachBaseContext(base)
com.secneo.sdk.Helper.install(this)
}
}

修改 build.gradle(Module) 文件

1、在 dependencies 项里添加 MSDK 飞行器包,如只需全量包或手持包请参考 Sample 添加。

implementation"com.dji5.2.0"
implementation"com.dji5.2.0"
compileOnly"com.dji5.2.0"

implementation'com.squareup.okio1.15.0'
implementation'com.squareup.wire2.2.0'
implementation'com.airbnb.android3.3.1'

dji-sdk-v5-aircraft:飞机主包,提供 MSDK 对飞机控制的支持。dji-sdk-v5-networkImp:网络库包,为 MSDK 提供联网能力。

dji-sdk-v5-aircraft-provided:飞机编译包,提供飞机包相关接口。

2、在 android 项里添加 packagingOptions。

packagingOptions{
doNotStrip"*/*/libconstants.so"
doNotStrip"*/*/libdji_innertools.so"
doNotStrip"*/*/libdjibase.so"
doNotStrip"*/*/libDJICSDKCommon.so"
doNotStrip"*/*/libDJIFlySafeCore-CSDK.so"
doNotStrip"*/*/libdjifs_jni-CSDK.so"
doNotStrip"*/*/libDJIRegister.so"
doNotStrip"*/*/libdjisdk_jni.so"
doNotStrip"*/*/libDJIUpgradeCore.so"
doNotStrip"*/*/libDJIUpgradeJNI.so"
doNotStrip"*/*/libDJIWaypointV2Core-CSDK.so"
doNotStrip"*/*/libdjiwpv2-CSDK.so"
doNotStrip"*/*/libffmpeg.so"
doNotStrip"*/*/libFlightRecordEngine.so"
doNotStrip"*/*/libvideo-framing.so"
doNotStrip"*/*/libwaes.so"
doNotStrip"*/*/libagora-rtsa-sdk.so"
doNotStrip"*/*/libc++.so"
doNotStrip"*/*/libc++_shared.so"
doNotStrip"*/*/libmrtc_28181.so"
doNotStrip"*/*/libmrtc_agora.so"
doNotStrip"*/*/libmrtc_core.so"
doNotStrip"*/*/libmrtc_core_jni.so"
doNotStrip"*/*/libmrtc_data.so"
doNotStrip"*/*/libmrtc_log.so"
doNotStrip"*/*/libmrtc_onvif.so"
doNotStrip"*/*/libmrtc_rtmp.so"
doNotStrip"*/*/libmrtc_rtsp.so"
}

修改 AndroidManifest.xml 文件

1、参照 Sample 的 AndroidManifest.xml 添加 SDK 需要的最基础权限。










2、参照 MSDK V5 Sample 的 AndroidManifest.xml 添加 USB 相关权限,为了连接遥控器使用。



3、在 application 标签下添加 Myapplication 文件的声明,启动的时候需要加载。


4、参照 MSDK V5 Sample 的 AndroidManifest.xml 添加 SDK API KEY。用户需要使用工程中的 AndroidManifest.xml 中的package,前往 开发者网站 申请 appkey,成功后将appkey替换如下代码段中的X。本指导中 package=com.dji.myapplication。申请 appkey 时,Package Name 需填写com.dji.myapplication。


75bdaf9e-130d-11ee-962d-dac502259ad0.png


5、在 activity 标签下添加 intent-filter 和 meta-data。








修改 MainActivity.kt 文件

添加 MSDK 的 init 函数即可。

packagecom.dji.myapplication

importandroid.os.Bundle
importandroid.util.Log
importandroidx.appcompat.app.AppCompatActivity
importdji.v5.common.error.IDJIError
importdji.v5.common.register.DJISDKInitEvent
importdji.v5.manager.SDKManager
importdji.v5.manager.interfaces.SDKManagerCallback

classMainActivity:AppCompatActivity(){
privatevalTAG="myApp"

overridefunonCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
registerApp()
}

privatefunregisterApp(){
SDKManager.getInstance().init(this,object:SDKManagerCallback{
overridefunonRegisterSuccess(){
Log.i(TAG,"myApponRegisterSuccess")
}

overridefunonRegisterFailure(error:IDJIError){
Log.i(TAG,"myApponRegisterFailure")
}

overridefunonProductDisconnect(productId:Int){
Log.i(TAG,"myApponProductDisconnect")
}

overridefunonProductConnect(productId:Int){
Log.i(TAG,"myApponProductConnect")
}

overridefunonProductChanged(productId:Int){
Log.i(TAG,"myApponProductChanged")
}

overridefunonInitProcess(event:DJISDKInitEvent,totalProcess:Int){
Log.i(TAG,"myApponInitProcess")
if(event==DJISDKInitEvent.INITIALIZE_COMPLETE){
Log.i(TAG,"myAppstartregisterApp")
SDKManager.getInstance().registerApp()
}
}

overridefunonDatabaseDownloadProgress(current:Long,total:Long){
Log.i(TAG,"myApponDatabaseDownloadProgress")
}
})
}
}

导入 UXSDK 开源框架

1、将 UXSDK 项目(android-sdk-v5-uxsdk)整个复制到myapplication项目路径的app/libs文件夹下。

2、工具栏点击 File > New > Import Module,选择myapplication项目路径的app/libs文件夹下的android-sdk-v5-uxsdk。

3、修改settings.gradle文件。

rootProject.name="MyApplication"
include':app',':android-sdk-v5-uxsdk'
project(':android-sdk-v5-uxsdk').projectDir=newFile(rootDir,'app/libs/android-sdk-v5-uxsdk/')

4、修改build.gradle(:android-sdk-v5-uxsdk)文件中的配置和myApplication项目一致。

applyplugin:'com.android.library'
applyplugin:'kotlin-android'
applyplugin:'kotlin-android-extensions'
applyplugin:'kotlin-kapt'

android{
compileSdkVersion32

resourcePrefix"uxsdk_"
defaultConfig{
minSdkVersion23
targetSdkVersion32
versionCode1
versionName"1.0"
}

compileOptions{
sourceCompatibilityJavaVersion.VERSION_1_8
targetCompatibilityJavaVersion.VERSION_1_8
}

kotlinOptions{
jvmTarget=JavaVersion.VERSION_1_8
}
}

dependencies{
implementation'androidx.annotation1.1.0'
implementation'androidx.appcompat1.3.1'
implementation'androidx.multidex2.0.1'
implementation'androidx.legacy1.0.0'
implementation'androidx.recyclerview1.1.0'
implementation'com.squareup.okio1.15.0'
implementation'com.squareup.wire2.2.0'
implementation'androidx.constraintlayout1.1.3'
implementation'androidx.lifecycle2.3.1'
implementation'androidx.lifecycle2.3.1'
implementation'androidx.lifecycle2.3.1'
implementation'androidx.media1.0.0'
implementation"org.jetbrains.kotlin$kotlin_version"
implementation"androidx.core1.3.2"
api'io.reactivex.rxjava33.0.0'
implementation'com.airbnb.android3.3.1'
implementation'androidx.cardview1.0.0'

api'org.maplibre.gl1.0.0'
api'org.maplibre.gl5.9.0'
api'org.maplibre.gl9.4.2'
api'com.amap.api7.3.0'
api'com.amap.api7.3.0'

api'com.google.android.gms16.0.0'
api'com.google.android.gms16.0.0'
api'com.google.android.gms16.0.0'
api'com.google.android.gms16.0.0'

compileOnly"com.dji5.2.0"
compileOnly"com.dji5.2.0"
}

5、同步工程。

4.X 和 5.X 版本差异说明

以下内容主要目的是将MSDK 4.X版本和MSDK 5.X版本中的核心接口做对比和说明,其中主要包含了DJIKey类型接口的对比说明,和几个核心模块的差异点说明,例如SDK注册管理类(SDKManager)、设备健康状态管理类(DeviceHealthManager)等。

注意:目前MSDK 4.X和5.X还不兼容,不能一起使用。MSDK 5.X 目前支持机型查看版本发布中的“支持产品列表和固件版本”,且未来只计划支持部分DJI的新机型。

DJIKey差异说明

DJIKey

MSDK 5.X 大多数与设备交互的功能,都是基于DJIKey来实现的,一个DJIKey代表指定模块的具体功能。

在4.X上,大部分接口的本质是对DJIKey的封装,比如说Camera$startShootPhoto,其本质是CameraKey.START_SHOOT_PHOTO的应用。在后面对比表格中,对于4.X,只显示DJIKey,而不是接口。如有特别需要说明的情况,会特殊处理。

这里以FlightControllerState下的Motors中的方法areMotorsOn为例:先通过方法areMotorsOn在4.X文档中,搜到areMotorsOn的方法说明,然后查询到对应的4.X DJIKey.FlightControllerKey.ARE_MOTOR_ON,继而在迁移文档中找到方法areMotorsOn对应的5.X DJIKey。区别:



75f82692-130d-11ee-962d-dac502259ad0.png

如何CreateKey

在4.X上,DJIKey的create方法定义在各类模块Key中,这里以CameraKey来举例:

1、创建主位置的Key:CameraKey。

create(String paramKey, int componentIndex)3、创建指定位置、指定镜头的Key:CameraKey$createLensKey(String paramKey, int componentIndex, int subComponentIndex)。

在5.X上,DJIKey的create方法统一定义到KeyTools中,以CameraKey为例:

只有一种方法,创建指定位置、指定镜头的DJIKey:KeyTools$createCameraKey(DJIKeyInfomKeyInfo, ComponentIndexType componentIndexType, CameraLensType cameraLensType),相关DJIKey如果不指明镜头的话,就用CameraLensType.CAMERA_LENS_DEFAULT(在Kotlin上,DJIKeyInfo有扩展方法createCamera,cameraLensType默认值就是CameraLensType.CAMERA_LENS_DEFAULT)。

参数说明:

762c9c38-130d-11ee-962d-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Mobile
    +关注

    关注

    0

    文章

    515

    浏览量

    26340
  • 遥控器
    +关注

    关注

    18

    文章

    815

    浏览量

    64244
  • 无人机
    +关注

    关注

    224

    文章

    9884

    浏览量

    174812
  • SDK
    SDK
    +关注

    关注

    3

    文章

    966

    浏览量

    44703
  • 手机端
    +关注

    关注

    0

    文章

    5

    浏览量

    2000

原文标题:基于Mobile SDK V5版固件开发大疆无人机手机端遥控器(4)

文章出处:【微信号:美男子玩编程,微信公众号:美男子玩编程】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【Aworks申请】开放式无人机地面基站

    申请理由:我们是在校大学生EDA兴趣团队,正在设计制作无人机项目。我们发现,现在无人机只能通过遥控器或者电脑上位机控制飞行。所以,我们试图开发一个通用式地面基站,开放API和视频数据流
    发表于 06-27 08:59

    【云智易申请】智能无人机通信

    申请理由:本次项目是基于STM32做无人机,主要用WiFi实现无人机遥控器之间通信,无人机的电机我们可以用云智易开发板上面的电机进行调试,
    发表于 08-07 11:02

    【MiCOKit申请】开放式无人机地面基站

    申请理由:我们是在校大学生EDA兴趣团队,正在设计制作无人机项目。我们发现,现在无人机只能通过遥控器或者电脑上位机控制飞行。所以,我们试图开发一个通用式地面基站,开放API和视频数据流
    发表于 08-10 13:04

    无人机遥控方向控制问题

    前段时间我弟弟买了个遥控无人机玩具,但是我发现一个问题。该无人机方向控制有问题,假设无人机有四个电机,分别为A,B,C,D,遥控器四个按键1
    发表于 05-10 11:26

    stm32四轴无人机遥控器资料

    stm32四轴无人机遥控器资料
    发表于 06-09 23:16

    无人机怎么悬停

    `  谁能阐述下大无人机怎么悬停?`
    发表于 08-27 15:13

    COCOFLY 教程 ——疯壳无人机·系列【5遥控器固件烧写

    遥控器的主核心STM32F103C8T6的Flash内,遥控器的代码就可以运行。这里已经把编译好固件放在了“【5遥控器
    发表于 04-03 18:06

    DJI大创新推出首款农业无人机

    全球飞行影像系统的开拓者和领导者DJI大创新今日宣布推出一款智能农业喷洒防治无人机——大MG-1农业植保机,标志着大创新正式进入农业无人机
    发表于 05-12 07:22

    怎么实现STM32采集无人机遥控器PPM信号?

    怎么实现STM32采集无人机遥控器PPM信号?
    发表于 11-18 06:10

    【快速上手教程6】疯壳·开源编队无人机-遥控器固件烧写

    COCOFLY 教程——疯壳·无人机·系列遥控器固件烧写 图1 一、遥控器固件烧写 这里的固件
    发表于 05-25 11:49

    【快速上手教程6】疯壳·开源编队无人机-遥控器固件烧写

    COCOFLY 教程——疯壳·无人机·系列遥控器固件烧写 图1 一、遥控器固件烧写 这里的固件
    发表于 07-07 10:05

    【疯壳·无人机教程6】开源编队无人机-遥控器固件烧写

    COCOFLY 教程——疯壳·无人机·系列遥控器固件烧写图1 一、遥控器固件烧写 这里的固件
    发表于 08-23 17:49

    基于Mobile SDK V4版固件开发大疆无人机手机遥控器(1)

    刚刚结束了项目交付,趁热打铁分享一下这次遇到的新东西。首先了解一下大疆的无人机,它大致可以分为三级。
    的头像 发表于 06-07 09:53 677次阅读
    基于<b class='flag-5'>Mobile</b> <b class='flag-5'>SDK</b> V4版<b class='flag-5'>固件</b><b class='flag-5'>开发</b>大疆<b class='flag-5'>无人机手机</b>端<b class='flag-5'>遥控器</b>(1)

    基于Mobile SDK V4版固件开发大疆无人机手机遥控器(2)

    上一篇文章(基于Mobile SDK V4版固件开发大疆无人机手机遥控器(1))因为时间原因介
    的头像 发表于 06-09 11:33 631次阅读
    基于<b class='flag-5'>Mobile</b> <b class='flag-5'>SDK</b> V4版<b class='flag-5'>固件</b><b class='flag-5'>开发</b>大疆<b class='flag-5'>无人机手机</b>端<b class='flag-5'>遥控器</b>(2)

    基于Mobile SDK V5固件开发大疆无人机手机遥控器(5)

    v5.x版本的功能与v4.x基本相同,都是获取飞机的姿态信息、获取无人机多媒体文件、操作多媒体文件、航线规划等。不过在上一章节中也大致说了一些两个版本的中API的差别,下面是根据一些API使用所完成的一些功能,因为项目原因只能提供部分代码供参考,后续如果有这方面需求的小伙伴可以对其进行
    的头像 发表于 07-07 12:21 1065次阅读
    基于<b class='flag-5'>Mobile</b> <b class='flag-5'>SDK</b> <b class='flag-5'>V5</b>版<b class='flag-5'>固件</b><b class='flag-5'>开发</b>大疆<b class='flag-5'>无人机手机</b>端<b class='flag-5'>遥控器</b>(5)