近期公司项目需求,须要基于大疆无人机SDK开发一款手机 APP,用于配合后台实现对无人机的管理。固然大疆自己也给咱们提供了管理平台-----大疆司空。经过大疆的官方 APP 配合后台管理系统大疆司空,就能够实现对无人机的管理了。奈何大疆司空费用过高,进阶版须要 1 年 19999 的费用。所以就须要本身开发手机APP,用于给后台传输无人机的有关信息。html
下面就把开发过程当中须要注意的一些地方总结整理一下,以避免后人踩坑。java
下面把使用到的资料连接贴一下:android
下载中心git
经过下载中心咱们能够下载无人机的操做手册、快速入门手册还有不一样的 app 版本,为咱们开发提供便利的软件工具等等。github
官方Demoapi
这里有不少 demo,不一样的demo用于介绍不一样的功能点,切记在开发的时候要以demo中的代码为准,不要以官方文档为准,按照官方文档你可能没法把程序跑起来。浏览器
商城bash
在商城里你能够了解相关产品的特性,进行更好的开发网络
文档app
文档仍是要看一下的,特别是对没有接触过无人机的新手来讲。文档都是英文的,其实很容易看懂。实在不懂能够经过谷歌浏览器的翻译功能,能够很好的把文档翻译成中文。建议原文和中文一块儿查看。
Api 能够做为在开发过程当中的补充,对那个方法不了解,就直接到这里搜索就能够了,API 的搜索功能作的很强大,你只须要把不一样的方法名或者类名输入就能够了。API 里面的解释相对来讲仍是比较详细的。
首先想要开发大疆无人机 APP ,须要知足如下条件:
知足了上面的条件就能够开始进行开发了,和平时使用第三方 SDK 同样,你须要在开发者帐号里面新建一个 APP,这里须要注意 APP 的包名必须和真实的 APP 包名一致 不然运行不成功!
关于如何导入依赖,如何建立 APP 这些基本内容这里就不重复了,文档都用,须要注意的是文档里面的依赖不全,你须要作的就是,把 demo 下载下来,而后把 demo 中的依赖所有复制到你的项目中
再说具体一些,文档中的这里是不全的,你须要在依赖中添加:
packagingOptions {
doNotStrip "*/*/libdjivideo.so"
doNotStrip "*/*/libSDKRelativeJNI.so"
doNotStrip "*/*/libFlyForbid.so"
doNotStrip "*/*/libduml_vision_bokeh.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) {
// 若是配置的包名和API_KEY没有问题那么这里就注册成功了
if (djiError == DJISDKError.REGISTRATION_SUCCESS) {
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 中的几个类,它们的方法很好理解。
DJISDKManager
这个类很是关键,它是使用 SDK 和 大疆无人机的入口。
注册 SDK、获取无人机对象都是经过这个类来实现的。
经过 SJISDKManager
获取到无人机对象(Aircraft
)后,就能够利用 Aircraft
来获取无人机的各个组件对应的对象了,好比:飞控 FlightController
(这是无人机的核心组件,控制无人机的飞行,关于无人机的位置信息,状态信息等)、电池 Battery
、相机Camera
、云台 Gimbal
、遥控器RemoteController
等等。详见 COMPONENT CLASSES
同时咱们还能够引入 UX SDK
地址来帮助咱们进行快速的开发。
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);
复制代码
布局名字坑
布局中不要出现 dialog_login
的名字,由于这个名字在大疆的 SDK 中已经有了,当你在添加一个 dialog_login
名字的时候,调用 登陆 API 就会报空指针错误了。
若是出现莫名其妙的布局空指针异常,颇有多是咱们本身的布局和大疆 SDK 中的布局名字重复了。
回调大多不在主线程
大疆 SDK 中的回调大多数都不是在主线程这一点须要注意