环球消息!基于MobileSDKV4版固件开发大疆无人机手机端遥控器(3)

2023-06-15 12:16:41     来源 : 面包芯语

第三篇文章准备单独拿出来写,因为在大疆为人机的所有功能中,航线规划的功能最为复杂,也相当的繁琐,这里需要说仔细一点,可能会将代码进行多步分解。

航线规划

在地图中手动选择点位选择完成航线打点;若打点位置错了可进行点位删除。

可对航线点位进行设置,如飞行高度,速度(慢速: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

以上代码仅供参考,如果想了解更多的大疆无人机二次开发过程可以私信我,源代码因为涉及到商业使用不能给大家共享,有什么问题我可以帮你解决。

标签:

推荐文章

X 关闭

最新资讯

X 关闭

Copyright ©  2015-2022 起点安防网版权所有  备案号:皖ICP备2022009963号-12   联系邮箱: 39 60 29 14 2@qq.com