环球消息!基于MobileSDKV4版固件开发大疆无人机手机端遥控器(3)
第三篇文章准备单独拿出来写,因为在大疆为人机的所有功能中,航线规划的功能最为复杂,也相当的繁琐,这里需要说仔细一点,可能会将代码进行多步分解。
航线规划
在地图中手动选择点位选择完成航线打点;若打点位置错了可进行点位删除。
可对航线点位进行设置,如飞行高度,速度(慢速:3m/s;中速: 7m/s;高速:10 m/s)、任务结束后操作及航向,点击[设置]按钮完成设置。
(资料图片)
设置完成后会显示总距离及飞行总时间。
点击[上传]按钮,进行航线上传。可以进入本地存储中选择航线文件进行上传,航线文件为 .kml结尾。
点击 [开始]按钮,则可对航线进行执行。若中途需要暂停也可点击[暂停]安装进行暂停操作。
按钮即可进入航线管理界面。
点击[获取]按钮,即可将航线信息展示到地图界面中。
主要功能代码
创建activity_setting_route.xml及SettingRouteActivity文件。
include>Button>Button>Button>Button>Button>Button>LinearLayout>TextView>TextView>TextView>TextView>TextView>LinearLayout>RelativeLayout>LinearLayout>
publicclassSettingRouteActivityextendsBaseActivityimplementsAMap.OnMarkerClickListener,View.OnClickListener,AMap.OnMapClickListener,LocationSource,AMapLocationListener,AMap.InfoWindowAdapter{@BindView(R.id.layout_route)ViewmViewLayoutToolbar;@BindView(R.id.ll_route)LinearLayoutmLinearLayout;@BindView(R.id.tv_toolbar_title)TextViewmTextViewToolbarTitle;//@BindView(R.id.map)//MapViewmMapView;@BindView(R.id.btn_delete)ButtonmButtonDelete;@BindView(R.id.btn_finish)ButtonmButtonFinish;@BindView(R.id.btn_setting)ButtonmButtonSetting;@BindView(R.id.btn_upload)ButtonmButtonUpload;@BindView(R.id.btn_start)ButtonmButtonStart;@BindView(R.id.btn_stop)ButtonmButtonStop;@BindView(R.id.ll_information)LinearLayoutmLinearLayoutInformation;@BindView(R.id.tv_height)TextViewmTextViewHeight;@BindView(R.id.tv_speed)TextViewmTextViewSpeed;@BindView(R.id.tv_count)TextViewmTextViewCount;@BindView(R.id.tv_distance)TextViewmTextViewDistance;@BindView(R.id.tv_time)TextViewmTextViewTime;privateMapViewmMapView;privateOnLocationChangedListenermListener;privateAMapLocationClientmlocationClient;privateAMapLocationClientOptionmLocationOption;privatedoubleD_latitude,D_longitude;privateUiSettingsmUiSettings;privateAMapaMap;privateMarkerdroneMarker=null;privatefloataltitude=100.0f;privatefloatmSpeed=10.0f;privatebooleanisAdd=false;privatefinalMapmMarkers=newConcurrentHashMap();privateMarkermClickMarker;privateListwaypointList=newArrayList<>();privateListmLatLng=newArrayList<>();privateListmPointInfo=newArrayList<>();publicstaticWaypointMission.BuilderwaypointMissionBuilder;privateFlightControllermFlightController;privateWaypointMissionOperatorinstance;privateWaypointMissionFinishedActionmFinishedAction=WaypointMissionFinishedAction.NO_ACTION;privateWaypointMissionHeadingModemHeadingMode=WaypointMissionHeadingMode.AUTO;privateSQLiteHelpermSQLiteHelper;privateStringFinishedAction,HeadingMode;//自定义窗体ViewinfoWindow=null;intspeed_RG_id=0;intactionAfterFinished_RG_id=0;intheading_RG_id=0;//kimstaticReadKmlreadKml=newReadKml();privatestaticListsampleList=readKml.getCoordinateList();@OverridepublicvoidinitViews(){mLinearLayout.setVisibility(View.VISIBLE);mTextViewToolbarTitle.setText("航线规划");IntentFilterfilter=newIntentFilter();filter.addAction(ReceiverApplication.FLAG_CONNECTION_CHANGE);registerReceiver(mReceiver,filter);mMapView=findViewById(R.id.map);mMapView.onCreate(InstanceState);initMapView();addListener();onProductConnectionChange();}@OverrideprotectedvoidonResume(){super.onResume();initFlightController();mMapView.onResume();}/***方法必须重写*/@OverrideprotectedvoidonSaveInstanceState(BundleoutState){super.onSaveInstanceState(outState);mMapView.onSaveInstanceState(outState);}@OverrideprotectedvoidonPause(){super.onPause();mMapView.onPause();deactivate();}@OverrideprotectedvoidonDestroy(){super.onDestroy();unregisterReceiver(mReceiver);removeListener();mMapView.onDestroy();if(null!=mlocationClient){mlocationClient.onDestroy();}}@OverridepublicvoidinitDatas(){}@OverrideprotectedvoidrequestData(){}privatevoidinitMapView(){if(aMap==null){aMap=mMapView.getMap();mUiSettings=aMap.getUiSettings();mUiSettings.setMyLocationButtonEnabled(true);mUiSettings.setScaleControlsEnabled(true);aMap.setOnMapClickListener(this);//addthelistenerforclickforamapobjectaMap.setLocationSource(this);aMap.setMyLocationEnabled(true);aMap.setInfoWindowAdapter(this);aMap.setOnMarkerClickListener(this);setupLocationStyle();}}privatevoidsetupLocationStyle(){//自定义系统定位蓝点MyLocationStylemyLocationStyle=newMyLocationStyle();//自定义定位蓝点图标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})@OverridepublicvoidonClick(Viewv){switch(v.getId()){caseR.id.img_back:SettingRouteActivity.this.finish();break;caseR.id.img_kml_input:Intentintent=newIntent(Intent.ACTION_GET_CONTENT);intent.setType("*/*");//设置类型,我这里是任意类型,任意后缀的可以这样写。intent.addCategory(Intent.CATEGORY_OPENABLE);startActivityForResult(intent,MyStatic.REQUEST_CODE_FILE);break;caseR.id.img_setting_route:enableDisableAdd();break;caseR.id.img_setting_clear:runOnUiThread(newRunnable(){@Overridepublicvoidrun(){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;caseR.id.img_start_fly:atyAction(WaypointActivity.class,MyStatic.REQUEST_CODE_ID);break;caseR.id.btn_delete:runOnUiThread(newRunnable(){@Overridepublicvoidrun(){aMap.clear();}});for(inti=0;i-90&&latitude<90&&longitude>-180&&longitude<180)&&(latitude!=0f&&longitude!=0f);}protectedBroadcastReceivermReceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){onProductConnectionChange();}};privatevoidonProductConnectionChange(){initFlightController();}privatevoidaddListener(){if(getWaypointMissionOperator()!=null){getWaypointMissionOperator().addListener(eventNotificationListener);}}privatevoidremoveListener(){if(getWaypointMissionOperator()!=null){getWaypointMissionOperator().removeListener(eventNotificationListener);}}privateWaypointMissionOperatorListenereventNotificationListener=newWaypointMissionOperatorListener(){@OverridepublicvoidonDownloadUpdate(WaypointMissionDownloadEventdownloadEvent){}@OverridepublicvoidonUploadUpdate(WaypointMissionUploadEventuploadEvent){}@OverridepublicvoidonExecutionUpdate(WaypointMissionExecutionEventexecutionEvent){}@OverridepublicvoidonExecutionStart(){}@OverridepublicvoidonExecutionFinish(@NullablefinalDJIErrorerror){showToasts("Executionfinished:"+(error==null?"Success!":error.getDescription()));}};publicWaypointMissionOperatorgetWaypointMissionOperator(){if(instance==null){instance=DJISDKManager.getInstance().getMissionControl().getWaypointMissionOperator();}returninstance;}@OverridepublicvoidonMapClick(LatLngpoint){if(isAdd==true){markWaypoint(point);WaypointmWaypoint=newWaypoint(point.latitude,point.longitude,altitude);//AddWaypointstoWaypointarraylist;if(waypointMissionBuilder!=null){waypointList.add(mWaypoint);waypointMissionBuilder.waypointList(waypointList).waypointCount(waypointList.size());}else{waypointMissionBuilder=newWaypointMission.Builder();waypointList.add(mWaypoint);waypointMissionBuilder.waypointList(waypointList).waypointCount(waypointList.size());}mTextViewCount.setText("航点数:"+waypointMissionBuilder.getWaypointCount());mTextViewDistance.setText("总距离:"+Math.round(waypointMissionBuilder.calculateTotalDistance())+"m");mTextViewTime.setText("总时间:"+Math.round(waypointMissionBuilder.calculateTotalTime())+"min");}else{if(mClickMarker!=null&&mClickMarker.isInfoWindowShown()){mClickMarker.hideInfoWindow();mButtonDelete.setVisibility(View.GONE);}//showToasts("当前未开启增加点模式");}}privatevoidmarkWaypoint(LatLngpoint){MarkerOptionsmarkerOptions=newMarkerOptions();markerOptions.position(point);mPointInfo.add(newPointInfo(point.latitude,point.longitude));markerOptions.title("航点"+(mMarkers.size()+1));markerOptions.snippet("事件:");markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));markerOptions.infoWindowEnable(true);Markermarker=aMap.addMarker(markerOptions);mMarkers.put(mMarkers.size(),marker);marker.showInfoWindow();if(mMarkers.size()>0){mLatLng.clear();PolylineOptionsPolylineOptions=newPolylineOptions();for(inti=0;i0){PolylineOptionsPolylineOptions=newPolylineOptions();PolylineOptions.addAll(mLatLng);PolylineOptions.width(10);PolylineOptions.color(Color.argb(255,1,1,1));aMap.addPolyline(PolylineOptions);}waypointMissionBuilder.waypointList(waypointList).waypointCount(waypointList.size());mTextViewCount.setText("航点数:"+waypointMissionBuilder.getWaypointCount());mTextViewDistance.setText("总距离:"+Math.round(waypointMissionBuilder.calculateTotalDistance())+"m");mTextViewTime.setText("总时间:"+Math.round(waypointMissionBuilder.calculateTotalTime())+"min");MyLog.d("航点数:"+waypointMissionBuilder.getWaypointCount());MyLog.d("总距离:"+waypointMissionBuilder.calculateTotalDistance());MyLog.d("总时间:"+waypointMissionBuilder.calculateTotalTime());mButtonDelete.setVisibility(View.GONE);}/***定位成功后回调函数*/@OverridepublicvoidonLocationChanged(AMapLocationamapLocation){if(mListener!=null&&amapLocation!=null){if(amapLocation!=null&&amapLocation.getErrorCode()==0){D_latitude=amapLocation.getLatitude();//获取纬度D_longitude=amapLocation.getLongitude();//获取经度mListener.onLocationChanged(amapLocation);//显示系统小蓝点aMap.moveCamera(CameraUpdateFactory.zoomTo(18));}else{StringerrText="定位失败,"+amapLocation.getErrorCode()+":"+amapLocation.getErrorInfo();Log.e("AmapErr",errText);}}}@Overridepublicvoidactivate(OnLocationChangedListenerlistener){mListener=listener;if(mlocationClient==null){try{mlocationClient=newAMapLocationClient(this);}catch(Exceptione){e.printStackTrace();}mLocationOption=newAMapLocationClientOption();//设置定位监听mlocationClient.setLocationListener(this);//设置为高精度定位模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置定位参数mLocationOption.setOnceLocation(true);mlocationClient.setLocationOption(mLocationOption);//此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,//注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求//在定位结束后,在合适的生命周期调用onDestroy()方法//在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除mlocationClient.startLocation();}}@Overridepublicvoiddeactivate(){mListener=null;if(mlocationClient!=null){mlocationClient.stopLocation();mlocationClient.onDestroy();}mlocationClient=null;}@OverridepublicViewgetInfoWindow(Markermarker){if(infoWindow==null){infoWindow=LayoutInflater.from(this).inflate(R.layout.amap_info_window,null);}render(marker,infoWindow);returninfoWindow;}/***自定义infoWindow窗口*/privatevoidrender(Markermarker,ViewinfoWindow){TextViewtitle=infoWindow.findViewById(R.id.info_window_title);TextViewcontent=infoWindow.findViewById(R.id.info_window_content);title.setText(marker.getTitle());content.setText(marker.getSnippet());}@OverridepublicViewgetInfoContents(Markermarker){returnnull;}@OverridepublicbooleanonMarkerClick(Markermarker){marker.showInfoWindow();mClickMarker=marker;mButtonDelete.setVisibility(View.VISIBLE);//aMap.moveCamera(CameraUpdateFactory.newCameraPosition(newCameraPosition(marker.getPosition(),18,0,0)));returntrue;}privatevoidshowSettingDialog(){LinearLayoutwayPointSettings=(LinearLayout)getLayoutInflater().inflate(R.layout.dialog_waypointsetting,null);finalTextViewwpAltitude_TV=(TextView)wayPointSettings.findViewById(R.id.altitude);RadioGroupspeed_RG=(RadioGroup)wayPointSettings.findViewById(R.id.speed);RadioGroupactionAfterFinished_RG=(RadioGroup)wayPointSettings.findViewById(R.id.actionAfterFinished);RadioGroupheading_RG=(RadioGroup)wayPointSettings.findViewById(R.id.heading);wpAltitude_TV.setText(Math.round(altitude)+"");if(speed_RG_id!=0){RadioButtonradioButton=(RadioButton)speed_RG.findViewById(speed_RG_id);radioButton.setChecked(true);}if(actionAfterFinished_RG_id!=0){RadioButtonradioButton=(RadioButton)actionAfterFinished_RG.findViewById(actionAfterFinished_RG_id);radioButton.setChecked(true);}if(heading_RG_id!=0){RadioButtonradioButton=(RadioButton)heading_RG.findViewById(heading_RG_id);radioButton.setChecked(true);}speed_RG.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){@OverridepublicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){if(checkedId==R.id.lowSpeed){mSpeed=3.0f;}elseif(checkedId==R.id.MidSpeed){mSpeed=5.0f;}elseif(checkedId==R.id.HighSpeed){mSpeed=10.0f;}speed_RG_id=checkedId;}});actionAfterFinished_RG.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){@OverridepublicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){MyLog.d("选择动作完成");if(checkedId==R.id.finishNone){mFinishedAction=WaypointMissionFinishedAction.NO_ACTION;FinishedAction="0";}elseif(checkedId==R.id.finishGoHome){mFinishedAction=WaypointMissionFinishedAction.GO_HOME;FinishedAction="1";}elseif(checkedId==R.id.finishAutoLanding){mFinishedAction=WaypointMissionFinishedAction.AUTO_LAND;FinishedAction="2";}elseif(checkedId==R.id.finishToFirst){mFinishedAction=WaypointMissionFinishedAction.GO_FIRST_WAYPOINT;FinishedAction="3";}actionAfterFinished_RG_id=checkedId;}});heading_RG.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){@OverridepublicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){MyLog.d("选择标题");if(checkedId==R.id.headingNext){mHeadingMode=WaypointMissionHeadingMode.AUTO;HeadingMode="0";}elseif(checkedId==R.id.headingInitDirec){mHeadingMode=WaypointMissionHeadingMode.USING_INITIAL_DIRECTION;HeadingMode="1";}elseif(checkedId==R.id.headingRC){mHeadingMode=WaypointMissionHeadingMode.CONTROL_BY_REMOTE_CONTROLLER;HeadingMode="2";}elseif(checkedId==R.id.headingWP){mHeadingMode=WaypointMissionHeadingMode.USING_WAYPOINT_HEADING;HeadingMode="3";}heading_RG_id=checkedId;}});newAlertDialog.Builder(this).setTitle("航点设置").setView(wayPointSettings).setNeutralButton("设置",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intid){StringaltitudeString=wpAltitude_TV.getText().toString();altitude=Integer.parseInt(nulltoIntegerDefalt(altitudeString));MyLog.e("altitude"+altitude);MyLog.e("speed"+mSpeed);MyLog.e("mFinishedAction"+mFinishedAction);MyLog.e("mHeadingMode"+mHeadingMode);configWayPointMission();}}).setCancelable(false).create().show();}StringnulltoIntegerDefalt(Stringvalue){if(!isIntValue(value))value="0";returnvalue;}booleanisIntValue(Stringval){try{val=val.replace("","");Integer.parseInt(val);}catch(Exceptione){returnfalse;}returntrue;}privatevoidconfigWayPointMission(){if(waypointMissionBuilder==null){waypointMissionBuilder=newWaypointMission.Builder().finishedAction(mFinishedAction).headingMode(mHeadingMode).autoFlightSpeed(mSpeed).maxFlightSpeed(mSpeed).flightPathMode(WaypointMissionFlightPathMode.NORMAL);}else{waypointMissionBuilder.finishedAction(mFinishedAction).headingMode(mHeadingMode).autoFlightSpeed(mSpeed).maxFlightSpeed(mSpeed).flightPathMode(WaypointMissionFlightPathMode.NORMAL);}if(waypointMissionBuilder.getWaypointList().size()>0){for(inti=0;i-1){refreshMapPoint(Id);}break;case102:if(data.getData()!=null){Uriuri=data.getData();//得到uri,后面就是将uri转化成file的过程。Stringimg_path=uri.getPath();try{if(!TextUtils.isEmpty(img_path)){readKml.parseKml(img_path);addSampleMarker();}}catch(Exceptione){e.printStackTrace();}}break;default:break;}}privatevoidrefreshMapPoint(intid){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=newSQLiteHelper(SettingRouteActivity.this);Cursorc=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(inti=0;i0){mLatLng.clear();PolylineOptionsPolylineOptions=newPolylineOptions();for(inti=0;i0){for(inti=0;i
航线管理
创建activity_waypoint.xml和WaypointActivity文件。
include>View>androidx.recyclerview.widget.RecyclerView>LinearLayout>
@Layout(R.layout.activity_waypoint)publicclassWaypointActivityextendsBaseActivityimplementsView.OnClickListener{@BindView(R.id.layout_waypoint)ViewmViewLayoutToolbar;@BindView(R.id.ll_waypoint)LinearLayoutmLinearLayout;@BindView(R.id.tv_toolbar_title)TextViewmTextViewToolbarTitle;@BindView(R.id.rv_waypoint)RecyclerViewmRecyclerView;privateSQLiteHelpermSQLiteHelper;privateListmWaypointInfo=newArrayList<>();privateWaypointAdaptermWaypointAdapter;privateListmWaypointId=newArrayList<>();privateStringStrId="";@OverridepublicvoidinitViews(){mLinearLayout.setVisibility(View.VISIBLE);mTextViewToolbarTitle.setText("航线管理");MyStatic.isChoose=false;}@OverridepublicvoidinitDatas(){mSQLiteHelper=newSQLiteHelper(WaypointActivity.this);Cursorc=mSQLiteHelper.doSelect();if(c!=null){while(c.moveToNext()){mWaypointInfo.add(newWaypointInfo(c.getInt(0),c.getString(1),c.getFloat(2),c.getFloat(3),c.getString(4),c.getString(5),c.getString(6),c.getInt(7),c.getInt(8),c.getInt(9),c.getString(10)));}}c.close();mSQLiteHelper.close();mWaypointAdapter=newWaypointAdapter(R.layout.item_waypoint);mWaypointAdapter.setNewData(mWaypointInfo);initRv(mRecyclerView,mWaypointAdapter);mWaypointAdapter.setOnItemChildClickListener(newBaseQuickAdapter.OnItemChildClickListener(){@OverridepublicvoidonItemChildClick(BaseQuickAdapteradapter,Viewview,intposition){Intentintent=newIntent();intent.putExtra("id",mWaypointInfo.get(position).getId());setResult(RESULT_OK,intent);finish();}});mWaypointAdapter.setOnCheckboxCheckedListener(newWaypointAdapter.OnCheckboxCheckedListener(){@OverridepublicvoidOnCheckboxChecked(booleanisCheck,intposition){if(isCheck){mWaypointId.add(position);}else{if(mWaypointId.contains(position)){mWaypointId.remove(position);}}}});}@OverrideprotectedvoidrequestData(){}@OnClick({R.id.img_way_choose,R.id.img_way_delete,R.id.img_back})@OverridepublicvoidonClick(Viewv){switch(v.getId()){caseR.id.img_way_choose:if(MyStatic.isChoose){MyStatic.isChoose=false;}else{MyStatic.isChoose=true;}if(mWaypointAdapter!=null){mWaypointAdapter.notifyDataSetChanged();}break;caseR.id.img_way_delete:if(mWaypointId.size()>0){for(inti=0;i
以上代码仅供参考,如果想了解更多的大疆无人机二次开发过程可以私信我,源代码因为涉及到商业使用不能给大家共享,有什么问题我可以帮你解决。
标签:
推荐文章
- 环球消息!基于MobileSDKV4版固件开发大疆无人机手机端遥控器(3)
- 现场检查临阵“逃跑”,辉芒微上市迷雾重重
- 环球报道:这是梅西?阿根廷中国行奖杯遭吐槽:梅西的手指怎么少了一根
- 成都工业学院:传媒视角传“党音”,推动主题教育“走新”更“走心”
- 过滤了小米2023年最便宜的智能手机Redmi12的开箱视频
- 美媒:正在消失的白领工作 天天热头条
- 环球观天下!高盛:维持中国生物制药(01177)“买入”评级 目标价5.88港元
- 微软在美国、加拿大和法国推出 Surface 自助维修服务:用户可购买零件更换
- 【太和时评】五月中美关系大事评述|焦点热文
- 2023西部数字经济博览会19日在兰州新区开幕
- 天天速递!云南铜业:2023年公司铜冶炼加工费较2022年有所增长
- 世界观焦点:稀罕!北方豺再现祁连山肃北区域
- 国家统计局:5月份一线城市商品住宅销售价格同比涨幅回落 二三线城市同比涨幅扩大或降幅收窄-快播
- 观察:在浙首次!中国海油助力全球最大港具备国际船舶液化天然气加注能力
- 当前关注:索尼将开启免费PS+多人游戏周末 6月24日上线
- 微资讯!“大思政课”走进企业,让课堂活起来
- 2023中国石墨产业高质量发展论坛在鸡西举行|全球速讯
- 如何让页眉都一样_页眉怎么从第二页开始|全球聚看点
- 时报观察丨退市格局三大变化带来新启示
- 我国首次在空间站开展舱外辐射生物学暴露实验
- 【世界报资讯】粉红玛琍品牌(粉红玛琍的适合年龄)
- 黄金收盘:PPI数据回落黄金收盘走高 但联储决议后黄金电子盘走低
- 月神moon微博 月神moon
- 天天讯息:售价9.49万元起 2024款雪佛兰科鲁泽上市
- distinctive是什么意思_distinctive|报资讯
- 焦点滚动:别克车感叹号亮是什么意思(车感叹号亮是什么意思?)
- 小肥羊火锅简介 小肥羊火锅 热门看点
- 今日精选:网站后台怎么进去_网站后台怎么进
- 谁说燃油车已死 下半年四款燃油新车来袭 都有爆款潜质 全球观焦点
- 全球今日讯!兴化市民论坛400论坛2019_兴化市民论坛400
- 海南定安可提供赛亿电暖器维修服务地址在哪
- 动感相册制作软件_动感相册制作 全球微动态
- 离婚诉讼中父母出资买房子怎么分割
- 兴业银行:减费让利出实招 惠企利民见实效
- 什么是天干地支?_全球聚焦
- 世界微头条丨山东布局建设国家省级水网先导区 疏通水网“毛细血管”
- 中标!中车四方再获新加坡地铁车辆订单
- 全球要闻:邯郸职业技术学院怎么样啊(邯郸职业技术学院怎么样)
- 非法种植毒品原植物罪对应的刑罚是什么? 每日头条
- 辽宁举办“弘扬科学家精神 系好学术生涯‘第一粒扣子’”主题教育实践宣讲活动
- 环球即时看!中汽协:当前国内市场需求依然不强,需要国家继续出台措施加速消费潜能释放
- 陕西特岗计划招聘工作启动|独家
- 希腊南部海域一船只倾覆 已致17人死亡
- 佛山重启购房入户,还能有多少威力? 世界新消息
- 外观定了!三星Galaxy Z Fold5/Z Flip5配件曝光|世界快看
- 6月14日乾胡实业水泥价格动态 每日看点
- 贼吧小说网_贼吧
- 热门看点:为与男友过节,女子竟拨打110求团圆……普陀警方提醒→
- 当前最新:天玛智控跌2.51%创新低 上市即巅峰募资22亿元
- 真人版《小鹿斑比》寻觅导演 莎拉·波利有望执导
- 天天播报:内江市东兴区通报城管与摊贩冲突事件:6名机动巡查人员停职
- win10光盘映像文件怎么安装笔记本_win10光盘映像文件怎么安装_环球关注
- 哔哩哔哩科幻故事集《明日生存指南》官宣 国产科幻题材全新尝试
- 丰田章男连任丰田汽车公司董事长
X 关闭
最新资讯
- 手机软件:手机如何样安装乐视TV?手机乐视TV下载安装教程 环球热讯
- 餐饮消费复苏势头强劲,预制菜市场高速增长|当前独家
- 扣除比例由75%提高至100% 四部门部署2023年降成本重点工作
- 润本股份、腾达科技等22家公司IPO将上会_当前速看
- 振芯科技:目前没有边缘计算芯片方面布局 天天亮点
- 2023苏州暨阳湖生态园荷花观赏最佳时间-环球观热点
- 天天通讯!个人工作今后努力方向2020年_个人今后工作努力方向
- 山海杨阳:CPI行情符合预期,黄金难以延续大跌走势!|全球热消息
- 精简同事聚会主持词开场白汇总 每日看点
- 苹果手机一直在恢复模式退不出来_苹果手机一直在恢复模式怎么办 天天滚动
- “密件风波”涉37项联邦控罪 特朗普抵达佛州应诉
- 恒辉安防:6月13日融资买入195.69万元,融资融券余额3104.63万元
- 贴吧改昵称一直审核中怎么办(贴吧改昵称)
- 赖清德称大陆“逼迫”台湾民众选择大陆想要的政党,国台办驳斥
- 保定电信助力高考学子畅享数字生活
- 中信建投陈果&华安基金许之彦:创业板50能否逆袭?_环球新资讯
- XR普冉股:6月13日融券净卖出4870股,连续3日累计净卖出1.14万股 天天热点
- 曝利物浦有意尼斯中场图拉姆 报价巴尔韦德遭皇马拒绝
- 当前看点!统计局:6月上旬28种产品价格下降 生猪 外三元价格环比持平
- 佐力药业6月14日盘中涨幅达5% 即时焦点
- 高盛合伙制度出现裂痕,CEO被抱怨乘坐私人飞机去当DJ|全球播报
- 撒贝宁助阵!行业首家央视举办发布会,雅迪巅峰实力再现高光时刻
- 旅游平台频现“幽灵民宿”,消费者“踩坑”叫苦不迭 每日消息
- 即时看!插混SUV领域第二条“鲶鱼” 试驾吉利银河L7
- 桂东电力(600310)6月13日主力资金净买入2484.09万元
- 世界快消息!阴谋与爱情泰剧_爱的圈套 2012年泰国电视剧
- 大众夏朗多少钱一辆_大众夏朗多少钱 讯息
- 大班二月二龙抬头教案_二月二龙抬头有什么民间习俗
- 盘县吧小二贵_盘县吧 当前热文
- 【世界播资讯】姆巴佩为何决裂大巴黎?被哈兰德刺激,去皇马接班本泽马
- 眼看西方坦克被打爆,美国作出危险决定,大批贫铀弹将运往乌克兰
- 【天天速看料】难以跨越的底层逻辑!钢筋笼里困住的,又何止是大学生。
- 福娃欢欢毛绒玩具_福娃欢欢的资料
- 【世界报资讯】苹果Vision Pro将于7月开放开发套件申请 办公、娱乐或成首批热门应用
- 今日qq为什么显示不能重复登录_qq提示不能重复登录qq显示不能重复登录怎么办-天天热文
- 怎么把一个单元格分成两个啊_怎么把一个单元格分成两个 全球焦点
- 热点!丰田小越野车有几款(丰田越野车有几款?)
- 内卷加剧,不降价的蔚来全系降价3万元_焦点热闻
- 天天要闻:魅族历代白面板机型首次集体亮相
- 环球今热点:玉龙纳西族自治县气象台发布地质灾害气象风险Ⅱ级预警【2023-06-13】
- 上门办证零距离,贴心服务暖人心 天天要闻
- 光大银行青岛分行首个线上消费金融合作项目落地-聚焦
- 百事通!地球上的水是从哪里来的?
- 园区支持“商转公”!怎么申请,有哪些要求?
- 环球热资讯!晶科科技最新公告:授权公司管理层办理户用光伏发电系统资产出售
- 智联警务,鸿以安远|鼎桥再出征,见证安博盛况
- 环球新消息丨6月15日至16日,内江自媒体联盟筹备会暨网络达人探甜城活动将举行
- 天天速讯:莫斯科已被纳入轰炸范围,局势随时恶化,普京确认部署战术核武器
- 鹏扬中债30年期国债ETF今日上市 首只超长期限国债ETF 每日速递
- 【环球新要闻】郑东新区龙湖办事处:爱眼“护苗” 守护孩子明眸“视”界
X 关闭