#
luxiaotao1123
2024-11-01 ddb8ec316edb1400228eb4dbb4423b5659d110bf
#
5个文件已修改
92 ■■■■■ 已修改文件
zy-acs-manager/src/main/java/com/zy/acs/manager/common/utils/MapDataUtils.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/LaneService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/AStarNavigateService.java 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/common/utils/MapDataUtils.java
@@ -1,13 +1,12 @@
package com.zy.acs.manager.common.utils;
import com.alibaba.fastjson.JSON;
import com.zy.acs.manager.core.service.astart.WaveNodeType;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.core.service.astart.WaveNodeType;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
 * Created by vincent on 8/7/2024
@@ -36,13 +35,6 @@
        }
        list.removeIf(next -> next.equals(vehicle));
        return list;
    }
    public static List<String> hasIntersection(List<String> l0, List<String> l1) {
        if (Cools.isEmpty(l0, l1)) {
            return new ArrayList<>();
        }
        return l0.stream().filter(l1::contains).collect(Collectors.toList());
    }
    public static String generateWaveNode(String originStr, String waveNode) {
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/LaneService.java
@@ -68,7 +68,7 @@
        this.mergeDeadEndLane();
        this.deadInteractionPoint();
        this.deleteInteractionPoint();
        this.filterLanesWithFewPoints();
@@ -262,7 +262,7 @@
        }
    }
    private void deadInteractionPoint() {
    private void deleteInteractionPoint() {
        for (Lane lane : this.lanes) {
            lane.removeInteraction(this.adjacencyCodeMap);
        }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
@@ -41,14 +41,14 @@
    private ActionService actionService;
    public List<String> checkoutPath(String agvNo, Code startCode, Code endCode, Boolean lock) {
        return this.checkoutPath(agvNo, startCode, endCode, lock, null, null);
        return this.checkoutPath(agvNo, startCode, endCode, lock, null);
    }
    /**
     * 寻址 ===>> A Star
     */
    public synchronized List<String> checkoutPath(String agvNo, Code startCode, Code endCode
            , Boolean lock, List<String> whiteList, List<String> blackList) {
            , Boolean lock, List<String> blackList) {
        int[] startMapIdx = mapDataDispatcher.getCodeMatrixIdx(null, startCode.getData());
        int[] endMapIdx = mapDataDispatcher.getCodeMatrixIdx(null, endCode.getData());
@@ -56,7 +56,7 @@
        NavigateNode startNode = new NavigateNode(startMapIdx[0], startMapIdx[1], startCode.getData());
        NavigateNode endNode = new NavigateNode(endMapIdx[0], endMapIdx[1], endCode.getData());
        NavigateNode finishNode = aStarNavigateService.execute(agvNo, startNode, endNode, lock, whiteList, blackList);
        NavigateNode finishNode = aStarNavigateService.execute(agvNo, startNode, endNode, lock, blackList);
        if (null == finishNode) {
            log.warn("{} 号AGV检索[{}] ===>> [{}]路径失败......", agvNo, startCode.getData(), endCode.getData());
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java
@@ -89,7 +89,7 @@
                    List<String> otherWaveList = MapDataUtils.hasOtherWave(waveNodeList, agvNo);
                    if (!Cools.isEmpty(otherWaveList)) {
                        if (!Cools.isEmpty(blackList) && !Cools.isEmpty(MapDataUtils.hasIntersection(otherWaveList, blackList))) {
                        if (!Cools.isEmpty(blackList) && 0 < Cools.getIntersection(otherWaveList, blackList).size()) {
                            continue;
                        }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/AStarNavigateService.java
@@ -2,12 +2,14 @@
import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.common.utils.MapDataUtils;
import com.zy.acs.manager.core.domain.VehicleDto;
import com.zy.acs.manager.core.domain.Lane;
import com.zy.acs.manager.core.service.LaneService;
import com.zy.acs.manager.core.service.astart.domain.DynamicNode;
import com.zy.acs.manager.manager.entity.Route;
import com.zy.acs.manager.manager.service.AgvService;
import com.zy.acs.manager.manager.service.CodeService;
import com.zy.acs.manager.manager.service.RouteService;
import com.zy.acs.manager.system.service.ConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -21,6 +23,8 @@
@Service
public class AStarNavigateService {
    public static final boolean OPEN_TURN_COST_WEIGHT = Boolean.FALSE;
    @Autowired
    private CodeService codeService;
    @Autowired
@@ -29,14 +33,17 @@
    private MapDataDispatcher mapDataDispatcher;
    @Autowired
    private AgvService agvService;
    public static final boolean OPEN_TURN_COST_WEIGHT = Boolean.FALSE;
    @Autowired
    private LaneService laneService;
    @Autowired
    private ConfigService configService;
    public synchronized NavigateNode execute(String agvNo, NavigateNode start, NavigateNode end
            , Boolean lock, List<String> whiteList, List<String> blackList) {
            , Boolean lock, List<String> blackList) {
        if (start.getX() == end.getX() && start.getY() == end.getY()) {
            return end;
        }
        Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class);
        PriorityQueue<NavigateNode> openQueue = new PriorityQueue<>();
        ArrayList<NavigateNode> existNodes = new ArrayList<>();
@@ -48,12 +55,12 @@
        DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(null);
        String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(null);
        List<String> included = new ArrayList<>();
//        List<String> included = new ArrayList<>();
//        if (!Cools.isEmpty(whiteList)) {
//            included.addAll(whiteList);
//        }
        included.add(agvNo);
        List<VehicleDto> vehicleDtoList = agvService.getVehicleDtoList(included);
//        included.add(agvNo);
//        List<VehicleDto> vehicleDtoList = agvService.getVehicleDtoList(included);
        while (openQueue.size() > 0) {
            // 取优先队列顶部元素并且把这个元素从Open表中删除,取F值最小的节点
@@ -64,16 +71,16 @@
            label: for (NavigateNode node : neighbourNodes) {
                // 节点存在其他车辆
                for (VehicleDto vehicleDto : vehicleDtoList) {
                    if (node.getCodeData().equals(vehicleDto.getPosCode())) {
                        if (!Cools.isEmpty(blackList) && blackList.contains(vehicleDto.getVehicle())) {
                            continue label;
                        }
                        if (lock) {
                            continue label;
                        }
                    }
                }
//                for (VehicleDto vehicleDto : vehicleDtoList) {
//                    if (node.getCodeData().equals(vehicleDto.getPosCode())) {
//                        if (!Cools.isEmpty(blackList) && blackList.contains(vehicleDto.getVehicle())) {
//                            continue label;
//                        }
//                        if (lock) {
//                            continue label;
//                        }
//                    }
//                }
                // 节点被占用
                DynamicNode dynamicNode = dynamicMatrix[node.getX()][node.getY()];
@@ -99,7 +106,7 @@
                    List<String> otherWaveList = MapDataUtils.hasOtherWave(waveNodeList, agvNo);
                    if (!Cools.isEmpty(otherWaveList)) {
                        if (!Cools.isEmpty(blackList) && !Cools.isEmpty(MapDataUtils.hasIntersection(otherWaveList, blackList))) {
                        if (!Cools.isEmpty(blackList) && 0 < Cools.getIntersection(otherWaveList, blackList).size()) {
                            continue;
                        }
@@ -109,6 +116,33 @@
                    }
                }
                // 单巷道车辆容载数量
                Lane lane = laneService.search(node.getCodeData());
                if (null != lane) {
                    int otherVehicleCount = 0;
                    List<String> laneCodes = lane.getCodes();
                    for (String laneCodeData : laneCodes) {
                        int[] laneCodeMatrixIdx = mapDataDispatcher.getCodeMatrixIdx(null, laneCodeData);
                        // scan dynamicMatrix or WaveMatrix
                        DynamicNode laneDynamicNode = dynamicMatrix[laneCodeMatrixIdx[0]][laneCodeMatrixIdx[1]];
                        String laneVehicle = laneDynamicNode.getVehicle();
                        assert !laneVehicle.equals(DynamicNodeType.BLOCK.val);
                        if (!laneVehicle.equals(DynamicNodeType.ACCESS.val)) {
                            if (!laneVehicle.equals(agvNo)) {
                                otherVehicleCount++;
                            }
                        }
                    }
                    if (otherVehicleCount + 1 > maxAgvCountInLane) {
                        if (lock) {
                            continue;
                        }
                    }
                }
                //找到目标结点就返回
                if (node.getX() == end.getX() && node.getY() == end.getY()) {
                    //并且计算出G, F, H等值