nishiwei
5 days ago 3f43e40ed1a1e9f66b3ad2862da9dbc4b710c712
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.ard.route.util;
 
import com.ard.route.domain.djuav.*;
import com.ard.route.domain.sixhe.ArdRouteActions;
import com.ard.route.domain.sixhe.ArdRouteChange;
import com.ard.route.domain.sixhe.ArdRoutePoints;
import com.ard.route.enums.kml.DroneEnumValueEnums;
import com.ard.route.enums.kml.PayloadTypeEnums;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
 
import static com.ard.route.enums.kml.DroneEnumValueEnums.M350_RTK;
import static com.ard.route.util.ToolUtils.getDoublePoint;
 
/**
 * 初始化数据
 * 测试数据
 */
public class InitializationUtils {
 
    // 禅思H20T 公倍数
    private static final Double CHANSI_H20T = 23.76237623;
 
    // 禅思H20T 焦距值
    private static final Double CHANSI_H20_FOCUS = 6.83;
 
    private static final String WAYPOINT_TURN_MODE_DEFAULT = "toPointAndStopWithDiscontinuityCurvature";
 
    /**
     * 初始化KMZ 默认数据
     */
    public UavRouteReq initialization(UavRouteReq uavRouteReq){
        uavRouteReq.setTemplateType("waypoint");
        // 起始点默认航线第一个点
        if (uavRouteReq.getTakeOffRefPoint() == null){
            uavRouteReq.setTakeOffRefPoint(
                    uavRouteReq.getRoutePointList().get(0).getLatitude() + "," +
                            uavRouteReq.getRoutePointList().get(0).getLongitude() + "," +
                            uavRouteReq.getRoutePointList().get(0).getHeight());
        }
        //uavRouteReq.setDroneType(89);
        // 机场1:M30/M30T 使用机身自带双光/三光相机,payloadEnumValue 分别为 52/53,
        // 不能沿用 H20T(43)。其余机型保持原有逻辑,机场2/3 的航线生成结果不变。
        if (Objects.equals(DroneEnumValueEnums.M30_M30T.getValue(), uavRouteReq.getDroneType())) {
            if (uavRouteReq.getSubDroneType() == null) {
                uavRouteReq.setSubDroneType(0);
            }
            uavRouteReq.setPayloadType(Objects.equals(1, uavRouteReq.getSubDroneType())
                    ? PayloadTypeEnums.M30T.getValue() : PayloadTypeEnums.M30.getValue());
        } else {
            uavRouteReq.setSubDroneType(0);
            uavRouteReq.setPayloadType(43);
        }
        uavRouteReq.setPayloadPosition(0);
        uavRouteReq.setImageFormat("wide");
        uavRouteReq.setFinishAction("goHome");
        uavRouteReq.setExitOnRcLostAction("goBack");
        //uavRouteReq.setGlobalHeight(100.0);
        //uavRouteReq.setAutoFlightSpeed(5.0);
        WaypointHeadingReq waypointHeadingReq = new WaypointHeadingReq();
        waypointHeadingReq.setWaypointHeadingMode("followWayline");
        uavRouteReq.setWaypointHeadingReq(waypointHeadingReq);
        WaypointTurnReq waypointTurnReq = new WaypointTurnReq();
        if (uavRouteReq.getGlobalWaypointTurnMode() != null){
            waypointTurnReq.setWaypointTurnMode(uavRouteReq.getGlobalWaypointTurnMode());
        }else {
            waypointTurnReq.setWaypointTurnMode(WAYPOINT_TURN_MODE_DEFAULT);
        }
        uavRouteReq.setWaypointTurnReq(waypointTurnReq);
        uavRouteReq.setGimbalPitchMode("usePointSetting");
        if (M350_RTK.getValue().equals(uavRouteReq.getDroneType())) {
            // 变焦数值加工
            buildZoom(uavRouteReq);
        }
        // 修改每个航点的高度
        buildHeight(uavRouteReq);
        // 动作组编号数据加工
        buildActionGroupReq(uavRouteReq);
        return uavRouteReq;
    }
 
    /**
     * 构建动作组编号
     */
    public void buildActionGroupReq(UavRouteReq uavRouteReq){
        int pointActionCounter = 0;
        for (RoutePointReq routePointReq : uavRouteReq.getRoutePointList()) {
            if (routePointReq.getActionGroupList() != null){
                for (ActionGroupReq actionGroupReq : routePointReq.getActionGroupList()) {
                    actionGroupReq.setActionGroupId(pointActionCounter++);
                    actionGroupReq.setActionGroupStartIndex(routePointReq.getRoutePointIndex());
                    actionGroupReq.setActionGroupEndIndex(routePointReq.getRoutePointIndex());
                    actionGroupReq.setActionTriggerType("reachPoint");
                }
 
            }
        }
    }
 
    /**
     * 修改每个航点的高度
     * 根据起飞点高度减去当前航点高度
     */
    public void buildHeight(UavRouteReq uavRouteReq){
        if (!"EGM96".equals(uavRouteReq.getHeightMode())){
            double takeOffHeight = getDoublePoint(uavRouteReq.getTakeOffRefPoint(),"alt");
            for (RoutePointReq routePointReq : uavRouteReq.getRoutePointList()) {
                routePointReq.setHeight(routePointReq.getHeight() - takeOffHeight);
            }
        }
    }
 
    /**
     * 变焦动作加工
     */
    private void buildZoom(UavRouteReq uavRouteReq){
        for (RoutePointReq routePointReq : uavRouteReq.getRoutePointList()) {
            if (!routePointReq.getActionGroupList().isEmpty()){
                for (ActionGroupReq actionGroupReq : routePointReq.getActionGroupList()) {
                    for (PointActionReq action : actionGroupReq.getActions()) {
                        if (action.getZoom() != null){
                            action.setZoom(multiple23(action.getZoom()));
                        }
                    }
                }
            }
        }
    }
 
    public static Double multiple23(Double zoom){
        return zoom * CHANSI_H20T;
    }
 
    public static Double divided23(Double zoom){
        return zoom / CHANSI_H20T;
    }
 
}