| | |
| | | return false; |
| | | } |
| | | |
| | | //跨楼层移动任务 |
| | | if (Utils.getLev(wrkMast.getSourceLocNo()) != Utils.getLev(wrkMast.getLocNo())) { |
| | | //获取目标站 |
| | | LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo()); |
| | | if (liftSta == null) { |
| | | return false;//找不到站点 |
| | | } |
| | | |
| | | //*************尝试解锁目标站路径*************** |
| | | List<NavigateNode> targetNodes = NyLiftUtils.getLiftStaNodes(liftSta.getStaNo()); |
| | | if (targetNodes == null) { |
| | | return false;//未获取到节点 |
| | | } |
| | | //尝试解锁目标站路径 |
| | | boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), targetNodes, false);//所使用的路径进行解锁 |
| | | if (!result) { |
| | | return false;//路径解锁失败 |
| | | } |
| | | //*************尝试解锁目标站路径*************** |
| | | } |
| | | |
| | | // //获取目标站对应的输送站点 |
| | | // BasDevp targetBasDevp = basDevpService.selectByLevAndLiftNo(Utils.getLev(wrkMast.getLocNo()), wrkMast.getLiftNo()); |
| | | // if (targetBasDevp == null) { |
| | | // return false;//缺少站点信息 |
| | | // } |
| | | // //跨楼层移动任务 |
| | | // if (Utils.getLev(wrkMast.getSourceLocNo()) != Utils.getLev(wrkMast.getLocNo())) { |
| | | // //获取目标站 |
| | | // LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo()); |
| | | // if (liftSta == null) { |
| | | // return false;//找不到站点 |
| | | // } |
| | | // |
| | | // //获取提升机数据 |
| | | // BasLift basLift = basLiftService.selectById(targetBasDevp.getLiftNo()); |
| | | // if (basLift == null) { |
| | | // return false;//没有提升机数据 |
| | | // //*************尝试解锁目标站路径*************** |
| | | // List<NavigateNode> targetNodes = NyLiftUtils.getLiftStaNodes(liftSta.getStaNo()); |
| | | // if (targetNodes == null) { |
| | | // return false;//未获取到节点 |
| | | // } |
| | | // //尝试解锁目标站路径 |
| | | // boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), targetNodes, false);//所使用的路径进行解锁 |
| | | // if (!result) { |
| | | // return false;//路径解锁失败 |
| | | // } |
| | | // //*************尝试解锁目标站路径*************** |
| | | // } |
| | | // if (basLift.getPoint() == null) { |
| | | // return false;//没有设置提升机点位坐标 |
| | | // } |
| | | // NavigateNode liftNode = new NavigateNode(basLift.getPoint$().getX(), basLift.getPoint$().getY()); |
| | | // liftNode.setZ(basLift.getPoint$().getZ()); |
| | | |
| | | //小车已经在目标库位,直接认定小车移动任务完成 |
| | | if (shuttleProtocol.getCurrentLocNo().equals(wrkMast.getLocNo())) { |
| | |
| | | return false; |
| | | } |
| | | |
| | | //获取小车到目标库位命令 |
| | | NyShuttleOperaResult result = NyShuttleOperaUtils.getStartToTargetCommands(shuttleThread.getSlave().getId(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id); |
| | | NyShuttleOperaResult result = null; |
| | | //跨楼层移动任务 |
| | | if (Utils.getLev(wrkMast.getSourceLocNo()) != Utils.getLev(wrkMast.getLocNo())) { |
| | | //需要将前两个节点作为白名单节点传入 |
| | | //获取目标站 |
| | | LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo()); |
| | | if (liftSta == null) { |
| | | return false;//找不到站点 |
| | | } |
| | | |
| | | List<NavigateNode> targetNodes = NyLiftUtils.getLiftStaNodes(liftSta.getStaNo()); |
| | | if (targetNodes == null) { |
| | | return false;//未获取到节点 |
| | | } |
| | | |
| | | //设置计算节点的白名单 |
| | | ArrayList<int[]> whiteList = new ArrayList<>();//设置计算节点的白名单 |
| | | for (NavigateNode node : targetNodes) { |
| | | whiteList.add(new int[]{node.getX(), node.getY()}); |
| | | } |
| | | result = NyShuttleOperaUtils.getStartToTargetCommandsByWhites(shuttleThread.getSlave().getId(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id, whiteList); |
| | | }else { |
| | | //获取小车到目标库位命令 |
| | | result = NyShuttleOperaUtils.getStartToTargetCommands(shuttleThread.getSlave().getId(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id); |
| | | } |
| | | |
| | | if (result == null) { |
| | | return false;//路径计算失败 |
| | | } |
| | |
| | | return null; |
| | | } |
| | | |
| | | //获取JSON格式数据 |
| | | public List<List<MapNode>> getJsonData(Integer lev, Integer mapType, List<int[]> whitePoints, List<int[]> shuttlePoints) { |
| | | try { |
| | | String mapFilename = "map_" + lev + ".json"; |
| | | |
| | | String fileName = this.getClass().getClassLoader().getResource(mapFilename).getPath();//获取文件路径 |
| | | File file = new File(fileName); |
| | | StringBuffer stringBuffer = new StringBuffer(); |
| | | if (file.isFile() && file.exists()) { |
| | | InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "GBK"); |
| | | BufferedReader br = new BufferedReader(isr); |
| | | String lineTxt = null; |
| | | while ((lineTxt = br.readLine()) != null) { |
| | | stringBuffer.append(lineTxt); |
| | | } |
| | | br.close(); |
| | | |
| | | //解析json地图数据 |
| | | ArrayList arrayList = JSON.parseObject(stringBuffer.toString(), ArrayList.class); |
| | | List<List<MapNode>> lists = filterMap(mapType, arrayList, lev, whitePoints, shuttlePoints);//过滤地图数据 |
| | | |
| | | return lists; |
| | | } else { |
| | | System.out.println("文件不存在!"); |
| | | } |
| | | } catch (IOException ioException) { |
| | | ioException.printStackTrace(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 过滤地图数据 |
| | | * mapType -1=>无过滤,1=》过滤库位状态DFX,2=》过滤库位状态X |
| | |
| | | } |
| | | } |
| | | |
| | | //加载白名单节点 |
| | | List<List<MapNode>> realMap = getJsonData(lev, -1, null, null);//获取完整地图 |
| | | for (int[] points : whitePoints) { |
| | | //获取原始节点数据 |
| | | int x = points[0]; |
| | | int y = points[1]; |
| | | List<MapNode> rows = realMap.get(x); |
| | | MapNode col = rows.get(y); |
| | | |
| | | List<MapNode> list = lists.get(x); |
| | | MapNode mapNode = list.get(y); |
| | | mapNode.setValue(col.getValue());//恢复原始节点 |
| | | |
| | | //更新list |
| | | list.set(y, mapNode); |
| | | lists.set(x, list); |
| | | } |
| | | |
| | | |
| | | return lists; |
| | | } |
| | | |
| | |
| | | */ |
| | | public class NavigateUtils { |
| | | |
| | | public static List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints) { |
| | | public static List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints, List<int[]> whites) { |
| | | //通过开始编号和结束编号获取对应的xy轴坐标 |
| | | int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//开始节点 |
| | | int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//结束节点 |
| | | |
| | | ArrayList<int[]> whiteList = new ArrayList<>();//设置计算节点的白名单 |
| | | whiteList.add(startArr);//将开始节点设置为白名单,以防被过滤 |
| | | if (whites != null && !whites.isEmpty()) { |
| | | whiteList.addAll(whites);//批量添加白名单节点 |
| | | } |
| | | |
| | | //获取当前节点计算的层高,并赋值到每一个节点中 |
| | | int lev = Utils.getLev(startPoint); |
| | |
| | | |
| | | public static void main(String[] args) { |
| | | //计算路径 |
| | | List<NavigateNode> calc = calc("1000901", "1800201", NavigationMapType.NONE.id, null); |
| | | List<NavigateNode> calc = calc("1000901", "1800201", NavigationMapType.NONE.id, null, null); |
| | | System.out.println(calc); |
| | | System.out.println("------------------------"); |
| | | // List<NavigateNode> calc = calc("0501401", "0201801", "out"); |
| | |
| | | public static NyShuttleOperaResult getStartToTargetCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String targetPoint, Integer mapType) { |
| | | NavigateMapUtils navigateMapUtils = SpringUtils.getBean(NavigateMapUtils.class); |
| | | //计算起点到目标点行走节点 |
| | | List<NavigateNode> calc = NavigateUtils.calc(startPoint, targetPoint, mapType, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startPoint))); |
| | | List<NavigateNode> calc = NavigateUtils.calc(startPoint, targetPoint, mapType, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startPoint)), null); |
| | | if (calc == null) { |
| | | return null; |
| | | } |
| | | |
| | | //命令集合 |
| | | ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>(); |
| | | List<NavigateNode> allNode = new ArrayList<>(); |
| | | |
| | | //获取分段路径 |
| | | ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc); |
| | | //将每一段路径分成command指令 |
| | | for (ArrayList<NavigateNode> nodes : data) { |
| | | //开始路径 |
| | | NavigateNode startPath = nodes.get(0); |
| | | //目标路径 |
| | | NavigateNode targetPath = nodes.get(nodes.size() - 1); |
| | | //获取移动命令 |
| | | NyShuttleHttpCommand moveCommand = NyHttpUtils.getMoveCommand(shuttleNo, wrkNo, startPath, targetPath); |
| | | moveCommand.setNodes(nodes);//将行走节点添加到每一步命令中 |
| | | commands.add(moveCommand); |
| | | |
| | | allNode.addAll(nodes); |
| | | } |
| | | |
| | | navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(startPoint), allNode, true);//锁定路径 |
| | | return result(commands, calc); |
| | | } |
| | | |
| | | /** |
| | | * 获取起点到目标点行走命令(可传白名单) |
| | | */ |
| | | public static NyShuttleOperaResult getStartToTargetCommandsByWhites(Integer shuttleNo, Integer wrkNo, String startPoint, String targetPoint, Integer mapType, List<int[]> whites) { |
| | | NavigateMapUtils navigateMapUtils = SpringUtils.getBean(NavigateMapUtils.class); |
| | | //计算起点到目标点行走节点 |
| | | List<NavigateNode> calc = NavigateUtils.calc(startPoint, targetPoint, mapType, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startPoint)), whites); |
| | | if (calc == null) { |
| | | return null; |
| | | } |
| | |
| | | //当前穿梭车库位号 |
| | | String currentLocNo = shuttleThread.getShuttleProtocol().getCurrentLocNo(); |
| | | //当前穿梭车线程到目标地点距离 |
| | | List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, locNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), Utils.getLev(currentLocNo)));//搜索空闲穿梭车,使用正常通道地图 |
| | | List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, locNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), Utils.getLev(currentLocNo)), null);//搜索空闲穿梭车,使用正常通道地图 |
| | | if (currentShuttlePath == null) { |
| | | continue; |
| | | } |
| | |
| | | String locNo = liftStaProtocol.getLocNo();//站点库位号 |
| | | |
| | | //当前穿梭车线程到目标地点距离 |
| | | List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, locNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleNo, Utils.getLev(currentLocNo)));//使用正常通道地图 |
| | | List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, locNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleNo, Utils.getLev(currentLocNo)), null);//使用正常通道地图 |
| | | if (currentShuttlePath == null) { |
| | | continue; |
| | | } |