From 3823dc87eb8ef4d5cd25390ec9b17c856d10fafd Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Thu, 16 Nov 2023 15:07:55 +0800
Subject: [PATCH] 图斑飞行途中进入控制
---
src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java | 27 ++++++++++++-
src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java | 2
src/main/java/com/dji/sample/control/service/IControlService.java | 14 +++++++
src/main/java/com/dji/sample/control/service/IDrcService.java | 1
src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java | 26 +++++++++---
5 files changed, 60 insertions(+), 10 deletions(-)
diff --git a/src/main/java/com/dji/sample/control/service/IControlService.java b/src/main/java/com/dji/sample/control/service/IControlService.java
index dfe0a7c..1c7485d 100644
--- a/src/main/java/com/dji/sample/control/service/IControlService.java
+++ b/src/main/java/com/dji/sample/control/service/IControlService.java
@@ -4,7 +4,10 @@
import com.dji.sample.component.mqtt.model.CommonTopicReceiver;
import com.dji.sample.control.model.enums.DroneAuthorityEnum;
import com.dji.sample.control.model.param.*;
+import com.dji.sample.wayline.model.param.PointPOJO;
import org.springframework.messaging.MessageHeaders;
+
+import java.util.List;
/**
* @author sean
@@ -89,4 +92,15 @@
*/
ResponseResult takePhoto(String sn,String payloadIndex) throws Exception;
+ /**
+ * 飞向下一个目标点
+ * @param targetList 目标点集合
+ * @param curIndex 当前飞行点索引
+ * @param sn
+ * @param payloadIndex 负载
+ * @return
+ * @throws Exception
+ */
+ ResponseResult flyToNextPoint(List<PointPOJO> targetList, int curIndex, String sn, String payloadIndex) throws Exception;
+
}
diff --git a/src/main/java/com/dji/sample/control/service/IDrcService.java b/src/main/java/com/dji/sample/control/service/IDrcService.java
index 505f526..7a797c0 100644
--- a/src/main/java/com/dji/sample/control/service/IDrcService.java
+++ b/src/main/java/com/dji/sample/control/service/IDrcService.java
@@ -45,6 +45,7 @@
/**
* Make the dock enter drc mode. And grant relevant permissions.
+ * 使机场进入drc模式。并授予相关权限
* @param workspaceId
* @param param
* @return
diff --git a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
index c186883..3e36a3b 100644
--- a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
+++ b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
@@ -100,6 +100,16 @@
RedisOpsUtils.setWithExpire(serviceIdentifier + RedisConst.DELIMITER + bid, sn,
RedisConst.DEVICE_ALIVE_SECOND * RedisConst.DEVICE_ALIVE_SECOND);
}
+
+ //当执行返航指令时,删除图斑redis
+ if (serviceIdentifier == "return_home"){
+ if (RedisOpsUtils.checkExist("tuban:" + sn)){
+ RedisOpsUtils.del("tuban:" + sn);
+ }
+ }
+
+
+
return ResponseResult.success();
}
@@ -205,27 +215,32 @@
eventsReceiver.getStatus().getMessage() : eventsReceiver.getResult().getErrorMsg())
.result(eventsReceiver.getResult().getErrorCode())
.build());
-
+ //当飞向目标点成功后
if (eventsReceiver.getStatus().equals(FlyToStatusEnum.WAYLINE_OK)) {
JSONObject jsonObject = (JSONObject) RedisOpsUtils.get("tuban:" + dockSn);
if (jsonObject != null) {
List<PointPOJO> targetList = (List<PointPOJO>) jsonObject.get("targetList");
int curIndex = (Integer) jsonObject.get("curIndex");
String payloadIndex = jsonObject.getString("payloadIndex");
- flyToNextPoint(targetList, curIndex, dockSn, payloadIndex);
+ flyToNextPoint(targetList, curIndex+1, dockSn, payloadIndex);
}
}
return receiver;
}
- private ResponseResult flyToNextPoint(List<PointPOJO> targetList, int curIndex, String sn, String payloadIndex) throws Exception {
- curIndex = curIndex + 1;
+ @Override
+ public ResponseResult flyToNextPoint(List<PointPOJO> targetList, int curIndex, String sn, String payloadIndex) throws Exception {
//当无人机状态为人工时再发布下一个命令
while (true) {
Optional<DeviceDTO> dockOpt = deviceRedisService.getDeviceOnline(sn);
DeviceModeCodeEnum deviceMode = deviceService.getDeviceMode(dockOpt.get().getChildDeviceSn());
if (DeviceModeCodeEnum.MANUAL == deviceMode) {
+
+ //执行拍照
+ ResponseResult responseResult = takePhoto(sn, payloadIndex);
+
+ //发布飞行指令
if (curIndex == targetList.size()) {
//当前是最后一个点,返航
ResponseResult returnHome = controlDockDebug(sn, "return_home", null);
@@ -245,9 +260,6 @@
pointDTO.setLatitude(targetList.get(curIndex).getLat());
pointDTOS.add(pointDTO);
flyToPointParam.setPoints(pointDTOS);
-
- //执行拍照
- ResponseResult responseResult = takePhoto(sn, payloadIndex);
//发布下一个飞行指令
ResponseResult flyToRes = flyToPoint(sn, flyToPointParam);
diff --git a/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java b/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java
index aade731..1f5307c 100644
--- a/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java
+++ b/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java
@@ -1,5 +1,6 @@
package com.dji.sample.control.service.impl;
+import com.alibaba.fastjson.JSONObject;
import com.dji.sample.common.model.ResponseResult;
import com.dji.sample.component.mqtt.config.MqttConfiguration;
import com.dji.sample.component.mqtt.model.*;
@@ -18,6 +19,7 @@
import com.dji.sample.control.service.IControlService;
import com.dji.sample.control.service.IDrcService;
import com.dji.sample.manage.model.dto.DeviceDTO;
+import com.dji.sample.manage.model.enums.DockDrcStateEnum;
import com.dji.sample.manage.model.enums.DockModeCodeEnum;
import com.dji.sample.manage.model.enums.UserTypeEnum;
import com.dji.sample.manage.model.receiver.OsdSubDeviceReceiver;
@@ -26,6 +28,7 @@
import com.dji.sample.wayline.model.dto.WaylineTaskProgressReceiver;
import com.dji.sample.wayline.model.enums.WaylineJobStatusEnum;
import com.dji.sample.wayline.model.enums.WaylineTaskStatusEnum;
+import com.dji.sample.wayline.model.param.PointPOJO;
import com.dji.sample.wayline.model.param.UpdateJobParam;
import com.dji.sample.wayline.service.IWaylineJobService;
import com.dji.sample.wayline.service.IWaylineRedisService;
@@ -149,7 +152,7 @@
String pubTopic = topic + TopicConst.DOWN;
String subTopic = topic + TopicConst.UP;
- // If the dock is in drc mode, refresh the permissions directly.
+ // If the dock is in drc mode, refresh the permissions directly. 如果dock处于drc模式,直接刷新权限
if (deviceService.checkDockDrcMode(param.getDockSn())
&& param.getClientId().equals(this.getDrcModeInRedis(param.getDockSn()))) {
refreshAcl(param.getDockSn(), param.getClientId(), topic, subTopic);
@@ -209,7 +212,7 @@
}
@ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_DRC_STATUS_NOTIFY, outputChannel = ChannelName.OUTBOUND_EVENTS)
- public CommonTopicReceiver handleDrcStatusNotify(CommonTopicReceiver receiver, MessageHeaders headers) {
+ public CommonTopicReceiver handleDrcStatusNotify(CommonTopicReceiver receiver, MessageHeaders headers) throws Exception {
String dockSn = receiver.getGateway();
Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(dockSn);
@@ -225,6 +228,26 @@
.message(eventsReceiver.getResult().getErrorMsg())
.result(eventsReceiver.getResult().getErrorCode()).build());
}
+
+ //当进入控制时,停止当前的图斑飞行
+ if (eventsReceiver.getDrcState()==DockDrcStateEnum.CONNECTED){
+ JSONObject jsonObject = (JSONObject) RedisOpsUtils.get("tuban:" + dockSn);
+ if (jsonObject != null) {
+ controlService.flyToPointStop(dockSn);
+ }
+ }
+
+ //当退出控制后,继续执行图斑飞行
+ if(eventsReceiver.getDrcState() == DockDrcStateEnum.DISCONNECTED){
+ JSONObject jsonObject = (JSONObject) RedisOpsUtils.get("tuban:" + dockSn);
+ if (jsonObject != null) {
+ List<PointPOJO> targetList = (List<PointPOJO>) jsonObject.get("targetList");
+ int curIndex = (Integer) jsonObject.get("curIndex");
+ String payloadIndex = jsonObject.getString("payloadIndex");
+ controlService.flyToNextPoint(targetList, curIndex, dockSn, payloadIndex);
+ }
+ }
+
return receiver;
}
diff --git a/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java b/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
index 0d2d1a7..7123c9a 100644
--- a/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
+++ b/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
@@ -729,7 +729,7 @@
List<PointDTO> pointDTOS = new ArrayList<>();
PointDTO pointDTO = new PointDTO();
- pointDTO.setHeight(150.0);
+ pointDTO.setHeight(120.0);
pointDTO.setLongitude(targetList.get(0).getLon());
pointDTO.setLatitude(targetList.get(0).getLat());
pointDTOS.add(pointDTO);
--
Gitblit v1.9.3