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的技术教程,希望大家喜欢,如果帮到你或者你喜欢可以打赏几毛钱买奶粉,一分不嫌少一万不嫌多。

发表回复