自动化立体仓库 - WCS系统
野心家
2023-11-04 5270e2368d6561b32720b4f712cca132ae87300f
src/main/java/com/zy/common/utils/NyShuttleOperaUtils.java
@@ -1,5 +1,6 @@
package com.zy.common.utils;
import com.core.common.SpringUtils;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.NavigateNode;
import com.zy.common.model.NyShuttleOperaResult;
@@ -19,30 +20,64 @@
     * @param shuttleNo 小车号
     * @param wrkNo 工作号
     * @param startPoint 起点(小车当前位置)
     * @param targetPoint 目标点(货物目标位置)
     */
    public static NyShuttleOperaResult getShuttleTransportCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String targetPoint) {
        //行走路径
        ArrayList<NavigateNode> nodes = new ArrayList<>();
        //命令集合
        ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
        //计算起点到目标点命令
        NyShuttleOperaResult result = getStartToTargetCommands(shuttleNo, wrkNo, startPoint, targetPoint, NavigationMapType.DFX.id);
        if (result == null) {
            //计算结果必须不为空,否则计算失败
            return null;
        }
        nodes.addAll(result.getNodes());
        //起点位置下发一条顶升命令将货物进行搬运
        commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, true));
        commands.addAll(result.getCommands());//起点到目标点移动命令
        //当小车行走到目标点后,需要下发一条下降命令将货物放置
        commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, false));
        return result(commands, nodes);
    }
    /**
     * 计算并获取小车从起点——中间点——目标点之间搬运货物动作命令
     * @param shuttleNo 小车号
     * @param wrkNo 工作号
     * @param startPoint 起点(小车当前位置)
     * @param middlePoint 中间点(货物位置)
     * @param targetPoint 目标点(货物目标位置)
     */
    public static NyShuttleOperaResult getShuttleTransportCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String middlePoint, String targetPoint) {
        //计算起点到中间点命令
        NyShuttleOperaResult result1 = getStartToTargetCommands(shuttleNo, wrkNo, startPoint, middlePoint);
        //计算中间点到目标点命令
        NyShuttleOperaResult result2 = getStartToTargetCommands(shuttleNo, wrkNo, middlePoint, targetPoint);
        if (result1 == null || result2 == null) {
            //两个计算结果必须不为空,否则计算失败
            return null;
        }
        //行走路径
        ArrayList<NavigateNode> nodes = new ArrayList<>();
        nodes.addAll(result1.getNodes());
        nodes.addAll(result2.getNodes());
        //命令集合
        ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
        commands.addAll(result1.getCommands());
        if (!startPoint.equals(middlePoint)) {//起点和中间点不一致,需要计算起点到中间点路径
            //计算起点到中间点命令
            NyShuttleOperaResult result1 = getStartToTargetCommands(shuttleNo, wrkNo, startPoint, middlePoint, NavigationMapType.NORMAL.id);
            if (result1 == null) {
                //计算结果必须不为空,否则计算失败
                return null;
            }
            nodes.addAll(result1.getNodes());
            commands.addAll(result1.getCommands());
        }
        //计算中间点到目标点命令
        NyShuttleOperaResult result2 = getStartToTargetCommands(shuttleNo, wrkNo, middlePoint, targetPoint, NavigationMapType.DFX.id);
        if (result2 == null) {
            //计算结果必须不为空,否则计算失败
            return null;
        }
        nodes.addAll(result2.getNodes());
        //当小车行走到中间点后,需要下发一条顶升命令将货物进行搬运
        commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, true));
        commands.addAll(result2.getCommands());
        commands.addAll(result2.getCommands());//中间点到目标点移动命令
        //当小车行走到目标点后,需要下发一条下降命令将货物放置
        commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, false));
        return result(commands, nodes);
@@ -51,15 +86,17 @@
    /**
     * 获取起点到目标点行走命令
     */
    public static NyShuttleOperaResult getStartToTargetCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String targetPoint) {
    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, NavigationMapType.NORMAL.id, 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);
@@ -71,9 +108,69 @@
            NavigateNode targetPath = nodes.get(nodes.size() - 1);
            //获取移动命令
            NyShuttleHttpCommand moveCommand = NyHttpUtils.getMoveCommand(shuttleNo, wrkNo, startPath, targetPath);
            moveCommand.setNodes(nodes);//将行走节点添加到每一步命令中
            commands.add(moveCommand);
            allNode.addAll(nodes);
        }
        boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(startPoint), allNode, true);//锁定路径
        if (!result) {
            return null;//路径锁定失败
        }
        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;
        }
        //命令集合
        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);
        }
        //锁定路径时剔除白名单节点
        ArrayList<NavigateNode> nodes = new ArrayList<>();
        for (NavigateNode node : allNode) {
            boolean flag = false;
            for (int[] white : whites) {
                if (node.getX() == white[0] && node.getY() == white[1]) {
                    flag = true;//存在白名单节点
                    break;//跳过白名单节点
                }
            }
            if (!flag) {
                nodes.add(node);
            }
        }
        boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(startPoint), nodes, true);//锁定路径
        if (!result) {
            return null;//路径锁定失败
        }
        return result(commands, calc);
    }