aix
2024-07-30 4b5a7a0ba44c675db1fff37f9552699d4d0942e9
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.*;
@@ -129,7 +130,7 @@
     */
    public static XMLTemplateModel initPolygon(CreateWaylineParam param) {
        Folder folder = FolderUtils.setFloder(param.getTemplateType(), param.getAutoFlightSpeed());
        Folder folder = FolderUtils.setFloder(param.getTemplateType(), param.getAutoFlightSpeed(),param.getExecuteHeightMode());
        //坐标系参数
        WaylineCoordinateSysParam wcs = new WaylineCoordinateSysParam("EGM96", String.valueOf(param.getHeight()), String.valueOf(param.getHeight()));
@@ -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()); //执行高度 = 机场高度 + 飞行高度 *修改为前端直接传
            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};