From 923a5e9fdfcfcc765606bce6fa7f99cb3717dcbe Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Wed, 15 Nov 2023 14:05:06 +0800
Subject: [PATCH] 图斑飞行
---
src/main/resources/jkj(1).json | 151 +++++++++++
src/main/java/com/dji/sample/geo/utils/GeoUtils.java | 182 ++++++++++++++
src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java | 2
src/main/java/com/dji/sample/geo/entity/Geometry.java | 38 ++
src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java | 142 +++++-----
pom.xml | 6
src/main/java/com/dji/sample/geo/entity/Crs.java | 10
src/main/java/com/dji/sample/geo/entity/Property.java | 12
/dev/null | 86 ------
src/main/java/com/dji/sample/geo/entity/Feature.java | 16 +
src/main/java/com/dji/sample/geo/entity/GeoJson.java | 16 +
src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java | 6
src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java | 2
src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java | 81 +++++
src/main/java/com/dji/sample/manage/service/IDeviceService.java | 1
15 files changed, 577 insertions(+), 174 deletions(-)
diff --git a/pom.xml b/pom.xml
index c1e34d1..cbfb229 100644
--- a/pom.xml
+++ b/pom.xml
@@ -153,6 +153,12 @@
</dependency>
<dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.11.3</version>
+ </dependency>
+
+ <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
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 2fb775f..3cee5df 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
@@ -1,5 +1,6 @@
package com.dji.sample.control.service.impl;
+import com.alibaba.fastjson.JSONObject;
import com.dji.sample.common.error.CommonErrorEnum;
import com.dji.sample.common.model.ResponseResult;
import com.dji.sample.component.mqtt.model.*;
@@ -9,10 +10,12 @@
import com.dji.sample.component.websocket.model.BizCodeEnum;
import com.dji.sample.component.websocket.service.ISendMessageService;
import com.dji.sample.control.model.dto.FlyToProgressReceiver;
+import com.dji.sample.control.model.dto.PointDTO;
import com.dji.sample.control.model.dto.ResultNotifyDTO;
import com.dji.sample.control.model.dto.TakeoffProgressReceiver;
import com.dji.sample.control.model.enums.DroneAuthorityEnum;
import com.dji.sample.control.model.enums.DroneControlMethodEnum;
+import com.dji.sample.control.model.enums.FlyToStatusEnum;
import com.dji.sample.control.model.enums.RemoteDebugMethodEnum;
import com.dji.sample.control.model.param.*;
import com.dji.sample.control.service.IControlService;
@@ -24,6 +27,7 @@
import com.dji.sample.manage.service.IDeviceRedisService;
import com.dji.sample.manage.service.IDeviceService;
import com.dji.sample.wayline.model.enums.WaylineErrorCodeEnum;
+import com.dji.sample.wayline.model.param.PointPOJO;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
@@ -32,9 +36,7 @@
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Service;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.UUID;
+import java.util.*;
/**
* @author sean
@@ -97,7 +99,7 @@
"error: " + serviceIdentifier + serviceReply.getResult());
}
if (controlMethodEnum.getProgress()) {
- RedisOpsUtils.setWithExpire(serviceIdentifier + RedisConst.DELIMITER + bid, sn,
+ RedisOpsUtils.setWithExpire(serviceIdentifier + RedisConst.DELIMITER + bid, sn,
RedisConst.DEVICE_ALIVE_SECOND * RedisConst.DEVICE_ALIVE_SECOND);
}
return ResponseResult.success();
@@ -105,6 +107,7 @@
/**
* Handles multi-state command progress information.
+ *
* @param receiver
* @param headers
* @return
@@ -118,7 +121,8 @@
String sn = RedisOpsUtils.get(key).toString();
EventsReceiver<EventsOutputProgressReceiver> eventsReceiver = mapper.convertValue(receiver.getData(),
- new TypeReference<EventsReceiver<EventsOutputProgressReceiver>>(){});
+ new TypeReference<EventsReceiver<EventsOutputProgressReceiver>>() {
+ });
eventsReceiver.setBid(receiver.getBid());
eventsReceiver.setSn(sn);
@@ -186,7 +190,7 @@
@ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_FLY_TO_POINT_PROGRESS, outputChannel = ChannelName.OUTBOUND_EVENTS)
public CommonTopicReceiver handleFlyToPointProgress(CommonTopicReceiver receiver, MessageHeaders headers) {
- String dockSn = receiver.getGateway();
+ String dockSn = receiver.getGateway();
Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(dockSn);
if (deviceOpt.isEmpty()) {
@@ -194,7 +198,8 @@
return null;
}
- FlyToProgressReceiver eventsReceiver = mapper.convertValue(receiver.getData(), new TypeReference<FlyToProgressReceiver>(){});
+ FlyToProgressReceiver eventsReceiver = mapper.convertValue(receiver.getData(), new TypeReference<FlyToProgressReceiver>() {
+ });
webSocketMessageService.sendBatch(deviceOpt.get().getWorkspaceId(), UserTypeEnum.WEB.getVal(),
BizCodeEnum.FLY_TO_POINT_PROGRESS.getCode(),
ResultNotifyDTO.builder().sn(dockSn)
@@ -202,8 +207,63 @@
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");
+ flyToNextPoint(targetList, curIndex, dockSn);
+ }
+ }
return receiver;
}
+
+ private ResponseResult flyToNextPoint(List<PointPOJO> targetList, int curIndex, String sn) {
+ curIndex = curIndex + 1;
+ //当无人机状态为人工时再发布下一个命令
+ while (true) {
+ Optional<DeviceDTO> dockOpt = deviceRedisService.getDeviceOnline(sn);
+ DeviceModeCodeEnum deviceMode = deviceService.getDeviceMode(dockOpt.get().getChildDeviceSn());
+
+ if (DeviceModeCodeEnum.MANUAL == deviceMode) {
+ if (curIndex == targetList.size()) {
+ //当前是最后一个点,返航
+ ResponseResult returnHome = controlDockDebug(sn, "return_home", null);
+
+ RedisOpsUtils.del("tuban:" + sn);
+
+ return returnHome;
+ }
+ else {
+ //当前不是最后一个点,飞行到下一个点
+ FlyToPointParam flyToPointParam = new FlyToPointParam();
+ flyToPointParam.setMaxSpeed(14);
+ List<PointDTO> pointDTOS = new ArrayList<>();
+
+ PointDTO pointDTO = new PointDTO();
+ pointDTO.setHeight(150.0);
+ pointDTO.setLongitude(targetList.get(curIndex).getLon());
+ pointDTO.setLatitude(targetList.get(curIndex).getLat());
+ pointDTOS.add(pointDTO);
+ flyToPointParam.setPoints(pointDTOS);
+
+
+ ResponseResult flyToRes = flyToPoint(sn, flyToPointParam);
+ if (flyToRes.getCode() == ResponseResult.CODE_SUCCESS) {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("targetList", targetList);
+ jsonObject.put("curIndex", curIndex);
+ RedisOpsUtils.set("tuban:" + sn, jsonObject);
+ }
+ return flyToRes;
+
+
+ }
+ }
+ }
+ }
+
private void checkTakeoffCondition(String dockSn) {
Optional<DeviceDTO> dockOpt = deviceRedisService.getDeviceOnline(dockSn);
@@ -231,14 +291,15 @@
@ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_TAKE_OFF_TO_POINT_PROGRESS, outputChannel = ChannelName.OUTBOUND_EVENTS)
public CommonTopicReceiver handleTakeoffToPointProgress(CommonTopicReceiver receiver, MessageHeaders headers) {
- String dockSn = receiver.getGateway();
+ String dockSn = receiver.getGateway();
Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(dockSn);
if (deviceOpt.isEmpty()) {
log.error("机场离线");
return null;
}
- TakeoffProgressReceiver eventsReceiver = mapper.convertValue(receiver.getData(), new TypeReference<TakeoffProgressReceiver>(){});
+ TakeoffProgressReceiver eventsReceiver = mapper.convertValue(receiver.getData(), new TypeReference<TakeoffProgressReceiver>() {
+ });
webSocketMessageService.sendBatch(deviceOpt.get().getWorkspaceId(), UserTypeEnum.WEB.getVal(),
BizCodeEnum.TAKE_OFF_TO_POINT_PROGRESS.getCode(),
@@ -299,7 +360,7 @@
}
@Override
- public ResponseResult requestsConfig(String sn,String method, RequestsParam param) {
+ public ResponseResult requestsConfig(String sn, String method, RequestsParam param) {
ServiceReply serviceReply = messageSenderService.publishRequestsTopic(sn, method, param);
return ResponseResult.CODE_SUCCESS != serviceReply.getResult() ?
ResponseResult.error(serviceReply.getResult(), "错误码:" + serviceReply.getResult())
diff --git a/src/main/java/com/dji/sample/geo/entity/Crs.java b/src/main/java/com/dji/sample/geo/entity/Crs.java
new file mode 100644
index 0000000..6dd0537
--- /dev/null
+++ b/src/main/java/com/dji/sample/geo/entity/Crs.java
@@ -0,0 +1,10 @@
+package com.dji.sample.geo.entity;
+
+import lombok.Data;
+
+@Data
+public class Crs {
+ private String type;
+
+ private Property properties;
+}
diff --git a/src/main/java/com/dji/sample/geo/entity/Feature.java b/src/main/java/com/dji/sample/geo/entity/Feature.java
new file mode 100644
index 0000000..c1d59cc
--- /dev/null
+++ b/src/main/java/com/dji/sample/geo/entity/Feature.java
@@ -0,0 +1,16 @@
+package com.dji.sample.geo.entity;
+
+import lombok.Data;
+
+@Data
+public class Feature {
+
+ private String type;
+
+ private Integer id;
+
+ private Geometry geometry;
+
+ private Property properties;
+
+}
diff --git a/src/main/java/com/dji/sample/geo/entity/GeoJson.java b/src/main/java/com/dji/sample/geo/entity/GeoJson.java
new file mode 100644
index 0000000..29a49a0
--- /dev/null
+++ b/src/main/java/com/dji/sample/geo/entity/GeoJson.java
@@ -0,0 +1,16 @@
+package com.dji.sample.geo.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class GeoJson {
+
+ private String type;
+
+ private Crs crs;
+
+ private List<Feature> features;
+
+}
diff --git a/src/main/java/com/dji/sample/geo/entity/Geometry.java b/src/main/java/com/dji/sample/geo/entity/Geometry.java
new file mode 100644
index 0000000..c42376e
--- /dev/null
+++ b/src/main/java/com/dji/sample/geo/entity/Geometry.java
@@ -0,0 +1,38 @@
+package com.dji.sample.geo.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Geometry {
+ private String type;
+
+ /**
+ * [
+ * [
+ * [
+ * 115.81799999999998,
+ * 28.652296152000076
+ * ],
+ * [
+ * 115.81961010540385,
+ * 28.650053326558464
+ * ],
+ * [
+ * 115.82417867053516,
+ * 28.650434040319453
+ * ],
+ * [
+ * 115.82265581549132,
+ * 28.652908679765517
+ * ],
+ * [
+ * 115.81799999999998,
+ * 28.652296152000076
+ * ]
+ * ]
+ * ]
+ */
+ private List<List<List<Double>>> coordinates;
+}
diff --git a/src/main/java/com/dji/sample/geo/entity/Property.java b/src/main/java/com/dji/sample/geo/entity/Property.java
new file mode 100644
index 0000000..ed86603
--- /dev/null
+++ b/src/main/java/com/dji/sample/geo/entity/Property.java
@@ -0,0 +1,12 @@
+package com.dji.sample.geo.entity;
+
+import lombok.Data;
+
+@Data
+public class Property {
+ private String name;
+
+ private String FID;
+
+ private String Id;
+}
diff --git a/src/main/java/com/dji/sample/geo/utils/GeoUtils.java b/src/main/java/com/dji/sample/geo/utils/GeoUtils.java
new file mode 100644
index 0000000..c2ba4e6
--- /dev/null
+++ b/src/main/java/com/dji/sample/geo/utils/GeoUtils.java
@@ -0,0 +1,182 @@
+package com.dji.sample.geo.utils;
+
+import com.dji.sample.geo.entity.Feature;
+import com.dji.sample.geo.entity.GeoJson;
+import com.dji.sample.wayline.model.param.FlyAreaParam;
+import com.dji.sample.wayline.model.param.PointPOJO;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * 空间计算工具类
+ */
+public class GeoUtils {
+ /**
+ * 默认地球半径
+ */
+ private static double EARTH_RADIUS = 6371000;//赤道半径(单位m)
+
+ /**
+ * 转化为弧度(rad)
+ */
+ private static double rad(double d) {
+ return d * Math.PI / 180.0;
+ }
+
+
+ /**
+ * 计算中心经纬度与目标经纬度的距离(米)
+ *
+ * @param centerLon 中心精度
+ * @param centerLat 中心纬度
+ * @param targetLon 需要计算的精度
+ * @param targetLat 需要计算的纬度
+ * @return 米
+ */
+ public static double distance(double centerLon, double centerLat, double targetLon, double targetLat) {
+
+ double jl_jd = 102834.74258026089786013677476285;// 每经度单位米;
+ double jl_wd = 111712.69150641055729984301412873;// 每纬度单位米;
+ double b = Math.abs((centerLat - targetLat) * jl_jd);
+ double a = Math.abs((centerLon - targetLon) * jl_wd);
+ return Math.sqrt((a * a + b * b));
+ }
+
+ /**
+ * 根据多个点计算中心点
+ * @param list
+ * @return
+ */
+ public static PointPOJO getCenterPoint(List<PointPOJO> list) {
+
+ int total = list.size();
+ double X = 0, Y = 0, Z = 0;
+
+ for (int i = 0; i < list.size(); i++) {
+ PointPOJO point = list.get(i);
+ double lat, lon, x, y, z;
+ lon = point.getLon() * Math.PI / 180;
+ lat = point.getLat() * Math.PI / 180;
+ x = Math.cos(lat) * Math.cos(lon);
+ y = Math.cos(lat) * Math.sin(lon);
+ z = Math.sin(lat);
+ X += x;
+ Y += y;
+ Z += z;
+ }
+
+
+ X = X / total;
+ Y = Y / total;
+ Z = Z / total;
+ double Lon = Math.atan2(Y, X);
+ double Hyp = Math.sqrt(X * X + Y * Y);
+ double Lat = Math.atan2(Z, Hyp);
+
+ PointPOJO centerPoint = new PointPOJO();
+ centerPoint.setLon( Lon * 180 / Math.PI);
+ centerPoint.setLat(Lat * 180 / Math.PI);
+ return centerPoint;
+ }
+
+ /**
+ * 获取点区域并按从近到远排序
+ * @param flyAreaParam
+ * @return
+ */
+ public static List<PointPOJO> caculatePointList(FlyAreaParam flyAreaParam){
+ List<List<PointPOJO>> areaList = flyAreaParam.getAreaList();
+ PointPOJO dockPoint = flyAreaParam.getDockPoint();
+ Double radius = flyAreaParam.getRadius();
+
+ List<PointPOJO> centerPointList = new ArrayList<>();
+
+ //根据区域获取中心点
+ areaList.forEach(area -> {
+ PointPOJO centerPoint = GeoUtils.getCenterPoint(area);
+ centerPointList.add(centerPoint);
+ });
+
+ //巡逻目标集合
+ List<PointPOJO> targetList = new ArrayList<>();
+ //获取所有中心点之后,
+ centerPointList.forEach(centerPoint -> {
+ //判断各个中心点和机场点的距离
+ double distance = GeoUtils.distance(dockPoint.getLon(), dockPoint.getLat(), centerPoint.getLon(), centerPoint.getLat());
+
+ //当距离小于半径时,添加到目标集合中
+ if (distance <= radius) {
+ centerPoint.setDistance(distance);
+ targetList.add(centerPoint);
+ }
+ });
+
+ //按距离从近到远排序
+ targetList.sort(Comparator.comparing(PointPOJO::getDistance));
+ return targetList;
+ }
+
+ /**
+ * 根据geojson获取点区域并按从近到远排序
+ * @param geoJson
+ * @return
+ */
+ public static List<PointPOJO> caculatePointList(GeoJson geoJson,PointPOJO dockPoint,Double radius){
+ List<Feature> features = geoJson.getFeatures();
+
+ List<List<PointPOJO>> areaList = new ArrayList<>();
+
+ features.forEach(feature -> {
+ List<PointPOJO> list = new ArrayList<>();
+ List<List<Double>> coordinates = feature.getGeometry().getCoordinates().get(0);
+
+ coordinates.forEach(coordinate ->{
+ PointPOJO pointPOJO = new PointPOJO();
+
+ pointPOJO.setLon(coordinate.get(0));
+ pointPOJO.setLat(coordinate.get(1));
+
+ list.add(pointPOJO);
+ });
+ areaList.add(list);
+ });
+
+ FlyAreaParam flyAreaParam = new FlyAreaParam();
+
+ flyAreaParam.setDockPoint(dockPoint);
+ flyAreaParam.setRadius(radius);
+ flyAreaParam.setAreaList(areaList);
+
+ List<PointPOJO> pointPOJOS = caculatePointList(flyAreaParam);
+
+ return pointPOJOS;
+ }
+
+ /**
+ * 读取json文件
+ * @param path
+ * @return
+ */
+ public static GeoJson readJsonFile(String path){
+
+ try {
+ File file = new File(path);
+ ObjectMapper objectMapper = new ObjectMapper();
+
+ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+ return objectMapper.readValue(file, GeoJson.class);
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+
+ }
+
+}
diff --git a/src/main/java/com/dji/sample/manage/service/IDeviceService.java b/src/main/java/com/dji/sample/manage/service/IDeviceService.java
index f18476d..f5002d4 100644
--- a/src/main/java/com/dji/sample/manage/service/IDeviceService.java
+++ b/src/main/java/com/dji/sample/manage/service/IDeviceService.java
@@ -212,6 +212,7 @@
/**
* Query the working status of the aircraft.
+ * 查询飞行器的工作状态
* @param deviceSn
* @return
*/
diff --git a/src/main/java/com/dji/sample/utils/GeoUtils.java b/src/main/java/com/dji/sample/utils/GeoUtils.java
deleted file mode 100644
index fbad964..0000000
--- a/src/main/java/com/dji/sample/utils/GeoUtils.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.dji.sample.utils;
-
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.dji.sample.wayline.dao.IWaylineJobMapper;
-import com.dji.sample.wayline.model.dto.WaylineJobDTO;
-import com.dji.sample.wayline.model.entity.WaylineJobEntity;
-import com.dji.sample.wayline.model.param.PointPOJO;
-import com.dji.sample.wayline.service.IWaylineJobService;
-import com.dji.sample.wayline.service.impl.WaylineJobServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.List;
-import java.util.Optional;
-
-/**
- * 空间计算工具类
- */
-public class GeoUtils {
- /**
- * 默认地球半径
- */
- private static double EARTH_RADIUS = 6371000;//赤道半径(单位m)
-
- /**
- * 转化为弧度(rad)
- */
- private static double rad(double d) {
- return d * Math.PI / 180.0;
- }
-
-
- /**
- * 计算中心经纬度与目标经纬度的距离(米)
- *
- * @param centerLon 中心精度
- * @param centerLat 中心纬度
- * @param targetLon 需要计算的精度
- * @param targetLat 需要计算的纬度
- * @return 米
- */
- public static double distance(double centerLon, double centerLat, double targetLon, double targetLat) {
-
- double jl_jd = 102834.74258026089786013677476285;// 每经度单位米;
- double jl_wd = 111712.69150641055729984301412873;// 每纬度单位米;
- double b = Math.abs((centerLat - targetLat) * jl_jd);
- double a = Math.abs((centerLon - targetLon) * jl_wd);
- return Math.sqrt((a * a + b * b));
- }
-
- /**
- * 根据多个点计算中心点
- * @param list
- * @return
- */
- public static PointPOJO getCenterPoint(List<PointPOJO> list) {
-
- int total = list.size();
- double X = 0, Y = 0, Z = 0;
-
- for (int i = 0; i < list.size(); i++) {
- PointPOJO point = list.get(i);
- double lat, lon, x, y, z;
- lon = point.getLon() * Math.PI / 180;
- lat = point.getLat() * Math.PI / 180;
- x = Math.cos(lat) * Math.cos(lon);
- y = Math.cos(lat) * Math.sin(lon);
- z = Math.sin(lat);
- X += x;
- Y += y;
- Z += z;
- }
-
-
- X = X / total;
- Y = Y / total;
- Z = Z / total;
- double Lon = Math.atan2(Y, X);
- double Hyp = Math.sqrt(X * X + Y * Y);
- double Lat = Math.atan2(Z, Hyp);
-
- PointPOJO centerPoint = new PointPOJO();
- centerPoint.setLon( Lon * 180 / Math.PI);
- centerPoint.setLat(Lat * 180 / Math.PI);
- return centerPoint;
- }
-}
diff --git a/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java b/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java
index 5e66deb..455ef03 100644
--- a/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java
+++ b/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java
@@ -189,9 +189,9 @@
*
* @return
*/
- @PostMapping("/{sn}/jobs/flyByArea")
+ @PostMapping("/{sn}/jobs/{device_sn}/flyByArea")
@SysLogAnnotation(operModul = "根据区域飞行", operType = "根据区域飞行", operDesc = "根据区域飞行")
- public ResponseResult flyByArea(@PathVariable(name = "sn") String sn, @RequestBody FlyAreaParam flyAreaParam) {
- return waylineJobService.flyByArea(sn, flyAreaParam);
+ public ResponseResult flyByArea(@PathVariable(name = "sn") String sn, @RequestBody FlyAreaParam flyAreaParam,@PathVariable(name = "device_sn")String deviceSn) {
+ return waylineJobService.flyByArea(sn, flyAreaParam,deviceSn);
}
}
diff --git a/src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java b/src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java
index 9cc00b8..d477347 100644
--- a/src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java
+++ b/src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java
@@ -16,4 +16,6 @@
private List<List<PointPOJO>> areaList;
//无人机巡逻半径 (m)
private Double radius;
+ @JsonProperty(value = "jsonPath")
+ private String jsonPath;
}
diff --git a/src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java b/src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java
index 4be44be..f99ab2c 100644
--- a/src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java
+++ b/src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java
@@ -168,7 +168,7 @@
void updateJobCollect(WaylineJobEntity waylineJob);
- ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam);
+ ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam,String deviceSn);
/**
* 判断是否有下一次任务
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 8ae67ba..a009206 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
@@ -1,11 +1,10 @@
package com.dji.sample.wayline.service.impl;
-import com.alibaba.druid.stat.TableStat;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dji.sample.common.error.CommonErrorEnum;
@@ -23,6 +22,7 @@
import com.dji.sample.control.model.param.TakeoffToPointParam;
import com.dji.sample.control.service.IControlService;
import com.dji.sample.control.service.IDrcService;
+import com.dji.sample.geo.entity.GeoJson;
import com.dji.sample.manage.model.dto.DeviceDTO;
import com.dji.sample.manage.model.enums.DeviceModeCodeEnum;
import com.dji.sample.manage.model.enums.DockModeCodeEnum;
@@ -35,7 +35,7 @@
import com.dji.sample.media.model.MediaFileCountDTO;
import com.dji.sample.media.model.MediaMethodEnum;
import com.dji.sample.media.service.IFileService;
-import com.dji.sample.utils.GeoUtils;
+import com.dji.sample.geo.utils.GeoUtils;
import com.dji.sample.wayline.dao.IWaylineJobMapper;
import com.dji.sample.wayline.model.dto.*;
import com.dji.sample.wayline.model.entity.WaylineJobEntity;
@@ -57,6 +57,7 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
+import java.io.File;
import java.net.URL;
import java.sql.SQLException;
import java.time.*;
@@ -491,13 +492,13 @@
}
@Override
- public Boolean updateJob(WaylineJobDTO dto){
+ public Boolean updateJob(WaylineJobDTO dto) {
try {
- if (dto.getStatus() == 3){
+ if (dto.getStatus() == 3) {
this.checkNextJob(dto);
}
- }catch (SQLException e) {
+ } catch (SQLException e) {
throw new RuntimeException(e);
}
@@ -522,8 +523,8 @@
@Override
public List<WaylineJobDTO> getChildrenJobs(String workspaceId, WaylineJobQueryParam waylineJobQueryParam) {
- List<WaylineJobEntity> list= mapper.getJobs(workspaceId, waylineJobQueryParam);
- List<WaylineJobDTO> records =list
+ List<WaylineJobEntity> list = mapper.getJobs(workspaceId, waylineJobQueryParam);
+ List<WaylineJobDTO> records = list
.stream()
.map(this::entity2Dto)
.collect(Collectors.toList());
@@ -700,39 +701,65 @@
}
@Override
- public ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam) {
+ public ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam, String deviceSn) {
- List<List<PointPOJO>> areaList = flyAreaParam.getAreaList();
+ //获取所有中心点
+// List<PointPOJO> targetList = GeoUtils.caculatePointList(flyAreaParam);
PointPOJO dockPoint = flyAreaParam.getDockPoint();
- Double radius = flyAreaParam.getRadius();
+ GeoJson geoJson = GeoUtils.readJsonFile(flyAreaParam.getJsonPath());
+ List<PointPOJO> targetList = GeoUtils.caculatePointList(geoJson, dockPoint, flyAreaParam.getRadius());
- List<PointPOJO> centerPointList = new ArrayList<>();
+ //一键起飞
+ TakeoffToPointParam takeoffToPointParam = buildTakeoffToPointParam(dockPoint);
- //根据区域获取中心点
- areaList.forEach(area -> {
- PointPOJO centerPoint = GeoUtils.getCenterPoint(area);
- centerPointList.add(centerPoint);
- });
+ ResponseResult takeoffToPointRes = controlService.takeoffToPoint(sn, takeoffToPointParam);
- //巡逻目标集合
- List<PointPOJO> targetList = new ArrayList<>();
- //获取所有中心点之后,
- centerPointList.forEach(centerPoint -> {
- //判断各个中心点和机场点的距离
- double distance = GeoUtils.distance(dockPoint.getLon(), dockPoint.getLat(), centerPoint.getLon(), centerPoint.getLat());
+ //设置飞向第一个点
+ while (takeoffToPointRes.getCode() == ResponseResult.CODE_SUCCESS) {
+ //获取无人机状态
+ DeviceModeCodeEnum deviceMode = deviceService.getDeviceMode(deviceSn);
- //当距离小于半径时,添加到目标集合中
- if (distance <= radius) {
- centerPoint.setDistance(distance);
- targetList.add(centerPoint);
+ //当无人机状态为手动飞行
+ if (deviceMode == DeviceModeCodeEnum.MANUAL) {
+ //飞向目标点
+ FlyToPointParam flyToPointParam = new FlyToPointParam();
+ flyToPointParam.setMaxSpeed(14);
+ List<PointDTO> pointDTOS = new ArrayList<>();
+
+ PointDTO pointDTO = new PointDTO();
+ pointDTO.setHeight(150.0);
+ pointDTO.setLongitude(targetList.get(0).getLon());
+ pointDTO.setLatitude(targetList.get(0).getLat());
+ pointDTOS.add(pointDTO);
+ flyToPointParam.setPoints(pointDTOS);
+
+
+ ResponseResult flyToRes = controlService.flyToPoint(sn, flyToPointParam);
+
+ if (flyToRes.getCode() == ResponseResult.CODE_SUCCESS) {
+ //第一个点指令飞行成功后,把数组存到redis中
+ /**
+ * {
+ * targetList:[],
+ * curIndex:
+ * }
+ */
+
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("targetList",targetList);
+ jsonObject.put("curIndex",0);
+
+
+ RedisOpsUtils.set("tuban:"+sn,jsonObject);
+ }
+ break;
}
- });
+ }
- //按距离从近到远排序
- targetList.sort(Comparator.comparing(PointPOJO::getDistance));
+ return ResponseResult.success();
+ }
- //后续为无人机操作逻辑
- //先飞到空中
+ public TakeoffToPointParam buildTakeoffToPointParam(PointPOJO dockPoint) {
TakeoffToPointParam takeoffToPointParam = new TakeoffToPointParam();
takeoffToPointParam.setTargetLatitude(dockPoint.getLat());
@@ -749,43 +776,12 @@
takeoffToPointParam.setMaxSpeed(10.0);
takeoffToPointParam.setExitWaylineWhenRcLost(WaylineRcLostActionEnum.EXECUTE_RC_LOST_ACTION);
- return ResponseResult.success();
-// //起飞
-// ResponseResult responseResult = controlService.takeoffToPoint(sn, takeoffToPointParam);
-//
-// if (responseResult.getCode() != ResponseResult.CODE_SUCCESS) {
-// return responseResult;
-// }
-// //向目标点飞行
-//
-// FlyToPointParam flyToPointParam = new FlyToPointParam();
-// flyToPointParam.setMaxSpeed(14);
-// List<PointDTO> pointDTOS = new ArrayList<>();
-// targetList.forEach(pointPOJO -> {
-// PointDTO pointDTO = new PointDTO();
-// pointDTO.setHeight(150.0);
-// pointDTO.setLongitude(pointPOJO.getLon());
-// pointDTO.setLatitude(pointPOJO.getLat());
-//
-// pointDTOS.add(pointDTO);
-// });
-// flyToPointParam.setPoints(pointDTOS);
-// ResponseResult responseResult1 = controlService.flyToPoint(sn, flyToPointParam);
-//
-// if (responseResult1.getCode() != ResponseResult.CODE_SUCCESS) {
-// return responseResult1;
-// }
-//
-// //返航
-// //return_home
-//
-//
-// return ResponseResult.success();
+ return takeoffToPointParam;
}
@Override
- public ResponseResult checkNextJob(WaylineJobDTO job) throws SQLException {
+ public ResponseResult checkNextJob(WaylineJobDTO job) throws SQLException {
WaylineJobEntity params = new WaylineJobEntity();
params.setJobId(job.getJobId());
@@ -809,7 +805,7 @@
long currentTime = System.currentTimeMillis();
for (int i = 0; i < executeStartTimeArr.size(); i++) {
- Long startTime = executeStartTimeArr.get(i).get(0)*1000;
+ Long startTime = executeStartTimeArr.get(i).get(0) * 1000;
//如果当前时间小于开始时间
if (currentTime < startTime) {
//当前索引就是下一次要执行的时间
@@ -903,13 +899,11 @@
}
-
-
@Override
- public WaylineJobCountDTO patrolStatistics(String workspaceId,String queryTime) {
+ public WaylineJobCountDTO patrolStatistics(String workspaceId, String queryTime) {
WaylineJobCountDTO waylineJobCountDTO = new WaylineJobCountDTO();
- List<WaylineJobEntity> list = mapper.patrolStatistics(workspaceId,queryTime);
- if (!CollectionUtils.isEmpty(list)){
+ List<WaylineJobEntity> list = mapper.patrolStatistics(workspaceId, queryTime);
+ if (!CollectionUtils.isEmpty(list)) {
waylineJobCountDTO.setTotalNumber(list.size());
long totalTime = list.stream().mapToLong(s -> s.getEndTime() - s.getBeginTime()).sum() / 1000;
StringBuffer buffer = new StringBuffer();
@@ -925,9 +919,9 @@
@Override
public void updateJobCollect(WaylineJobEntity waylineJob) {
new LambdaUpdateChainWrapper<>(mapper)
- .eq(WaylineJobEntity::getJobId,waylineJob.getJobId())
- .set(WaylineJobEntity::getCollectStatus,waylineJob.getCollectStatus())
- .set(WaylineJobEntity::getUserId,waylineJob.getUserId())
+ .eq(WaylineJobEntity::getJobId, waylineJob.getJobId())
+ .set(WaylineJobEntity::getCollectStatus, waylineJob.getCollectStatus())
+ .set(WaylineJobEntity::getUserId, waylineJob.getUserId())
.update();
}
diff --git "a/src/main/resources/jkj\0501\051.json" "b/src/main/resources/jkj\0501\051.json"
new file mode 100644
index 0000000..60a2cb6
--- /dev/null
+++ "b/src/main/resources/jkj\0501\051.json"
@@ -0,0 +1,151 @@
+{
+ "type": "FeatureCollection",
+ "crs": {
+ "type": "name",
+ "properties": {
+ "name": "EPSG:4326"
+ }
+ },
+ "features": [
+ {
+ "type": "Feature",
+ "id": 0,
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ 115.86646556494736,
+ 28.634450296554235
+ ],
+ [
+ 115.86425430209033,
+ 28.635738328540754
+ ],
+ [
+ 115.86455173471609,
+ 28.633120921432976
+ ],
+ [
+ 115.86697714906381,
+ 28.633843533997606
+ ],
+ [
+ 115.86646556494736,
+ 28.634450296554235
+ ]
+ ]
+ ]
+ },
+ "properties": {
+ "FID": 0,
+ "Id": 0
+ }
+ },
+ {
+ "type": "Feature",
+ "id": 1,
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ 115.86400669060504,
+ 28.620271391369386
+ ],
+ [
+ 115.86002109341996,
+ 28.616202513049245
+ ],
+ [
+ 115.86637425430604,
+ 28.614203765804177
+ ],
+ [
+ 115.86591204400565,
+ 28.617200102075913
+ ],
+ [
+ 115.86400669060504,
+ 28.620271391369386
+ ]
+ ]
+ ]
+ },
+ "properties": {
+ "FID": 1,
+ "Id": 0
+ }
+ },
+ {
+ "type": "Feature",
+ "id": 2,
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ 115.83936693345481,
+ 28.616199931733206
+ ],
+ [
+ 115.84128848946852,
+ 28.616084360149614
+ ],
+ [
+ 115.84093157031771,
+ 28.618154491224743
+ ],
+ [
+ 115.83814760094094,
+ 28.618654178035968
+ ],
+ [
+ 115.83936693345481,
+ 28.616199931733206
+ ]
+ ]
+ ]
+ },
+ "properties": {
+ "FID": 2,
+ "Id": 0
+ }
+ },
+ {
+ "type": "Feature",
+ "id": 3,
+ "geometry": {
+ "type": "Polygon",
+ "coordinates": [
+ [
+ [
+ 115.76493801956997,
+ 28.690367528093361
+ ],
+ [
+ 115.76654812497384,
+ 28.688124702651749
+ ],
+ [
+ 115.77111669010515,
+ 28.688505416412738
+ ],
+ [
+ 115.7695938350613,
+ 28.690980055858802
+ ],
+ [
+ 115.76493801956997,
+ 28.690367528093361
+ ]
+ ]
+ ]
+ },
+ "properties": {
+ "FID": 3,
+ "Id": 0
+ }
+ }
+ ]
+}
--
Gitblit v1.9.3