luxiaotao1123
15 小时以前 fd5b2fe041fe583307352d3120f422401e05745b
Merge branch 'ctu_stable' of github.com:luxiaotao1123/rcs-flow into ctu_stable
5个文件已修改
169 ■■■■ 已修改文件
version/doc/RCS开发进度表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java 135 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/LaneService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/CodeGapServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/LaneServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/doc/RCS¿ª·¢½ø¶È±í.xlsx
Binary files differ
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -90,7 +90,7 @@
    @Autowired
    private SegmentService segmentService;
    @Autowired
    private TrafficService trafficService;
    private LaneService laneService;
    @Autowired
    private AgvModelService agvModelService;
    @Autowired
@@ -907,6 +907,7 @@
            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());
@@ -944,51 +945,108 @@
                        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;
                                    }
                                }
                            }
                        }
@@ -1016,10 +1074,7 @@
                        }
                        // 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,    // ç¼–号
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/LaneService.java
@@ -10,4 +10,6 @@
    List<Lane> batchSaveByLaneDtoList(Long zonedId, List<LaneDto> laneDtoList);
    Double getLaneDirection(LaneDto laneDto);
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/CodeGapServiceImpl.java
@@ -75,12 +75,18 @@
        }
        if (null == codeGap) {
            codeGap = getOne(new LambdaQueryWrapper<CodeGap>().eq(CodeGap::getCode0, code0).eq(CodeGap::getCode1, code1));
            codeGap = this.getOne(new LambdaQueryWrapper<CodeGap>()
                    .eq(CodeGap::getCode0, code0).eq(CodeGap::getCode1, code1).last("limit 1"));
            if (codeGap == null) {
                codeGap = getOne(new LambdaQueryWrapper<CodeGap>().eq(CodeGap::getCode1, code0).eq(CodeGap::getCode0, code1));
                codeGap = this.getOne(new LambdaQueryWrapper<CodeGap>()
                        .eq(CodeGap::getCode1, code0).eq(CodeGap::getCode0, code1).last("limit 1"));
            }
        }
        if (null == codeGap) {
//            throw new CoolException("failed to find code of both " + code0 + " and " + code1);
        }
        return codeGap;
    }
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/LaneServiceImpl.java
@@ -6,6 +6,7 @@
import com.zy.acs.framework.common.SnowflakeIdWorker;
import com.zy.acs.framework.exception.CoolException;
import com.zy.acs.manager.core.domain.LaneDto;
import com.zy.acs.manager.core.service.MapService;
import com.zy.acs.manager.manager.entity.Lane;
import com.zy.acs.manager.manager.enums.StatusType;
import com.zy.acs.manager.manager.mapper.LaneMapper;
@@ -55,4 +56,25 @@
        return lanes;
    }
    @Override
    public Double getLaneDirection(LaneDto laneDto) {
        if (null == laneDto) {
            return null;
        }
        Lane lane = this.getById(laneDto.getLaneId());
        if (null == lane) {
            return null;
        }
        Integer entryAngle = lane.getEntryAngle();
        if (null == entryAngle) {
            return null;
        }
        if (entryAngle < 0) {
            return null;
        }
        double entryAngleDouble = entryAngle.doubleValue();
        return MapService.mapToNearest(entryAngleDouble);
//        return entryAngleDouble;
    }
}