大疆V5MSDK航线任务

DJIV5 MSDK 航线任务

版本Android MSDK V5.8.0

最近做大疆的最新版本的android MSDKV5版本技术开发,首选用官方一个教程发现大疆的航线执行正常,自己引入项目中M300RTK无人机执行任务正常,但是当试用Mavic3T无人机的时候,执行任务发现航线上传成功,执行任务等待了好久确返回失败,返回“航线指令超时”,日志如下图,下面代码里已经解决

首选是航线任务类,这里编写最精简的上传执行任务,至于航线暂停,继续和停止任务功能,大家根据这段代码自己改个调用函数就可以

public class WaypointV3Activity extends AppCompatActivity {
    private Button open_left, kml_img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_waypoint_v3);

        initView();
        //新增监听机制
        addWaypointListener();
    }

    private String WAYPOINT_FILE_TAG = ".kmz";
    String curMissionPath = "/storage/emulated/0/KMZ/付测试航线.kmz";
    private void initView() {
        open_left = findViewById(R.id.open_left);
        kml_img = findViewById(R.id.kml_img);
        open_left.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                doWaypointTask("/storage/emulated/0/KMZ/付测试航线.kmz");
            }
        });
        kml_img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startWaypoint("/storage/emulated/0/KMZ/付测试航线.kmz");
            }
        });
    }

    private void doWaypointTask(String kmzFilePath) {
        if (WaypointMissionManager.getInstance() != null) {
            WaypointMissionManager.getInstance().pushKMZFileToAircraft(kmzFilePath, new CommonCallbacks.CompletionCallbackWithProgress<Double>() {
                @Override
                public void onProgressUpdate(Double aDouble) {
                    LogUtils.d("waypoint", "pushKMZFileToAircraft onProgressUpdate" + aDouble);
                }

                @Override
                public void onSuccess() {
                    showToast("pushKMZFileToAircraft Mission Upload Success" + kmzFilePath);
                    List<Integer> iDs = WaypointMissionManager.getInstance().getAvailableWaylineIDs(kmzFilePath);
                    LogUtils.d("waypoint", "iDs" + iDs.size() + "," + iDs.get(0));
//                    startWaypoint(kmzFilePath);
                }

                @Override
                public void onFailure(@NonNull IDJIError idjiError) {
                    LogUtils.d("waypoint", "pushKMZFileToAircraft Mission Upload Failed" + idjiError.description());
                }
            });
        }
    }

    private void startWaypoint(String kmzFilePath) {
        if (WaypointMissionManager.getInstance() != null) {
            String fileName = FileUtils.getFileName(curMissionPath, WAYPOINT_FILE_TAG);
            WaypointMissionManager.getInstance().startMission(fileName, new CommonCallbacks.CompletionCallback() {
                @Override
                public void onSuccess() {
                    showToast("成功执行航线任务");
                }

                @Override
                public void onFailure(@NonNull IDJIError idjiError) {
                    showToast("执行航线任务失败" + idjiError.description() + kmzFilePath);
                    LogUtils.d("WaypointV3", "执行任务失败返回" + kmzFilePath + idjiError.description() + "," + idjiError.errorCode() + "," + idjiError.toString());
                }
            });
        }
    }

    private void addWaypointListener() {
        WaypointMissionManager.getInstance().addWaypointMissionExecuteStateListener(waypointMissionExecuteStateListener);
        WaypointMissionManager.getInstance().addWaylineExecutingInfoListener(waylineExecutingInfoListener);
        WaypointMissionManager.getInstance().addWaypointActionListener(waypointActionListener);
    }

    private void clearWaypointListener() {
        WaypointMissionManager.getInstance().removeWaypointMissionExecuteStateListener(waypointMissionExecuteStateListener);
        WaypointMissionManager.getInstance().removeWaylineExecutingInfoListener(waylineExecutingInfoListener);
        WaypointMissionManager.getInstance().removeWaypointActionListener(waypointActionListener);
        //清空所有waypoint监听
        WaypointMissionManager.getInstance().clearAllWaypointMissionExecuteStateListener();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        clearWaypointListener();
    }

    private WaypointMissionExecuteStateListener waypointMissionExecuteStateListener = new WaypointMissionExecuteStateListener() {
        @Override
        public void onMissionStateUpdate(WaypointMissionExecuteState missionState) {
            if (WaypointMissionExecuteState.FINISHED == missionState) {
                showToast("Mission Finished");
                LogUtils.d("WaypointV3", "State is:" + missionState.name());
            }

            LogUtils.d("WaypointV3", "State is:" + missionState.name());
        }
    };

    private WaylineExecutingInfoListener waylineExecutingInfoListener = new WaylineExecutingInfoListener() {
        @Override
        public void onWaylineExecutingInfoUpdate(WaylineExecutingInfo excutingWaylineInfo) {

            LogUtils.d("WaypointV3", "Wayline Execute Info WaylineID" + excutingWaylineInfo.getWaylineID()
                    + "WaypointIndex:" + excutingWaylineInfo.getCurrentWaypointIndex()
                    + "MissionName : " + excutingWaylineInfo.getMissionFileName()
            );
//            nextWayPoint = excutingWaylineInfo.getCurrentWaypointIndex();
        }

        @Override
        public void onWaylineExecutingInterruptReasonUpdate(IDJIError error) {
            if (error != null) {
                LogUtils.e("WaypointV3", "interrupt error${error.description()}" + error.description());
            }
        }
    };

    private WaypointActionListener waypointActionListener = new WaypointActionListener() {
        @Override
        public void onExecutionStart(int actionId) {
            LogUtils.e("WaypointV3", "onExecutionStart" + actionId);
        }

        @Override
        public void onExecutionFinish(int actionId, @Nullable IDJIError error) {
            LogUtils.e("WaypointV3", "onExecutionFinish" + actionId);
        }

        @Override
        public void onExecutionStart(int actionGroup, int actionId) {
            LogUtils.e("WaypointV3", actionGroup + "onExecutionStart" + actionId);
        }

        @Override
        public void onExecutionFinish(int actionGroup, int actionId, @Nullable IDJIError error) {
            LogUtils.e("WaypointV3", actionGroup + "onExecutionFinish" + actionId);
        }
    };


    /**
     * 消息提示
     *
     * @param message 字符串
     */
    private void showToast(String message) {
        if (TextUtils.isEmpty(message)) {
            return;
        }
        Toaster.setGravity(Gravity.BOTTOM);
        Toaster.show(message);//解决7.1.2版本的Toast系统bug
    }

}

上面这个就是能够运行的代码块,这里只编写MSDK的航线执行逻辑功能,大家自己加个xml布局文件加上那两个按钮就可以了。若是有人需要源码,可以联系我,我也可以把这快代码块提出来提供给你。

Tips:前面说的异常问题主要是因为我之前调用startWaypoint方法,传入的是curMissionPath这个路径没有提取文件名,导致startMission里传入的是文件路径,M300RTK是可以执行航线的,但是Mavaic3T不能执行航线,当我用String fileName = FileUtils.getFileName(curMissionPath, WAYPOINT_FILE_TAG);这个方法提取出名字后,Mavic3T就能正常startMission了,而且M300RTK也能正常执行,我觉得这算个小bug具体原因得问大疆技术客服,我这里用这个方法解决了问题。

个人网站,后续会根据大家的需求写大疆MSDK的技术教程,希望大家喜欢,如果帮到你或者你喜欢可以打赏几毛钱买奶粉,一分不嫌少一万不嫌多。


已发布

分类

来自

标签:

评论

《“大疆V5MSDK航线任务”》 有 1 条评论

  1. […] 然后可以执行航线任务了,可以查看”大疆V5MSDK航线任务“这篇文档避坑。 […]

回复 大疆生成V5的航线(一) – 付的技术小窝 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注