#
luxiaotao1123
2024-12-25 f941a47ccd057a719eef4db7decf13bf9ad2a4f8
#
5个文件已修改
260 ■■■■ 已修改文件
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AvoidWaveCalculator.java 231 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/AStarNavigateService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/agv.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AvoidWaveCalculator.java
@@ -50,6 +50,8 @@
    private ExecutorService singleThreadExecutor;
    private File pythonFile = null;
    @Autowired
    private MapDataDispatcher mapDataDispatcher;
    @Autowired
@@ -85,7 +87,125 @@
        });
    }
    private File pythonFile = null;
    public boolean calcWaveScope() {
        Integer lev = MapDataDispatcher.MAP_DEFAULT_LEV;
        boolean lockAcquired = false;
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        try {
            if (!(lockAcquired = lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) {
                log.warn("AvoidWaveCalculator execute fail, cause can not acquire lock ...");
                return false;
            }
            return this.calcWaveScopeByPython(lev);
//            return this.calcWaveScopeByJava(lev);
        } catch (Exception e) {
            log.error(this.getClass().getSimpleName(), e);
            return false;
        } finally {
            if (lockAcquired) {
                lock.unlock();
            }
            stopWatch.stop();
            if (stopWatch.getTime() > 100) {
                log.info("滤波函数花费时间为:{}毫秒......", stopWatch.getTime());
            }
        }
    }
    private boolean calcWaveScopeByPython(Integer lev) throws Exception {
        // python
        AgvModel agvModel = agvModelService.selectByType(AgvModelType.CTU_BOX_TRANSPORT_AGV.toString());    // can be optimized
        Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModel.getDiameter(), MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR);
        if (null == pythonFile) {
            pythonFile = loadPythonFile();
        }
        ProcessBuilder processBuilder = new ProcessBuilder(
                "python" // 或者 "python3" 取决于系统配置
                , pythonFile.getAbsolutePath()
                , String.valueOf(avoidDistance)
                , redisProperties.getHost()
                , redisProperties.getPassword()
                , String.valueOf(redisProperties.getPort())
                , String.valueOf(redisProperties.getIndex())
        );
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        StringBuilder builder = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }
        int exitCode = process.waitFor();
        if (exitCode != 0) {
            log.error("Python script exited with error code: {}", exitCode);
            log.error("python error:{}", builder.toString());
            return false;
        }
        reader.close();
        if (builder.length() <= 0) {
            return false;
        }
        String result = builder.toString();
        if (Cools.isEmpty(result)) {
            return false;
        }
        if (!"1".equals(result)) {
            log.error("Failed to call python");
            return false;
        }
        return true;
    }
    private boolean calcWaveScopeByJava(Integer lev) throws Exception {
        // java
        String[][] codeMatrix = mapDataDispatcher.getCodeMatrix(lev);
        String[][] waveMatrix = mapDataDispatcher.initWaveMatrix(lev);
        // lock path
        DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(lev);
        for (int i = 0; i < dynamicMatrix.length; i++) {
            for (int j = 0; j < dynamicMatrix[i].length; j++) {
                DynamicNode dynamicNode = dynamicMatrix[i][j];
                String vehicle = dynamicNode.getVehicle();
                if (!DynamicNodeType.ACCESS.val.equals(vehicle) && !DynamicNodeType.BLOCK.val.equals(vehicle)) {
                    AgvModel agvModel = agvModelService.getById(agvService.selectByUuid(vehicle).getAgvModel());    // can be optimized
                    Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModel.getDiameter(), MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR);
                    List<NavigateNode> includeList = mapService.getWaveScopeByCode(lev, codeMatrix[i][j], avoidDistance);
                    for (NavigateNode navigateNode : includeList) {
                        String waveNode = waveMatrix[navigateNode.getX()][navigateNode.getY()]; // overlay
                        waveMatrix[navigateNode.getX()][navigateNode.getY()] = MapDataUtils.generateWaveNode(waveNode, vehicle);
                    }
                }
            }
        }
//            mapDataDispatcher.printMatrix(waveMatrix);
        mapDataDispatcher.setWaveMatrix(lev, waveMatrix);
        return true;
    }
    private File loadPythonFile() {
        File scriptFile = null;
@@ -98,118 +218,11 @@
            Files.copy(is, scriptFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
            scriptFile.setExecutable(true);
            boolean executable = scriptFile.setExecutable(true);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return scriptFile;
    }
    public void calcWaveScope() {
        Integer lev = MapDataDispatcher.MAP_DEFAULT_LEV;
        boolean lockAcquired = false;
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        try {
            if (!(lockAcquired = lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) {
                log.warn("AvoidWaveCalculator execute fail, cause can not acquire lock ...");
                return;
            }
            // python
            AgvModel agvModel = agvModelService.selectByType(AgvModelType.CTU_BOX_TRANSPORT_AGV.toString());    // can be optimized
            Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModel.getDiameter(), MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR);
            if (null == pythonFile) {
                pythonFile = loadPythonFile();
            }
            ProcessBuilder processBuilder = new ProcessBuilder(
                    "python" // 或者 "python3" 取决于系统配置
                    , pythonFile.getAbsolutePath()
                    , String.valueOf(avoidDistance)
                    , redisProperties.getHost()
                    , redisProperties.getPassword()
                    , String.valueOf(redisProperties.getPort())
                    , String.valueOf(redisProperties.getIndex())
            );
            processBuilder.redirectErrorStream(true);
            Process process = processBuilder.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            StringBuilder builder = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }
            int exitCode = process.waitFor();
            if (exitCode != 0) {
                log.error("Python script exited with error code: {}", exitCode);
                log.error("python error:{}", builder.toString());
                return;
            }
            reader.close();
            if (builder.length() <= 0) {
                return;
            }
            String result = builder.toString();
            if (!Cools.isEmpty(result)) {
                if (!"1".equals(result)) {
                    log.error("Failed to call python");
                }
            }
//            log.error("python finish {}", System.currentTimeMillis() - startTime);
            // java
//            String[][] codeMatrix = mapDataDispatcher.getCodeMatrix(lev);
//            String[][] waveMatrix = mapDataDispatcher.initWaveMatrix(lev);
//
//            // lock path
//            DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(lev);
//            for (int i = 0; i < dynamicMatrix.length; i++) {
//                for (int j = 0; j < dynamicMatrix[i].length; j++) {
//                    DynamicNode dynamicNode = dynamicMatrix[i][j];
//                    String vehicle = dynamicNode.getVehicle();
//                    if (!DynamicNodeType.ACCESS.val.equals(vehicle) && !DynamicNodeType.BLOCK.val.equals(vehicle)) {
//                        AgvModel agvModel = agvModelService.getById(agvService.selectByUuid(vehicle).getAgvModel());    // can be optimized
//
//                        Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModel.getDiameter(), MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR);
//                        List<NavigateNode> includeList = mapService.getWaveScopeByCode(lev, codeMatrix[i][j], avoidDistance);
//
//                        for (NavigateNode navigateNode : includeList) {
//                            String waveNode = waveMatrix[navigateNode.getX()][navigateNode.getY()]; // overlay
//                            waveMatrix[navigateNode.getX()][navigateNode.getY()] = MapDataUtils.generateWaveNode(waveNode, vehicle);
//                        }
//                    }
//                }
//            }
//
////            mapDataDispatcher.printMatrix(waveMatrix);
//            mapDataDispatcher.setWaveMatrix(lev, waveMatrix);
        } catch (Exception e) {
            log.error(this.getClass().getSimpleName(), e);
        } finally {
            if (lockAcquired) {
                lock.unlock();
            }
            stopWatch.stop();
            if (stopWatch.getTime() > 100) {
                log.info("滤波函数花费时间为:{}毫秒......", stopWatch.getTime());
            }
        }
    }
    public void syncWaveBySingleVeh(String agvNo, String codeData) {
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/RetreatNavigateService.java
@@ -23,6 +23,7 @@
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
/**
@@ -95,7 +96,7 @@
            List<RetreatNavigateNode> enableNodes = new ArrayList<>();
            ArrayList<RetreatNavigateNode> neighborNodes = this.getNeighborNodes(currentNode, existNodes, codeMatrix);
            List<RetreatNavigateNode> neighborNodes = this.getNeighborNodes(currentNode, existNodes, codeMatrix);
            boolean pointOfTurn = neighborNodes.size() >= 2;
            label: for (RetreatNavigateNode node : neighborNodes) {
                if (node.getCodeData().equals(breakPoint)) { continue; }
@@ -212,7 +213,7 @@
                RetreatNavigateNode currentNode = openQueue.poll();
                List<RetreatNavigateNode> enableNodes = new ArrayList<>();
                ArrayList<RetreatNavigateNode> neighborNodes = this.getNeighborNodes(currentNode, existNodes, codeMatrix);
                List<RetreatNavigateNode> neighborNodes = this.getNeighborNodes(currentNode, existNodes, codeMatrix);
                // 第一步:获取有效转弯点
                if (null == availablePointOfTurn) {
@@ -319,12 +320,12 @@
    }
    // 获取四周节点
    private ArrayList<RetreatNavigateNode> getNeighborNodes(RetreatNavigateNode currentNode, Set<RetreatNavigateNode> existNodes, String[][] codeMatrix) {
    private List<RetreatNavigateNode> getNeighborNodes(RetreatNavigateNode currentNode, Set<RetreatNavigateNode> existNodes, String[][] codeMatrix) {
        int x = currentNode.getX();
        int y = currentNode.getY();
        ArrayList<RetreatNavigateNode> neighbourNodes = new ArrayList<>();
        List<RetreatNavigateNode> neighbourNodes = new CopyOnWriteArrayList<>();
        List<RetreatNavigateNode> possibleNodes = Arrays.asList(
                new RetreatNavigateNode(x, y + 1), // right
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
@@ -126,8 +126,11 @@
            // execute -----------------------------------------------
            //        ArrayList<List<TaskPosDto>> list = JSON.parseObject(travel.getTaskContent(), new TypeReference<ArrayList<List<TaskPosDto>>>() {});
            // get path list
            avoidWaveCalculator.calcWaveScope();    // * sync wave scope
            // * sync wave scope
            if (!avoidWaveCalculator.calcWaveScope()) {
                log.error("failed to calculate avoid wave matrix ...");
                return;
            }
            // checkout path
            Code startCode = codeService.getById(agvDetail.getRecentCode());
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/AStarNavigateService.java
@@ -1,6 +1,7 @@
package com.zy.acs.manager.core.service.astart;
import com.zy.acs.common.constant.RedisConstant;
import com.zy.acs.common.utils.GsonUtils;
import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.common.utils.MapDataUtils;
@@ -11,14 +12,17 @@
import com.zy.acs.manager.manager.entity.Segment;
import com.zy.acs.manager.manager.service.JamService;
import com.zy.acs.manager.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
/**
 * Created by vincent on 6/12/2024
 */
@Slf4j
@Service
public class AStarNavigateService {
@@ -58,9 +62,10 @@
            // 取优先队列顶部元素并且把这个元素从Open表中删除,取F值最小的节点
            NavigateNode currentNode = openQueue.poll();
            ArrayList<NavigateNode> neighbourNodes = this.getNeighborNodes(currentNode, mapMatrix, existNodes);
            List<NavigateNode> neighbourNodes = this.getNeighborNodes(currentNode, mapMatrix, existNodes);
            for (NavigateNode node : neighbourNodes) {
                node.setCodeData(codeMatrix[node.getX()][node.getY()]);
                boolean isEndNode = node.getX() == end.getX() && node.getY() == end.getY();
                int weight = 0;
@@ -171,11 +176,11 @@
    }
    // 获取四周节点
    private ArrayList<NavigateNode> getNeighborNodes(NavigateNode currentNode, int[][] mapMatrix, Set<NavigateNode> existNodes) {
    private List<NavigateNode> getNeighborNodes(NavigateNode currentNode, int[][] mapMatrix, Set<NavigateNode> existNodes) {
        int x = currentNode.getX();
        int y = currentNode.getY();
        ArrayList<NavigateNode> neighbourNodes = new ArrayList<>();
        List<NavigateNode> neighbourNodes = new CopyOnWriteArrayList<>();
        List<NavigateNode> possibleNodes = Arrays.asList(
                new NavigateNode(x, y + 1), // right
zy-acs-manager/src/main/resources/agv.py
@@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
import ast
import multiprocessing
import sys