| | |
| | | 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.*; |
| | |
| | | */ |
| | | 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())); |
| | |
| | | //航点 |
| | | 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); |
| | | |
| | |
| | | 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}; |
| | |
| | | payloadInfo.setPayloadPositionIndex("0"); |
| | | payloadInfo.setPayloadSubEnumValue("0"); |
| | | param.setPayloadInfo(payloadInfo); |
| | | param.setExecuteHeightMode("relativeToStartPoint"); |
| | | |
| | | // 初始化模板对象 |
| | | XMLTemplateModel xmlModel = XMLTemplateModel.initPolygon(param); |
| | | |
| | | //生成航线文件 |
| | | CreateWaylineFileUtils.createWaylineFileByPolygon(xmlModel, "src\\main\\resources\\template\\template-polygon.xml", "src\\main\\resources\\template\\wpmz2\\template.xml"); |
| | | CreateWaylineFileUtils.createWaylineFileByPolygon(xmlModel, "src\\main\\resources\\template\\waylines-polygon.xml", "src\\main\\resources\\template\\wpmz2\\waylines.xml"); |
| | | CreateWaylineFileUtils.createWaylineFileByPolygon(xmlModel, "src\\main\\resources\\template\\template-polygon.xml", "src\\main\\resources\\template\\wpmz\\template.kml"); |
| | | CreateWaylineFileUtils.createWaylineFileByPolygon(xmlModel, "src\\main\\resources\\template\\waylines-polygon.xml", "src\\main\\resources\\template\\wpmz\\waylines.wpml"); |
| | | } |
| | | |
| | | //新建点航线测试 |
| | |
| | | // XMLTemplateModel xmlModel = XMLTemplateModel.init(coordinates, list); |
| | | // |
| | | // //生成航线文件 |
| | | // CreateWaylineFileUtils.createWaylineFile(xmlModel, "src\\main\\resources\\template\\template.xml", "src\\main\\resources\\template\\wpmz\\template.xml", "src\\main\\resources\\template\\waylines.xml", "src\\main\\resources\\template\\wpmz\\waylines.xml"); |
| | | // CreateWaylineFileUtils.createWaylineFile(xmlModel, "src\\main\\resources\\template\\template.kml", "src\\main\\resources\\template\\wpmz\\template.kml", "src\\main\\resources\\template\\waylines.wpml", "src\\main\\resources\\template\\wpmz\\waylines.wpml"); |
| | | // |
| | | // |
| | | // } |