From 67108657901ce4925a27f88e4181c70f9a050c2b Mon Sep 17 00:00:00 2001
From: aix <vip_xiaobin810@163.com>
Date: Tue, 30 Jul 2024 11:58:52 +0800
Subject: [PATCH] 面状航线

---
 src/main/java/com/dji/sample/patches/xml/mode/XMLTemplateModel.java |  104 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 103 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/dji/sample/patches/xml/mode/XMLTemplateModel.java b/src/main/java/com/dji/sample/patches/xml/mode/XMLTemplateModel.java
index 9ef5203..e7993b1 100644
--- a/src/main/java/com/dji/sample/patches/xml/mode/XMLTemplateModel.java
+++ b/src/main/java/com/dji/sample/patches/xml/mode/XMLTemplateModel.java
@@ -1,6 +1,7 @@
 package com.dji.sample.patches.xml.mode;
 
 import com.dji.sample.patches.model.entity.LotInfo;
+import com.dji.sample.patches.utils.DistanceCalculator;
 import com.dji.sample.patches.utils.GeoToolsUtil;
 import com.dji.sample.patches.utils.PointPO;
 import com.dji.sample.patches.xml.mode.share.*;
@@ -165,18 +166,118 @@
         //航点
         List<Coordinate> pointList = PlaneCourseUtils.createWaylinePoints(param);
         List<Placemark> placemarkList = new ArrayList<>();
+        //计算距离
+        Coordinate droneC = param.getCoordinate();//机场经纬度
+        int pointListIndex = 0;
+        double distanceOne = 0.0; //第一个点到机场得距离
+        double distance = 0.0;
+        Coordinate pointTmp = null;
         for (Coordinate c:pointList)  {
+            //计算距离
+            if (pointListIndex == 0) {
+                distanceOne = DistanceCalculator.calculateDistance(droneC.y,droneC.x,c.y,c.x) * 1000;
+                distance += distanceOne;
+                pointTmp = c;
+            } else {
+                double distanceTmp = DistanceCalculator.calculateDistance(pointTmp.y,pointTmp.x,c.y,c.x) * 1000;
+                distance += distanceTmp;
+                pointTmp = c;
+            }
+            pointListIndex += 1;
+
             Placemark placemark = new Placemark();
             placemark.setCoordinates(c.x + "," + c.y);
             placemark.setEllipsoidHeight(param.getHeight());
             placemark.setHeight(param.getHeight());
+            placemark.setExecuteHeight(param.getHeight() + param.getDroneHeight()); //执行高度 = 机场高度 + 飞行高度
 
             placemark.setWaypointSpeed(param.getAutoFlightSpeed() + "");
             placemark.setUseStraightLine(1);
-            //事件暂时不考虑添加
+
+            //
+            WaypointTurnParam waypointTurnParam = new WaypointTurnParam();
+            waypointTurnParam.setWaypointTurnMode("coordinateTurn");
+            waypointTurnParam.setWaypointTurnDampingDist("0.2");
+            //添加事件  第一个和结尾需要添加事件
+            if (pointListIndex == 1) { //第一个航点事件
+
+                waypointTurnParam.setWaypointTurnMode("toPointAndStopWithDiscontinuityCurvature");
+                waypointTurnParam.setWaypointTurnDampingDist("0");
+
+                // 增加事件组
+                ActionGroup actionGroup = new ActionGroup();
+                actionGroup.setActionGroupId(0);
+                actionGroup.setActionGroupStartIndex(pointListIndex - 1);//动作组开始生效的航点
+                actionGroup.setActionGroupEndIndex(pointList.size() - 1);//动作组结束生效的航点
+                actionGroup.setActionGroupMode("sequence");
+                ActionTrigger at = new ActionTrigger();
+                at.setActionTriggerType("betweenAdjacentPoints");
+                actionGroup.setActionTrigger(at);
+                // 开始增加事件
+                List<ActionMode> list = new ArrayList<>();
+                ActionMode actionMode = new ActionMode();
+
+                actionMode.setActionId(0);
+                actionMode.setActionActuatorFunc("gimbalAngleLock");
+
+                ActionMode actionMode2 = new ActionMode();
+                actionMode2.setActionId(1);
+                actionMode2.setActionActuatorFunc(CameraActionEnum.GIMBAL_ROTATE.getDescription());//旋转云台
+                actionMode2.setActionActuatorFuncParam(ActionUtils.setGimbalRotateByPlane());
+
+                ActionMode actionMode3 = new ActionMode();
+                actionMode3.setActionId(2);
+                actionMode3.setActionActuatorFunc("startTimeLapse");
+                actionMode3.setActionActuatorFuncParam(ActionUtils.setStartTimeLapseByPlane());
+
+                list.add(actionMode);
+                list.add(actionMode2);
+                list.add(actionMode3);
+                actionGroup.setActions(list);
+
+                placemark.setActionGroup(actionGroup);
+
+            } else if(pointListIndex == pointList.size()) { // 结尾需要添加事件
+
+                waypointTurnParam.setWaypointTurnMode("toPointAndStopWithDiscontinuityCurvature");
+                waypointTurnParam.setWaypointTurnDampingDist("0");
+
+                // 增加事件组
+                ActionGroup actionGroup = new ActionGroup();
+                actionGroup.setActionGroupId(1);
+                actionGroup.setActionGroupStartIndex(pointListIndex - 1);//动作组开始生效的航点
+                actionGroup.setActionGroupEndIndex(pointList.size()-1);//动作组结束生效的航点
+                actionGroup.setActionGroupMode("sequence");
+                ActionTrigger at = new ActionTrigger();
+                at.setActionTriggerType("reachPoint");
+                actionGroup.setActionTrigger(at);
+                // 开始增加事件
+                List<ActionMode> list = new ArrayList<>();
+
+                ActionMode actionMode = new ActionMode();
+                actionMode.setActionId(0);
+                actionMode.setActionActuatorFunc("stopTimeLapse");
+                actionMode.setActionActuatorFuncParam(ActionUtils.setStopTimeLapseByPlane());
+
+                ActionMode actionMode2 = new ActionMode();
+                actionMode2.setActionId(1);
+                actionMode2.setActionActuatorFunc("gimbalAngleUnlock");
+
+                list.add(actionMode);
+                list.add(actionMode2);
+                actionGroup.setActions(list);
+
+                placemark.setActionGroup(actionGroup);
+            }
+
+            placemark.setWaypointTurnParam(waypointTurnParam);
 
             placemarkList.add(placemark);
         }
+
+        //距离和时间
+        folder.setDistance((distance - distanceOne) + "");
+        folder.setDuration((distance / param.getAutoFlightSpeed()) + "");//时间 = 长度 / 速度
 
         folder.setPlacemarkList(placemarkList);
 
@@ -205,6 +306,7 @@
         param.setSideRatio(0.8);
         param.setFocal(10*6.9999943);
         param.setFrame(100);
+        param.setDroneHeight(14.731968792284789);
         List<double[]> polygon = new ArrayList<>();
         double[] a = {116.028037250229,25.8948290570725};
         double[] a2 = {116.031565260299,25.8950672687002};

--
Gitblit v1.9.3