当前位置: 移动技术网 > IT编程>移动开发>Android > 基于大疆无人机SDK二次开发

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

2020年05月07日  | 移动技术网IT编程  | 我要评论

幻想神域鱼王,袋鼠妈妈护肤品安全吗,赵丽江照片

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

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

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

相关资料链接

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

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

官方demo

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

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

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

api

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

进入正文

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

  • 首先你要有一台无人机(需要这台无人机支持 sdk )
  • 开发者账号

满足了上面的条件就可以开始进行开发了,和平时使用第三方 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 和登录账户是需要网络支持的,之后就不需要网络了。
  • 登录一定要在注册 sdk 成功后调用,否则加载不出登录界面

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

进行开发的时候主要就是利用了 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 中的回调大多数都不是在主线程这一点需要注意

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网