DJI waypointMission的使用以及执行状态的更新
基本要素
完成一次航点任务最少需要 “三步走”
第一步:loadMission,将mission先加载到安卓设备的内存中去,并检验任务的所有信息,比如相邻航点的距离大于0.5米小于2km,总航线长度小于40km,各项必须参数是否存在等。
第二步:uploadMission,将第一步经过校验的任务上传至无人机,这一步有一定的时间消耗,时间长短和航点的数量有直接的关系,当上传完毕后,将会通过回调函数提示上传成功,当然也可以加入一些业务逻辑(比如点亮后续起飞的按钮);
第三步:startMission,开始执行任务。在任务执行的过程中我们可以通过WaypointMissionOperatorListener监听任务执行的进度。
实际应用
在实际应用中,还需要对一些航点动作、飞行速度、机头朝向等参数进行设置,这些内容只要保证在设定的区间以及根据实际需要的合理性即可。比较重要的是,执行策略。 在loadmission之后如果发生错误,应当报告错误并且不执行uploadmission;
用伪代码简单描述:
DJIError djiError = waypointMissionOperator.loadMission(mission);
showResultToast(djiError);
if(Error != NULL){
//--没有错误执行后续逻辑
mission.uploadmission();
}
调用uploadmission需要满足两个前置条件:
getLoadedMission完成和getCurrentState的状态是READY_TO_UPLOAD,所以在调用uploadmission要做相应的检查。
if (WaypointMissionState.READY_TO_RETRY_UPLOAD.equals(waypointMissionOperator.getCurrentState())
|| WaypointMissionState.READY_TO_UPLOAD.equals(waypointMissionOperator.getCurrentState())) {
waypointMissionOperator.uploadMission(new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError djiError) {
showResultToast(djiError);
}
});
}
上传一个任务需要一定的时间,航点越多所需要的时间越久,在上传过程中如果发生了错误会调用上述代码中的回调函数对错误情况进行提示;如果上传成功,上述回调函数仍会被执行一次,返回的djiError为NULL。
在上传任务完成之前,是不能调用起飞命令的,因此在这个回调函数中,应当保证调用起飞命令的安全性。具体的做法是:在回调函数中检验djiError和WaypointMissionState:
@Override
public void onResult(DJIError djiError) {
showResultToast(djiError);
if (WaypointMissionState.READY_TO_EXECUTE.equals(waypointMissionOperator.getCurrentState()) || djiError == NULL){
//--将起飞按钮设置为可交互状态
button.enabele();
}
}
如果上述确认成功,则可以通过button调用startMission。
if (mission != null) {
waypointMissionOperator.startMission(new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError djiError) {
showResultToast(djiError);
}
});
在任务的执行过程中,开一个监听来确认航点任务的执行进度。在WaypointMissionOperator下 new WaypointMissionOperatorListener() 在class WaypointMissionOperatorListener中有多个可重写的方法:onUploadUpdate 、onDownloadUpdate 、onExecutionStart 、 onExecutionUpdate 、 onExecutionFinish 其中最为重要的是onExecutionUpdate,这个方法会在waypointmission过程中多次回调,并刷新任务的信息,这些信息对于区分采集数据至关重要。
在class WaypointMissionExecutionEvent中有3个方法
method getProgress 中targetWaypointIndex显示下个航点的索引;isWaypointReached到达一个航点后为yes 当完成航点动作(如悬停)后,变成no,且targetWaypointIndex+1 ; executeState 是一个枚举类型,显示当前无人机的具体动作或者执行状态。
listener = new WaypointMissionOperatorListener() {
@Override
public void onExecutionUpdate(@NonNull WaypointMissionExecutionEvent waypointMissionExecutionEvent) {
// Example of Execution Listener
index = waypointMissionExecutionEvent.getProgress().targetWaypointIndex;
state = waypointMissionExecutionEvent.getProgress().isWaypointReached;
//--上面两句话在数据采集中做为关键数据,一个是索引值一个是悬停状态。
Log.d(TAG,
(waypointMissionExecutionEvent.getPreviousState() == null
? ""
: waypointMissionExecutionEvent.getPreviousState().getName())
+ ", "
+ waypointMissionExecutionEvent.getCurrentState().getName()
+ (waypointMissionExecutionEvent.getProgress() == null
? ""
: waypointMissionExecutionEvent.getProgress().targetWaypointIndex));
updateWaypointMissionState();
}
};