第三篇文章准备单独拿出来写,因为在大疆为人机的所有功能中,航线规划的功能最为复杂,也相当的繁琐,这里需要说仔细一点,可能会将代码进行多步分解。
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、智能设备、智能家居市场多样化应用
通用有源滤波器电路