#
luxiaotao1123
2024-12-17 d2aa9473613af8cd99c3a6dea0331765ecb830dc
#
3个文件已修改
2个文件已添加
372 ■■■■ 已修改文件
zy-acs-fake/src/main/java/com/zy/acs/fake/config/RedisProperties.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-fake/src/main/resources/unlock.py 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/agv.py 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-fake/src/main/java/com/zy/acs/fake/config/RedisProperties.java
New file
@@ -0,0 +1,96 @@
package com.zy.acs.fake.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
 * redis系统配置
 * Created by vincent on 2018/10/15
 */
@Configuration
@ConfigurationProperties(prefix = "redis")
public class RedisProperties {
    public static String HOST_NAME;
    static {
        try {
            HOST_NAME = InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException e) {
            System.err.println("find hostname err");
        }
    }
    private String host;
    private String password;
    private int port;
    private int min;
    private int max;
    private int timeout;
    private int index;
    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getPort() {
        return port;
    }
    public void setPort(int port) {
        this.port = port;
    }
    public int getMin() {
        return min;
    }
    public void setMin(int min) {
        this.min = min;
    }
    public int getMax() {
        return max;
    }
    public void setMax(int max) {
        this.max = max;
    }
    public int getTimeout() {
        return timeout;
    }
    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    }
}
zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java
@@ -1,11 +1,21 @@
package com.zy.acs.fake.service;
import com.zy.acs.fake.config.RedisProperties;
import com.zy.acs.fake.domain.DynamicNode;
import com.zy.acs.framework.common.Cools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
@@ -18,9 +28,73 @@
    @Autowired
    private MapDataDispatcher mapDataDispatcher;
    @Autowired
    private RedisProperties redisProperties;
    public synchronized void unlockPath0(String agvNo, String codeData) {
        try {
            Resource resource = new ClassPathResource("unlock.py");
            File tempScript = null;
            InputStream is = resource.getInputStream();
            tempScript = File.createTempFile("unlock", ".py");
            tempScript.deleteOnExit();
            Files.copy(is, tempScript.toPath(), StandardCopyOption.REPLACE_EXISTING);
            tempScript.setExecutable(true);
            ProcessBuilder processBuilder = new ProcessBuilder(
                    "python"
                    , tempScript.getAbsolutePath()
                    , redisProperties.getHost()
                    , redisProperties.getPassword()
                    , String.valueOf(redisProperties.getPort())
                    , String.valueOf(redisProperties.getIndex())
                    , agvNo
                    , codeData
            );
            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("Fail python");
                }
            }
        } catch (Exception e) {
            log.error("MapService.unlockPath", e);
        }
    }
    public synchronized void unlockPath(String agvNo, String codeData) {
        try {
            long startTime = System.currentTimeMillis();
            if (Cools.isEmpty(agvNo, codeData)) {
                return;
@@ -55,8 +129,10 @@
                mapDataDispatcher.clearDynamicMatrixByCodeList(lev, resetCodeList);
            }
            log.info("解锁路径函数花费时间为:{}毫秒......", System.currentTimeMillis() - startTime);
        } catch (Exception e) {
            log.error("TrafficService.unlockPath", e);
            log.error("MapService.unlockPath", e);
        }
    }
zy-acs-fake/src/main/resources/unlock.py
New file
@@ -0,0 +1,22 @@
import numpy as np
import json
import time
import redis
startTime = time.perf_counter()
redisHost = sys.argv[1]
redisPwd = sys.argv[2]
redisPort = sys.argv[3]
redisIdx = sys.argv[4]
agvNo = sys.argv[5]
codeData = sys.argv[6]
# 创建一个连接池
pool = redis.ConnectionPool(host=redisHost, port=int(redisPort), password=redisPwd, db=int(redisIdx))
r = redis.Redis(connection_pool=pool)
codeMatrixStr = r.get('KV.AGV_MAP_ASTAR_CODE_FLAG.1')
codeMatrix = np.array(json.loads(codeMatrixStr))
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
@@ -227,7 +227,7 @@
            }
        } catch (Exception e) {
            log.error("TrafficService.unlockPath", e);
            log.error("MapService.unlockPath", e);
        }
    }
zy-acs-manager/src/main/resources/agv.py
@@ -1,13 +1,12 @@
import ast
import sys
import numpy as np
import json
import time
import redis
from collections import deque
radiusLen = None
# 将字符串转换为浮点型数组
def convert_to_float_array(str_array):
@@ -15,50 +14,63 @@
        return np.array(ast.literal_eval(str_array), dtype=float)
    return str_array
def getWaveScopeByCode(x, y):
    code = codeMatrix[x, y]
def getWaveScopeByCode_iterative(x, y):
    """
    使用广度优先搜索(BFS)来代替递归,以避免递归深度过大的问题。
    """
    includeList = []
    existNodes = set()
    spreadWaveNode({"x": x, "y": y}, {"x": x, "y": y}, existNodes, includeList)
    return includeList
    queue = deque()
def spreadWaveNode(originNode, currNode, existNodes, includeList):
    x, y = currNode['x'], currNode['y']
    neighbors = [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]
    for neighbor in neighbors:
        extendNeighborNodes(originNode, {"x": neighbor[0], "y": neighbor[1]}, existNodes, includeList)
def extendNeighborNodes(originNode, nextNode, existNodes, includeList):
    x, y = nextNode['x'], nextNode['y']
    if (x < 0 or x >= codeMatrix.shape[0] or y < 0 or y >= codeMatrix.shape[1]):
        return
    if (x, y) in existNodes:
        return
    originNode = {"x": x, "y": y}
    currNode = {"x": x, "y": y}
    queue.append(currNode)
    existNodes.add((x, y))
    nextNodeCodeData = codeMatrix[x, y]
    while queue:
        node = queue.popleft()
        node_x, node_y = node['x'], node['y']
        neighbors = [
            (node_x + 1, node_y),
            (node_x - 1, node_y),
            (node_x, node_y + 1),
            (node_x, node_y - 1)
        ]
    if nextNodeCodeData == 'NONE':
        spreadWaveNode(originNode, nextNode, existNodes, includeList)
    else:
        o1Cda = convert_to_float_array(cdaMatrix[originNode['x'], originNode['y']])
        o2Cda = convert_to_float_array(cdaMatrix[x, y])
        for neighbor in neighbors:
            nx, ny = neighbor
            # 检查边界条件
            if (nx < 0 or nx >= codeMatrix.shape[0] or ny < 0 or ny >= codeMatrix.shape[1]):
                continue
            if (nx, ny) in existNodes:
                continue
        num1 = (o1Cda[0] - o2Cda[0]) ** 2
        num2 = (o1Cda[1] - o2Cda[1]) ** 2
        if num1 + num2 <= radiusLen ** 2:
            includeList.append({"x": int(x), "y": int(y), "code": str(codeMatrix[x, y])})
            spreadWaveNode(originNode, nextNode, existNodes, includeList)
            existNodes.add((nx, ny))
            neighbor_code = codeMatrix[nx, ny]
# 找到某个值对应的 x, y 下标
            if neighbor_code == 'NONE':
                queue.append({"x": nx, "y": ny})
            else:
                o1Cda = convert_to_float_array(cdaMatrix[x, y])
                o2Cda = convert_to_float_array(cdaMatrix[nx, ny])
                num1 = (o1Cda[0] - o2Cda[0]) ** 2
                num2 = (o1Cda[1] - o2Cda[1]) ** 2
                if num1 + num2 <= radiusLen ** 2:
                    includeList.append({
                        "x": int(nx),
                        "y": int(ny),
                        "code": str(codeMatrix[nx, ny])
                    })
                    queue.append({"x": nx, "y": ny})
    return includeList
def find_value_in_matrix(value):
    indices = np.where(codeMatrix == value)
    return list(zip(indices[0], indices[1]))
def initWaveMatrix():
    lev = 1
    waveMatrix = np.empty_like(codeMatrix, dtype=object)
    for x in range(codeMatrix.shape[0]):
@@ -73,7 +85,10 @@
# 优化版本:使用集合来提高性能
def mergeWave(originWave, vehicle):
    # 将字符串解析为集合
    set_data = set(ast.literal_eval(originWave))
    try:
        set_data = set(ast.literal_eval(originWave))
    except (ValueError, SyntaxError):
        set_data = set()
    # 如果 vehicle 不在集合中,则添加
    set_data.add(vehicle)
    # 返回序列化后的字符串
@@ -90,6 +105,8 @@
# 使用 numpy 加速的代码
def process_dynamic_matrix(dynamicMatrix, codeMatrix):
    global waveMatrix  # 确保 waveMatrix 是全局变量
    # 将 dynamicMatrix 转换为结构化数组
    dynamicMatrix = convert_to_structured_array(dynamicMatrix)
@@ -104,57 +121,72 @@
    # 遍历满足条件的坐标
    for x, y in zip(x_indices, y_indices):
        # print(code)
        data = dynamicMatrix[x][y]
        vehicle = data['vehicle']
        includeList = getWaveScopeByCode(x,y)
        vehicle = dynamicMatrix[x][y]['vehicle']
        includeList = getWaveScopeByCode_iterative(x, y)
        for include in includeList:
            originWave = waveMatrix[include['x']][include['y']]
            waveMatrix[include['x']][include['y']] = mergeWave(originWave, vehicle)
radiusLenStr = sys.argv[1]
radiusLen = float(radiusLenStr)
def main():
    global radiusLen, codeMatrix, cdaMatrix, waveMatrix  # 声明为全局变量
redisHost = sys.argv[2]
redisPwd = sys.argv[3]
redisPort = sys.argv[4]
redisIdx = sys.argv[5]
    if len(sys.argv) != 6:
        print("Usage: python script.py <radiusLen> <redisHost> <redisPwd> <redisPort> <redisIdx>")
        sys.exit(1)
startTime = time.perf_counter()
    radiusLenStr = sys.argv[1]
    radiusLen = float(radiusLenStr)
# 创建一个连接池
pool = redis.ConnectionPool(host=redisHost, port=int(redisPort), password=redisPwd, db=int(redisIdx))
r = redis.Redis(connection_pool=pool)
    redisHost = sys.argv[2]
    redisPwd = sys.argv[3]
    redisPort = sys.argv[4]
    redisIdx = sys.argv[5]
codeMatrixStr = r.get('KV.AGV_MAP_ASTAR_CODE_FLAG.1')
codeMatrix = np.array(json.loads(codeMatrixStr))
    startTime = time.perf_counter()
cdaMatrixStr = r.get('KV.AGV_MAP_ASTAR_CDA_FLAG.1')
cdaMatrix = np.array(json.loads(cdaMatrixStr))
    # 创建一个连接池
    pool = redis.ConnectionPool(host=redisHost, port=int(redisPort), password=redisPwd, db=int(redisIdx))
    r = redis.Redis(connection_pool=pool)
dynamicMatrixStr = r.get('KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1')
dynamicMatrix = np.array(json.loads(dynamicMatrixStr))
    # 获取并加载 codeMatrix
    codeMatrixStr = r.get('KV.AGV_MAP_ASTAR_CODE_FLAG.1')
    if codeMatrixStr is None:
        print("Error: 'KV.AGV_MAP_ASTAR_CODE_FLAG.1' not found in Redis.")
        sys.exit(1)
    codeMatrix = np.array(json.loads(codeMatrixStr))
waveMatrix = initWaveMatrix()
    # 获取并加载 cdaMatrix
    cdaMatrixStr = r.get('KV.AGV_MAP_ASTAR_CDA_FLAG.1')
    if cdaMatrixStr is None:
        print("Error: 'KV.AGV_MAP_ASTAR_CDA_FLAG.1' not found in Redis.")
        sys.exit(1)
    cdaMatrix = np.array(json.loads(cdaMatrixStr))
# # 使用 numpy 加速的代码
process_dynamic_matrix(dynamicMatrix, codeMatrix)
    # 获取并加载 dynamicMatrix
    dynamicMatrixStr = r.get('KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1')
    if dynamicMatrixStr is None:
        print("Error: 'KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1' not found in Redis.")
        sys.exit(1)
    dynamicMatrix = np.array(json.loads(dynamicMatrixStr))
# for x in range(dynamicMatrix.shape[0]):
#     for y in range(dynamicMatrix.shape[1]):
#         data = dynamicMatrix[x, y]
#         vehicle = data['vehicle']
#         if vehicle != '0' and vehicle != '-1':
#             getWaveScopeByCode(x, y)
    # 初始化 waveMatrix
    waveMatrix = initWaveMatrix()
# 将 numpy.ndarray 转换为嵌套列表
waveMatrixList = waveMatrix.tolist()
# 将嵌套列表转换为 JSON 字符串
waveMatrixJsonStr = json.dumps(waveMatrixList)
    # 处理 dynamicMatrix
    process_dynamic_matrix(dynamicMatrix, codeMatrix)
r.set("KV.AGV_MAP_ASTAR_WAVE_FLAG.1",waveMatrixJsonStr)
    # 将 numpy.ndarray 转换为嵌套列表
    waveMatrixList = waveMatrix.tolist()
    # 将嵌套列表转换为 JSON 字符串
    waveMatrixJsonStr = json.dumps(waveMatrixList)
end = time.perf_counter()
# print('程序运行时间为: %s Seconds' % (end - startTime))
print("1")
    # 将结果保存回 Redis
    r.set("KV.AGV_MAP_ASTAR_WAVE_FLAG.1", waveMatrixJsonStr)
    end = time.perf_counter()
    # 打印程序运行时间
#     print(f"程序运行时间为: {end - startTime} Seconds")
    print("1")
if __name__ == "__main__":
    main()