| | |
| | | @Autowired |
| | | private SegmentService segmentService; |
| | | @Autowired |
| | | private TrafficService trafficService; |
| | | private LaneService laneService; |
| | | @Autowired |
| | | private AgvModelService agvModelService; |
| | | @Autowired |
| | |
| | | |
| | | AgvModel agvModel = agvModelService.getByAgvId(agvId); |
| | | Double workDirection = agvModel.getWorkDirection(); |
| | | final double oppWorkDir = (workDirection + 180) % 360; |
| | | boolean backupAction = null != agvModel.getBackupAction() && agvModel.getBackupActionBool(); |
| | | boolean needUndocking = null != agvModel.getNeedUndocking() && agvModel.getNeedUndockingBool(); |
| | | AgvSpeedType agvSpeedType = AgvSpeedType.query(agvModel.getTravelSpeed()); |
| | |
| | | String next = pathListPart.get(i); |
| | | |
| | | Code nextCode = codeService.getCacheByData(next); |
| | | // 车头æåçä¸ä¸ä¸ªè¡èµ°æ¹å |
| | | Double nextDirection = mapService.calculateDirection(lastCode, nextCode, angleOffsetVal); |
| | | |
| | | // ç¬¬ä¸æ¥ï¼å¦æä¸ä¸ä¸ªæ¹åæ£å¥½æ¯ä½ä¸æ¹åçç¸åæ¹åï¼åéç½®ä¸ä¸ä¸ªæ¹å为ä½ä¸æ¹åï¼æ è®° reverse = true |
| | | // ååè§ |
| | | final double oppLastDir = (lastDirection + 180) % 360; |
| | | // æ¯å¦åéè¡èµ° |
| | | boolean reverse = false; |
| | | if (nextDirection.equals((workDirection + 180) % 360)) { |
| | | nextDirection = workDirection; |
| | | reverse = true; |
| | | } |
| | | |
| | | // ç¬¬äºæ¥ï¼å¤æå½åèç¹æ¯å¦å¯ä»¥æè½¬ |
| | | if (!lastCode.getCornerBool()) { |
| | | // 妿æ¯ä½ä¸æ¹åï¼ä½æ¯å°è½¦å¨å··éå
æ¹åé误ï¼å忢 |
| | | if (reverse && !lastDirection.equals(nextDirection)) { |
| | | throw new CoolException(agvNo + "å·å°è½¦æ¹åé误ï¼è¯·æ¨è³è½¬å¼¯ç¹æå¨è°æ´"); |
| | | // å··éé»è¾ |
| | | if (!laneBuilder.isInitialized()) { |
| | | throw new CoolException("lanes are not initialized"); |
| | | } |
| | | LaneDto lastLaneDto = laneBuilder.search(lastCode.getData()); |
| | | LaneDto nextLaneDto = laneBuilder.search(nextCode.getData()); |
| | | // è¿å
¥å··éè§åº¦ |
| | | Double lastLaneDir = laneService.getLaneDirection(lastLaneDto); |
| | | Double nextLaneDir = laneService.getLaneDirection(nextLaneDto); |
| | | |
| | | // å··é强å¶è½¬å¼¯ï¼ä¼å
级 > workDirection |
| | | if (null != nextLaneDir) { |
| | | nextDirection = nextLaneDir; |
| | | |
| | | if (!lastDirection.equals(nextDirection)) { |
| | | if (!lastCode.getCornerBool()) { |
| | | throw new CoolException(agvNo + "å·å°è½¦è¿å
¥å··ééè°æ´æ¹å为 " + nextDirection + "°ï¼è¯·æ¨è³è½¬å¼¯ç¹æå¨è°æ´"); |
| | | } |
| | | // turn |
| | | actionList.add(new Action( |
| | | null, // ç¼å·s |
| | | task.getBusId(), // æ»çº¿ |
| | | task.getId(), // ä»»å¡ |
| | | null, // å¨ä½å· |
| | | null, // ä¼å
级 |
| | | ActionTypeType.TurnCorner.desc, // åç§° |
| | | (double) mapService.spinDirection(lastCode).val, // 屿§å¼ |
| | | lastCode.getData(), // å°é¢ç |
| | | String.valueOf(nextDirection), // å¨ä½åæ° |
| | | ActionTypeType.TurnCorner.val(), // å¨ä½ç±»å |
| | | actionPrepareSts, // å¨ä½è¿åº¦ |
| | | agvId, // AGV |
| | | now // 工使¶é´ |
| | | )); |
| | | lastDirection = nextDirection; |
| | | } |
| | | // 妿䏿¯ä½ä¸æ¹åï¼å¤ææ¯å¦ç¸åæ¹åï¼å¦æåæ¹åååéè¡èµ° |
| | | if (nextDirection.equals((lastDirection + 180) % 360)) { |
| | | nextDirection = lastDirection; |
| | | reverse = true; |
| | | } else if (null != lastLaneDir) { |
| | | nextDirection = lastLaneDir; |
| | | |
| | | if (!lastDirection.equals(nextDirection)) { |
| | | if (!lastCode.getCornerBool()) { |
| | | throw new CoolException(agvNo + "å·å°è½¦ç¦»å¼å··ééè°æ´æ¹å为 " + nextDirection + "°ï¼è¯·æ¨è³è½¬å¼¯ç¹æå¨è°æ´"); |
| | | } |
| | | } |
| | | } else { |
| | | if (!lastDirection.equals(nextDirection)) { |
| | | // 妿ä¸ä¸ªèç¹æ¹åä¸å½åagvæ¹åç¸åï¼ååéè¡èµ°ï¼ä½æ¯å¦æå½åagvæ¹åæ£å¥½ä¸å·¥ä½æ¹åç¸åï¼åæè½¬è³å·¥ä½æ¹å |
| | | if (nextDirection.equals((lastDirection + 180) % 360) && !workDirection.equals((lastDirection + 180) % 360)) { |
| | | |
| | | // 妿ä¸ä¸ä¸ªæ¹åæ£å¥½æ¯ä½ä¸æ¹åçç¸åæ¹åï¼åéç½®ä¸ä¸ä¸ªæ¹å为ä½ä¸æ¹åï¼æ è®° reverse = true |
| | | if (nextDirection.equals(oppWorkDir)) { |
| | | nextDirection = workDirection; |
| | | reverse = true; |
| | | } |
| | | |
| | | // 夿å½åèç¹æ¯å¦å¯ä»¥æè½¬ |
| | | if (!lastCode.getCornerBool()) { |
| | | // 妿æ¯ä½ä¸æ¹åï¼ä½æ¯å°è½¦å¨å··éå
æ¹åé误ï¼å忢 |
| | | if (reverse && !lastDirection.equals(nextDirection)) { |
| | | throw new CoolException(agvNo + "å·å°è½¦æ¹åé误ï¼è¯·æ¨è³è½¬å¼¯ç¹æå¨è°æ´"); |
| | | } |
| | | // 妿䏿¯ä½ä¸æ¹åï¼å¦ä¸ç»ç¸åæ¹åï¼ï¼å¤ææ¯å¦ç¸åæ¹åï¼å¦æåæ¹åååéè¡èµ° |
| | | if (nextDirection.equals(oppLastDir)) { |
| | | // åéæ¶ï¼å 为agvæ¹å没åï¼æä»¥ä¸ä¸ä¸ªæ¹åè¿æ¯agvæ¹åï¼æ
nextDirection = lastDirection; |
| | | nextDirection = lastDirection; |
| | | reverse = true; |
| | | } else { |
| | | // turn |
| | | actionList.add(new Action( |
| | | null, // ç¼å·s |
| | | task.getBusId(), // æ»çº¿ |
| | | task.getId(), // ä»»å¡ |
| | | null, // å¨ä½å· |
| | | null, // ä¼å
级 |
| | | ActionTypeType.TurnCorner.desc, // åç§° |
| | | (double) mapService.spinDirection(lastCode).val, // 屿§å¼ |
| | | lastCode.getData(), // å°é¢ç |
| | | String.valueOf(nextDirection), // å¨ä½åæ° |
| | | ActionTypeType.TurnCorner.val(), // å¨ä½ç±»å |
| | | actionPrepareSts, // å¨ä½è¿åº¦ |
| | | agvId, // AGV |
| | | now // 工使¶é´ |
| | | )); |
| | | } |
| | | // æ»ç»ï¼1.妿æ¯ä½ä¸ç»ï¼å·®180Â°ï¼æ¹åï¼é£ä¹agvæ¹åå¿
é¡»æ¯ä½ä¸æ¹åï¼å¦æ reverse å说æåéï¼è¿æ¶ånextDirectionè¯å®ä¼çäºä½ä¸æ¹åï¼åé¢èµå¼äºï¼ï¼å¦æä¸ç¸åï¼åæ¥é |
| | | // 2.妿䏿¯ä½ä¸ç»æ¹åï¼å¦ä¸ç»ç¸åæ¹åå·®180°ï¼ï¼å 为æ¤å½æ°ä¸è½æè½¬ï¼æä»¥å·®180°æ¶åªè½åéï¼åéçæ¶åå 为agvä¸ä¼æè½¬ï¼æä»¥nextDirectionè¦åæagvæ¹å |
| | | } else { |
| | | if (!lastDirection.equals(nextDirection)) { |
| | | // 妿ä¸ä¸ä¸ªæ¹åä¸agvæ¹åç¸åï¼ååéè¡èµ°ï¼é¿å
è¿è¡æ¯«æ æä¹ç转弯å¨ä½ã |
| | | // 使¯è¦æ³¨æï¼å¦æagvæ¹åä¸å·¥ä½æ¹åæ£å¥½ç¸åï¼åéè¦æè½¬è³å·¥ä½æ¹åï¼ä¹å°±æ¯ä¸ºä»ä¹è¦å !workDirection.equals(oppLastDir)夿 |
| | | if (nextDirection.equals(oppLastDir) && !workDirection.equals(oppLastDir)) { |
| | | // åéæ¶ï¼å 为agvæ¹å没åï¼æä»¥ä¸ä¸ä¸ªæ¹åè¿æ¯agvæ¹åï¼æ
nextDirection = lastDirection; |
| | | nextDirection = lastDirection; |
| | | reverse = true; |
| | | } else { |
| | | // turn |
| | | actionList.add(new Action( |
| | | null, // ç¼å·s |
| | | task.getBusId(), // æ»çº¿ |
| | | task.getId(), // ä»»å¡ |
| | | null, // å¨ä½å· |
| | | null, // ä¼å
级 |
| | | ActionTypeType.TurnCorner.desc, // åç§° |
| | | (double) mapService.spinDirection(lastCode).val, // 屿§å¼ |
| | | lastCode.getData(), // å°é¢ç |
| | | String.valueOf(nextDirection), // å¨ä½åæ° |
| | | ActionTypeType.TurnCorner.val(), // å¨ä½ç±»å |
| | | actionPrepareSts, // å¨ä½è¿åº¦ |
| | | agvId, // AGV |
| | | now // 工使¶é´ |
| | | )); |
| | | |
| | | lastDirection = nextDirection; |
| | | lastDirection = nextDirection; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | // run |
| | | ActionTypeType actionType = ActionTypeType.StraightAheadTurnable; |
| | | if (reverse) { |
| | | actionType = ActionTypeType.StraightBackTurnable; |
| | | } |
| | | ActionTypeType actionType = reverse ? ActionTypeType.StraightBackTurnable : ActionTypeType.StraightAheadTurnable; |
| | | CodeGap gap = codeGapService.findByCodeOfBoth(lastCode.getId(), nextCode.getId()); |
| | | actionList.add(new Action( |
| | | null, // ç¼å· |