写点什么

基于大疆无人机 SDK 二次开发

用户头像
sydMobile
关注
发布于: 2020 年 05 月 07 日

![声明](https://user-gold-cdn.xitu.io/2019/5/22/16adf0c4dd3185d5?w=1080&h=237&f=png&s=1025845)

基于大疆无人机SDK二次开发

近期公司项目需求,需要基于大疆无人机SDK开发一款手机 APP,用于配合后台实现对无人机的管理。当然大疆本身也给我们提供了管理平台-----大疆司空。通过大疆的官方 APP 配合后台管理系统大疆司空,就可以实现对无人机的管理了。奈何大疆司空费用太高,进阶版需要 1 年 19999 的费用。因此就需要自己开发手机APP,用于给后台传输无人机的有关信息。



下面就把开发过程中需要注意的一些地方总结整理一下,以免后人踩坑。



相关资料链接



下面把使用到的资料链接贴一下:



[下载中心](<https://www.dji.com/cn/downloads/products/matrice600-pro>)



通过下载中心我们可以下载无人机的操作手册、快速入门手册还有不同的 app 版本,为我们开发提供便利的软件工具等等。



[官方Demo](<https://github.com/DJI-Mobile-SDK-Tutorials>)



这里有很多 demo,不同的demo用于介绍不同的功能点,切记在开发的时候要以demo中的代码为准,不要以官方文档为准,按照官方文档你可能无法把程序跑起来。



[商城](<https://store.dji.com/cn/product/matrice-600-pro?site=brandsite&from=buynowbar>)



在商城里你可以了解相关产品的特性,进行更好的开发



[文档](<https://developer.dji.com/mobile-sdk/documentation/introduction/index.html>)



文档还是要看一下的,特别是对没有接触过无人机的新手来说。文档都是英文的,其实很容易看懂。实在不懂可以通过谷歌浏览器的翻译功能,可以很好的把文档翻译成中文。建议原文和中文一起查看。



[API](<https://developer.dji.com/api-reference/android-api/Components/SDKManager/DJISDKManager.html>)



Api 可以作为在开发过程中的补充,对那个方法不了解,就直接到这里搜索就可以了,API 的搜索功能做的很强大,你只需要把不同的方法名或者类名输入就可以了。API 里面的解释相对来说还是比较详细的。



进入正文



首先想要开发大疆无人机 APP ,需要满足以下条件:



  • 首先你要有一台无人机(需要这台无人机支持 SDK [查看支持的无人机型号](<https://developer.dji.com/mobile-sdk/documentation/introduction/mobilesdkintroduction.html>))

  • 开发者账号



满足了上面的条件就可以开始进行开发了,和平时使用第三方 SDK 一样,你需要在开发者账号里面新建一个 APP,这里需要注意 APP 的包名必须和真实的 APP 包名一致 否则运行不成功!



关于如何导入依赖,如何创建 APP 这些基本内容这里就不重复了,文档都用,需要注意的是文档里面的依赖不全,你需要做的就是,把 demo 下载下来,然后把 demo 中的依赖全部复制到你的项目中



再说具体一些,文档中的这里是不全的,你需要在依赖中添加:



packagingOptions {
doNotStrip "//libdjivideo.so"
doNotStrip "//libSDKRelativeJNI.so"
doNotStrip "//libFlyForbid.so"
doNotStrip "//libdumlvisionbokeh.so"
doNotStrip "//libyuv2.so"
doNotStrip "//libGroudStation.so"
doNotStrip "//libFRCorkscrew.so"
doNotStrip "//libUpgradeVerify.so"
doNotStrip "//libFR.so"
doNotStrip "//libDJIFlySafeCore.so"
doNotStrip "//libdjifs_jni.so"
doNotStrip "//libsfjni.so"
doNotStrip "//libDJICommonJNI.so"
doNotStrip "//libDJICSDKCommon.so"
doNotStrip "//libDJIUpgradeCore.so"
doNotStrip "//libDJIUpgradeJNI.so"
exclude 'META-INF/rxjava.properties'
}
来代替文档中写出的那几种



好了,依赖也引入成功了,下面就可以进行开发了。



这里就简单介绍一下sdk的使用步骤把,重点是接受需要特别注意地方。



首先你需要注册一下 sdk,在注册成功的回调里面再调登录



if (isRegistrationInProgress.compareAndSet(false, true)) {
AsyncTask.execute(() -> DJISDKManager.getInstance()
.registerApp(MainActivity.this.getApplicationContext(),
new DJISDKManager.SDKManagerCallback() {
@Override
public void onRegister(DJIError djiError) {
// 如果配置的包名和APIKEY没有问题那么这里就注册成功了
if (djiError == DJISDKError.REGISTRATIONSUCCESS) {
DJISDKManager.getInstance().startConnectionToProduct();
// 进行登录
loginAccount();
}
}
@Override
public void onProductDisconnect() {
Log.e(TAG, "onProductDisconnect");
notifyStatusChange();
}
@Override
public void onProductConnect(BaseProduct baseProduct) {
Log.e(TAG, String.format("onProductConnect newProduct:%s",
baseProduct));
notifyStatusChange();
}
@Override
public void onComponentChange(BaseProduct.ComponentKey componentKey,
BaseComponent oldComponent,
BaseComponent newComponent) {
}
@Override
public void onInitProcess(DJISDKInitEvent djisdkInitEvent, int i) {
}
@Override
public void onDatabaseDownloadProgress(long l, long l1) {
}
}));
}



上面的一步是 APP 开始所必须要经过的一步,否则你就无法操控无人机。



这一步需要注意的是:



  • 上面的回调内容都不是在主线程,因此如果要操作界面内容,需要到主线程中操作

  • 首次注册 SDK 和登录账户是需要网络支持的,之后就不需要网络了。

  • 登录一定要在注册 SDK 成功后调用,否则加载不出登录界面



好了,上面步骤完毕后,就是等待无人机连接了,无人机连接的时候会触发回调,等连接上无人机我们就可以进行真正的开发了。



进行开发的时候主要就是利用了 SDK 中的几个类,它们的方法很好理解。



DJISDKManager



这个类非常关键,它是使用 SDK 和 大疆无人机的入口。



注册 SDK、获取无人机对象都是通过这个类来实现的。



通过 SJISDKManager 获取到无人机对象(Aircraft)后,就可以利用 Aircraft 来获取无人机的各个组件对应的对象了,比如:飞控 FlightController (这是无人机的核心组件,控制无人机的飞行,关于无人机的位置信息,状态信息等)、电池 Battery、相机Camera、云台 Gimbal 、遥控器RemoteController 等等。详见 COMPONENT CLASSES



同时我们还可以引入 UX SDK [地址](<https://developer.dji.com/api-reference/android-uilib-api/Widgets/DULFPVWidget.html>)来帮助我们进行快速的开发。



UX SDK 主要是提供了一些线程的控件,这些控件我们放到 UI 中就可以使用,而且不是静态的 UI ,是有数据的,不需要我们进行任何处理。



比如:dji.ux.widget.FPVWidget 组件,你只需要放到布局中,就可以显示无人机相机的画面。



注意内容



进行直播:



if (!DJISDKManager.getInstance().getLiveStreamManager().isStreaming()) {
new Thread() {
@Override
public void run() {
fpv.registerLiveVideo(VideoFeeder.getInstance()
.getSecondaryVideoFeed(),
true);
DJISDKManager.getInstance().getLiveStreamManager().setLiveUrl(
"rtmp://x.x.x.x/x");
DJISDKManager.getInstance().getLiveStreamManager()
.setVideoEncodingEnabled(true);
int result =
DJISDKManager.getInstance().getLiveStreamManager()
.startStream();
L.e("startLive:" + result + DJISDKManager.getInstance()
.getLiveStreamManager().isStreaming() +
"\n isVideoStreamSpeedConfigurable:" + DJISDKManager
.getInstance().getLiveStreamManager()
.isVideoStreamSpeedConfigurable() +
"\n isLiveAudioEnabled:" + DJISDKManager.getInstance()
.getLiveStreamManager().isLiveAudioEnabled());
}
}.start();
}



单纯的 setLiveUrl() 然后开始直播是不会成功的,需要有前面一步 注册直播视频,代码中的 fpv就是 dji.ux.widget.FPVWidget 控件。



获取无人机位置的方法



// 主动获取
Aircraft aircraft1 = (Aircraft) DJISDKManager.getInstance().getProduct();
FlightControllerState state = aircraft1.getFlightController().getState();
L.e("==altitude:" + state.getAircraftLocation().getAltitude() + "latitude:" + state.getAircraftLocation().getLatitude() + "longitude:");

// 当然你可以注册回调函数
void setStateCallback(@Nullable FlightControllerState.Callback callback);



布局名字坑



布局中不要出现 dialoglogin 的名字,因为这个名字在大疆的 SDK 中已经有了,当你在添加一个 dialoglogin 名字的时候,调用 登录 API 就会报空指针错误了。



如果出现莫名其妙的布局空指针异常,很有可能是我们自己的布局和大疆 SDK 中的布局名字重复了。



回调大多不在主线程



大疆 SDK 中的回调大多数都不是在主线程这一点需要注意



![](https://user-gold-cdn.xitu.io/2019/10/10/16db5064ec1e7b6d?w=1240&h=620&f=jpeg&s=145465)



发布于: 2020 年 05 月 07 日阅读数: 186
用户头像

sydMobile

关注

还未添加个人签名 2018.07.22 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
写的逻辑很清晰,比较容易理解,为作者点个赞!
另外,SJISDKManager  这个是不是写错了,是DJISDKManager吧
2020 年 06 月 09 日 10:48
回复
没有更多了
基于大疆无人机SDK二次开发