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

第三篇文章准备单独拿出来写,因为在大疆为人机的所有功能中,航线规划的功能最为复杂,也相当的繁琐,这里需要说仔细一点,可能会将代码进行多步分解。
1航线规划
航线打点 
在地图中手动选择点位选择完成航线打点;若打点位置错了可进行点位删除。
航点设置 
可对航线点位进行设置,如飞行高度,速度(慢速:3m/s;中速: 7m/s;高速:10 m/s)、任务结束后操作及航向,点击[设置]按钮完成设置。
设置完成后会显示总距离及飞行总时间。
航线上传
点击[上传]按钮,进行航线上传。可以进入本地存储中选择航线文件进行上传,航线文件为 .kml结尾。
航线执行 
点击 [开始]按钮,则可对航线进行执行。若中途需要暂停也可点击[暂停]安装进行暂停操作。
航线管理
按钮即可进入航线管理界面。
获取航线 
点击[获取]按钮,即可将航线信息展示到地图界面中。
2主要功能代码
创建activity_setting_route.xml及settingrouteactivity文件。
activity_setting_route.xml
settingrouteactivity
public class settingrouteactivity extends baseactivity implements amap.onmarkerclicklistener, view.onclicklistener, amap.onmapclicklistener, locationsource, amaplocationlistener, amap.infowindowadapter {    @bindview(r.id.layout_route)        view mviewlayouttoolbar;        @bindview(r.id.ll_route)        linearlayout mlinearlayout;        @bindview(r.id.tv_toolbar_title)        textview mtextviewtoolbartitle;    //    @bindview(r.id.map)    //    mapview mmapview;        @bindview(r.id.btn_delete)        button mbuttondelete;        @bindview(r.id.btn_finish)        button mbuttonfinish;        @bindview(r.id.btn_setting)        button mbuttonsetting;        @bindview(r.id.btn_upload)        button mbuttonupload;        @bindview(r.id.btn_start)        button mbuttonstart;        @bindview(r.id.btn_stop)        button mbuttonstop;        @bindview(r.id.ll_information)        linearlayout mlinearlayoutinformation;        @bindview(r.id.tv_height)        textview mtextviewheight;        @bindview(r.id.tv_speed)        textview mtextviewspeed;        @bindview(r.id.tv_count)        textview mtextviewcount;        @bindview(r.id.tv_distance)        textview mtextviewdistance;        @bindview(r.id.tv_time)        textview mtextviewtime;        private mapview mmapview;        private onlocationchangedlistener mlistener;        private amaplocationclient mlocationclient;        private amaplocationclientoption mlocationoption;        private double d_latitude, d_longitude;        private uisettings muisettings;        private amap amap;        private marker dronemarker = null;        private float altitude = 100.0f;        private float mspeed = 10.0f;        private boolean isadd = false;        private final map mmarkers = new concurrenthashmap();        private marker mclickmarker;        private list waypointlist = new arraylist();        private list mlatlng = new arraylist();        private list mpointinfo = new arraylist();        public static waypointmission.builder waypointmissionbuilder;        private flightcontroller mflightcontroller;        private waypointmissionoperator instance;        private waypointmissionfinishedaction mfinishedaction = waypointmissionfinishedaction.no_action;        private waypointmissionheadingmode mheadingmode = waypointmissionheadingmode.auto;        private sqlitehelper msqlitehelper;        private string finishedaction, headingmode;        //自定义窗体        view infowindow = null;        int speed_rg_id = 0;        int actionafterfinished_rg_id = 0;        int heading_rg_id = 0;        //kim        static readkml readkml = new readkml();        private static list samplelist = readkml.getcoordinatelist();        @override        public void initviews() {            mlinearlayout.setvisibility(view.visible);            mtextviewtoolbartitle.settext(航线规划);            intentfilter filter = new intentfilter();            filter.addaction(receiverapplication.flag_connection_change);            registerreceiver(mreceiver, filter);            mmapview = findviewbyid(r.id.map);            mmapview.oncreate(instancestate);            initmapview();            addlistener();            onproductconnectionchange();        }        @override        protected void onresume() {            super.onresume();            initflightcontroller();            mmapview.onresume();        }        /**         * 方法必须重写         */        @override        protected void onsaveinstancestate(bundle outstate) {            super.onsaveinstancestate(outstate);            mmapview.onsaveinstancestate(outstate);        }        @override        protected void onpause() {            super.onpause();            mmapview.onpause();            deactivate();        }        @override        protected void ondestroy() {            super.ondestroy();            unregisterreceiver(mreceiver);            removelistener();            mmapview.ondestroy();            if (null != mlocationclient) {                mlocationclient.ondestroy();            }        }        @override        public void initdatas() {        }        @override        protected void requestdata() {        }        private void initmapview() {            if (amap == null) {                amap = mmapview.getmap();                muisettings = amap.getuisettings();                muisettings.setmylocationbuttonenabled(true);                muisettings.setscalecontrolsenabled(true);                amap.setonmapclicklistener(this);// add the listener for click for amap object                amap.setlocationsource(this);                amap.setmylocationenabled(true);                amap.setinfowindowadapter(this);                amap.setonmarkerclicklistener(this);                setuplocationstyle();            }        }        private void setuplocationstyle() {            // 自定义系统定位蓝点            mylocationstyle mylocationstyle = new mylocationstyle();            // 自定义定位蓝点图标            mylocationstyle.mylocationicon(bitmapdescriptorfactory.                    fromresource(r.mipmap.icv_gps_point_36dp));            // 自定义精度范围的圆形边框颜色            mylocationstyle.strokecolor(color.parsecolor(#00000000));            //自定义精度范围的圆形边框宽度            mylocationstyle.strokewidth(5);            // 设置圆形的填充颜色            mylocationstyle.radiusfillcolor(color.parsecolor(#00000000));            // 将自定义的 mylocationstyle 对象添加到地图上            amap.setmylocationstyle(mylocationstyle);        }        @onclick({r.id.img_kml_input, r.id.img_setting_route, r.id.img_start_fly, r.id.btn_delete,                r.id.img_setting_clear, r.id.btn_finish, r.id.btn_setting, r.id.btn_upload,                r.id.btn_start, r.id.btn_stop, r.id.img_back})        @override        public void onclick(view v) {            switch (v.getid()) {                case r.id.img_back:                    settingrouteactivity.this.finish();                    break;                case r.id.img_kml_input:                    intent intent = new intent(intent.action_get_content);                    intent.settype(*/*);//设置类型,我这里是任意类型,任意后缀的可以这样写。                    intent.addcategory(intent.category_openable);                    startactivityforresult(intent, mystatic.request_code_file);                    break;                case r.id.img_setting_route:                    enabledisableadd();                    break;                case r.id.img_setting_clear:                    runonuithread(new runnable() {                        @override                        public void run() {                            amap.clear();                            mmarkers.clear();                            mpointinfo.clear();                            mlinearlayoutinformation.setvisibility(view.gone);                            mbuttonfinish.setvisibility(view.gone);                            mbuttonsetting.setvisibility(view.gone);                            mbuttonupload.setvisibility(view.gone);                            mbuttonstart.setvisibility(view.gone);                            mbuttonstop.setvisibility(view.gone);                        }                    });                    waypointlist.clear();                    waypointmissionbuilder.waypointlist(waypointlist);                    break;                case r.id.img_start_fly:                    atyaction(waypointactivity.class, mystatic.request_code_id);                    break;                case r.id.btn_delete:                    runonuithread(new runnable() {                        @override                        public void run() {                            amap.clear();                        }                    });                    for (int i = 0; i < mmarkers.size(); i++) {                        if (mmarkers.get(i).gettitle().equals(mclickmarker.gettitle())) {                            for (int j = i; j < mmarkers.size() - 1; j++) {                                mmarkers.put(j, mmarkers.get(j + 1));                            }                            mmarkers.remove(mmarkers.size() - 1);                        }                    }                    for (int i = 0; i  -90 && latitude  -180 && longitude  0) {                mlatlng.clear();                polylineoptions polylineoptions = new polylineoptions();                for (int i = 0; i  0) {                for (int i = 0; i  -1) {                        refreshmappoint(id);                    }                    break;                case 102:                    if (data.getdata() != null) {                        uri uri = data.getdata();//得到uri,后面就是将uri转化成file的过程。                        string img_path = uri.getpath();                        try {                            if (!textutils.isempty(img_path)) {                                readkml.parsekml(img_path);                                addsamplemarker();                            }                        } catch (exception e) {                            e.printstacktrace();                        }                    }                    break;                default:                    break;            }        }        private void refreshmappoint(int id) {            amap.clear();            mmarkers.clear();            mpointinfo.clear();            mlinearlayoutinformation.setvisibility(view.gone);            mbuttonfinish.setvisibility(view.gone);            mbuttonsetting.setvisibility(view.gone);            mbuttonupload.setvisibility(view.gone);            mbuttonstart.setvisibility(view.gone);            mbuttonstop.setvisibility(view.gone);            waypointlist.clear();            msqlitehelper = new sqlitehelper(settingrouteactivity.this);            cursor c = msqlitehelper.doselectwaypoint(id);            if (c != null) {                if (c.movetonext()) {                    mylog.d(航点: + {'pointinfo': + c.getstring(1) + });                    mpointinfo.addall(gsonutil.gsontobean({'pointinfo': + c.getstring(1) + }, root.class).getpointinfo());                    altitude = c.getfloat(2);                    mspeed = c.getfloat(3);                    switch (c.getstring(4)) {                        case 0:                            mheadingmode = waypointmissionheadingmode.auto;                            break;                        case 1:                            mheadingmode = waypointmissionheadingmode.using_initial_direction;                            break;                        case 2:                            mheadingmode = waypointmissionheadingmode.control_by_remote_controller;                            break;                        case 3:                            mheadingmode = waypointmissionheadingmode.using_waypoint_heading;                            break;                        case 4:                            mheadingmode = waypointmissionheadingmode.toward_point_of_interest;                            break;                    }                    switch (c.getstring(5)) {                        case 0:                            mfinishedaction = waypointmissionfinishedaction.no_action;                            break;                        case 1:                            mfinishedaction = waypointmissionfinishedaction.go_home;                            break;                        case 2:                            mfinishedaction = waypointmissionfinishedaction.auto_land;                            break;                        case 3:                            mfinishedaction = waypointmissionfinishedaction.go_first_waypoint;                            break;                        case 4:                            mfinishedaction = waypointmissionfinishedaction.continue_until_end;                            break;                    }                }            }            for (int i = 0; i  0) {                mlatlng.clear();                polylineoptions polylineoptions = new polylineoptions();                for (int i = 0; i  0) {                for (int i = 0; i < waypointmissionbuilder.getwaypointlist().size(); i++) {                    waypointmissionbuilder.getwaypointlist().get(i).altitude = altitude;                }            }            djierror error = getwaypointmissionoperator().loadmission(waypointmissionbuilder.build());            if (error == null) {                if (mlinearlayoutinformation.getvisibility() == view.gone) {                    mlinearlayoutinformation.setvisibility(view.visible);                }                mbuttonstart.setvisibility(view.visible);                mbuttonstop.setvisibility(view.visible);                mtextviewheight.settext(高度: + altitude + m);                mtextviewspeed.settext(速度: + mspeed + m/s);                mtextviewcount.settext(航点数: + waypointmissionbuilder.getwaypointcount());                mtextviewdistance.settext(总距离: + math.round(waypointmissionbuilder.calculatetotaldistance()) + m);                mtextviewtime.settext(总时间: + math.round(waypointmissionbuilder.calculatetotaltime()) + min);            }        }        private void addsamplemarker() {            if (readkml.addsamplesuccess) {                amap.clear();                mmarkers.clear();                mpointinfo.clear();                waypointlist.clear();                if (mlinearlayoutinformation.getvisibility() == view.visible) {                    mlinearlayoutinformation.setvisibility(view.gone);                }                mbuttonfinish.setvisibility(view.gone);                mbuttonsetting.setvisibility(view.gone);                mbuttonupload.setvisibility(view.gone);                mbuttonstart.setvisibility(view.gone);                mbuttonstop.setvisibility(view.gone);                for (int i = 0; i  0){                    for (int i = 0; i < mwaypointid.size(); i++){                        strid += mwaypointinfo.get(mwaypointid.get(i)).getid()+,;                    }                    if (!textutils.isempty(strid)){                        strid = strid.substring(0,strid.length()-1);                        msqlitehelper = new sqlitehelper(waypointactivity.this);                        msqlitehelper.dodelete(strid);                        msqlitehelper.close();                        for (int j = 0; j < mwaypointid.size(); j++){                            mwaypointinfo.remove(mwaypointid.get(j).intvalue());                        }                        if (mwaypointadapter!=null){                            mwaypointid.clear();                            mystatic.ischoose = false;                            mwaypointadapter.setnewdata(mwaypointinfo);                        }                    }                }else {                    showtoasts(请先选择删除的航线!);                }                break;            case r.id.img_back:                intent intent = new intent();                intent.putextra(id, -1);                setresult(result_ok, intent);                finish();                break;        }    }  
以上代码仅供参考,如果想了解更多的大疆无人机二次开发过程可以私信我,源代码因为涉及到商业使用不能给大家共享,有什么问题我可以帮你解决。


舜宇光学4月份各项产品的出货情况发布 增长力强劲!
云原生时代的Java,仍在受欢迎吗
土壤微量元素测定仪的功能及参数
先统一电池标准 再建租赁网络
传感器使用不锈钢材质的好处
基于Mobile SDK V4版固件开发大疆无人机手机端遥控器(3)
人脸识别访客系统解决方案
多个手机品牌进军智能家电领域 促进了智能家电行业更快发展
VR技术还能够缩短无人驾驶实际路测所需时间?
Linux常用的命令和技巧概述
核心网运维经历的发展变迁史
Gravity电化学氧气传感器寿命、工作原理及应用介绍
基于电磁感应原理的无线电力传输应用
ph电极的工作原理(PH电极的特点和分类及用途)
锂电和燃料电池低温性能与可靠性的比较分析
5G前传网络对光模块的需求呈爆发式增长
Firefly -RK3399电源适配器介绍
城市排水监测解决方案
零开发门槛,纽瑞芯UWB芯片600系列携新成员激活IoT、智能设备、智能家居市场多样化应用
通用有源滤波器电路