#
luxiaotao1123
2024-12-16 62dbd7e739a4ee3ab954445352a93a29b2face8c
#
2个文件已修改
1个文件已添加
1个文件已删除
479 ■■■■ 已修改文件
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AvoidWaveCalculator.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/agv.py 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/agv1.py 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/agv2.py 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AvoidWaveCalculator.java
@@ -28,10 +28,9 @@
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -106,19 +105,41 @@
            long startTime = System.currentTimeMillis();
            Resource resource = new ClassPathResource("agv.py");
            File file = resource.getFile();
            File tempScript = null;
            try {
                InputStream is = resource.getInputStream();
                tempScript = File.createTempFile("agv", ".py");
                tempScript.deleteOnExit();
                Files.copy(is, tempScript.toPath(), StandardCopyOption.REPLACE_EXISTING);
                tempScript.setExecutable(true);
            ProcessBuilder processBuilder = new ProcessBuilder(
                    "python"
                    , file.getAbsolutePath()
                        "python" // 或者 "python3" 取决于系统配置
                        , tempScript.getAbsolutePath()
                    , String.valueOf(avoidDistance)
                    , redisProperties.getHost()
                    , redisProperties.getPassword()
                    , String.valueOf(redisProperties.getPort())
                    , String.valueOf(redisProperties.getIndex())
            );
            processBuilder.redirectErrorStream(true);
            try {
//            File file = resource.getFile();
//            ProcessBuilder processBuilder = new ProcessBuilder(
//                    "python"
//                    , file.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()));
zy-acs-manager/src/main/resources/agv.py
@@ -1,14 +1,13 @@
import ast
import sys
import numpy as np
import json
import time
import redis
radiusLen = None
codeMatrix = None  # 全局变量
cdaMatrix = None   # 全局变量
waveMatrix = None  # 全局变量
# 将字符串转换为浮点型数组
def convert_to_float_array(str_array):
@@ -59,7 +58,6 @@
    return list(zip(indices[0], indices[1]))
def initWaveMatrix():
    global codeMatrix, waveMatrix  # 声明使用全局变量
    lev = 1
    waveMatrix = np.empty_like(codeMatrix, dtype=object)
@@ -75,10 +73,7 @@
# 优化版本:使用集合来提高性能
def mergeWave(originWave, vehicle):
    # 将字符串解析为集合
    try:
        set_data = set(ast.literal_eval(originWave))
    except (ValueError, SyntaxError):
        set_data = set()
    # 如果 vehicle 不在集合中,则添加
    set_data.add(vehicle)
    # 返回序列化后的字符串
@@ -95,7 +90,6 @@
# 使用 numpy 加速的代码
def process_dynamic_matrix(dynamicMatrix, codeMatrix):
    global waveMatrix  # 声明使用全局变量
    # 将 dynamicMatrix 转换为结构化数组
    dynamicMatrix = convert_to_structured_array(dynamicMatrix)
@@ -111,25 +105,15 @@
    # 遍历满足条件的坐标
    for x, y in zip(x_indices, y_indices):
        # print(code)
        vehicle = dynamicMatrix[x][y]['vehicle']
        data = dynamicMatrix[x][y]
        vehicle = data['vehicle']
        includeList = getWaveScopeByCode(x, y)
        for include in includeList:
            originWave = waveMatrix[include['x']][include['y']]
            waveMatrix[include['x']][include['y']] = mergeWave(originWave, vehicle)
def main():
    global radiusLen, codeMatrix, cdaMatrix, waveMatrix  # 声明使用全局变量
    if len(sys.argv) != 6:
        print("用法: python agv.py <radiusLen> <redisHost> <redisPwd> <redisPort> <redisIdx>")
        sys.exit(1)
    radiusLenStr = sys.argv[1]
    try:
        radiusLen = float(radiusLenStr)
    except ValueError:
        print("radiusLen 必须是一个浮点数")
        sys.exit(1)
    redisHost = sys.argv[2]
    redisPwd = sys.argv[3]
@@ -139,70 +123,38 @@
    startTime = time.perf_counter()
    # 创建一个连接池
    try:
        pool = redis.ConnectionPool(host=redisHost, port=int(redisPort), password=redisPwd, db=int(redisIdx))
        r = redis.Redis(connection_pool=pool, decode_responses=True)
    except Exception as e:
        print(f"无法连接到 Redis: {e}")
        sys.exit(1)
r = redis.Redis(connection_pool=pool)
    try:
        codeMatrixStr = r.get('KV.AGV_MAP_ASTAR_CODE_FLAG.1')
        if codeMatrixStr is None:
            raise ValueError("Redis 中未找到键: KV.AGV_MAP_ASTAR_CODE_FLAG.1")
        codeMatrix = np.array(json.loads(codeMatrixStr))
    except Exception as e:
        print(f"获取 codeMatrix 失败: {e}")
        sys.exit(1)
    try:
        cdaMatrixStr = r.get('KV.AGV_MAP_ASTAR_CDA_FLAG.1')
        if cdaMatrixStr is None:
            raise ValueError("Redis 中未找到键: KV.AGV_MAP_ASTAR_CDA_FLAG.1")
        cdaMatrix = np.array(json.loads(cdaMatrixStr))
    except Exception as e:
        print(f"获取 cdaMatrix 失败: {e}")
        sys.exit(1)
    try:
        dynamicMatrixStr = r.get('KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1')
        if dynamicMatrixStr is None:
            raise ValueError("Redis 中未找到键: KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1")
        dynamicMatrix = np.array(json.loads(dynamicMatrixStr))
    except Exception as e:
        print(f"获取 dynamicMatrix 失败: {e}")
        sys.exit(1)
    # 初始化 waveMatrix
    try:
        waveMatrix = initWaveMatrix()
    except Exception as e:
        print(f"初始化 waveMatrix 失败: {e}")
        sys.exit(1)
    # 处理 dynamicMatrix
    try:
# # 使用 numpy 加速的代码
        process_dynamic_matrix(dynamicMatrix, codeMatrix)
    except Exception as e:
        print(f"处理 dynamicMatrix 失败: {e}")
        sys.exit(1)
# 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)
    # 将 numpy.ndarray 转换为嵌套列表
    waveMatrixList = waveMatrix.tolist()
    # 将嵌套列表转换为 JSON 字符串
    waveMatrixJsonStr = json.dumps(waveMatrixList)
    try:
        r.set("KV.AGV_MAP_ASTAR_WAVE_FLAG.1", waveMatrixJsonStr)
    except Exception as e:
        print(f"将 waveMatrix 写入 Redis 失败: {e}")
        sys.exit(1)
    end = time.perf_counter()
    # print('程序运行时间为: %s Seconds' % (end - startTime))
    print("1")
    # 如果需要,可以打印运行时间
    # print(f"程序运行时间为: {end - startTime:.2f} 秒")
if __name__ == "__main__":
    main()
zy-acs-manager/src/main/resources/agv1.py
File was deleted
zy-acs-manager/src/main/resources/agv2.py
New file
@@ -0,0 +1,208 @@
import ast
import sys
import numpy as np
import json
import time
import redis
radiusLen = None
codeMatrix = None  # 全局变量
cdaMatrix = None   # 全局变量
waveMatrix = None  # 全局变量
# 将字符串转换为浮点型数组
def convert_to_float_array(str_array):
    if isinstance(str_array, str):
        return np.array(ast.literal_eval(str_array), dtype=float)
    return str_array
def getWaveScopeByCode(x, y):
    code = codeMatrix[x, y]
    includeList = []
    existNodes = set()
    spreadWaveNode({"x": x, "y": y}, {"x": x, "y": y}, existNodes, includeList)
    return includeList
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
    existNodes.add((x, y))
    nextNodeCodeData = codeMatrix[x, y]
    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])
        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)
# 找到某个值对应的 x, y 下标
def find_value_in_matrix(value):
    indices = np.where(codeMatrix == value)
    return list(zip(indices[0], indices[1]))
def initWaveMatrix():
    global codeMatrix, waveMatrix  # 声明使用全局变量
    lev = 1
    waveMatrix = np.empty_like(codeMatrix, dtype=object)
    for x in range(codeMatrix.shape[0]):
        for y in range(codeMatrix.shape[1]):
            if codeMatrix[x][y] == 'NONE':
                waveMatrix[x][y] = "-"
            else:
                waveMatrix[x][y] = '[]'
    return waveMatrix
# 优化版本:使用集合来提高性能
def mergeWave(originWave, vehicle):
    # 将字符串解析为集合
    try:
        set_data = set(ast.literal_eval(originWave))
    except (ValueError, SyntaxError):
        set_data = set()
    # 如果 vehicle 不在集合中,则添加
    set_data.add(vehicle)
    # 返回序列化后的字符串
    return json.dumps(list(set_data))
# 将 dynamicMatrix 转换为 numpy 结构化数组
def convert_to_structured_array(dynamicMatrix):
    # 定义结构化数组的 dtype
    dtype = [('serial', int), ('vehicle', 'U2')]
    # 将嵌套的列表转换为结构化数组
    structured_array = np.array([tuple(d.values()) for row in dynamicMatrix for d in row], dtype=dtype)
    # 重塑为原始的二维形状
    return structured_array.reshape(len(dynamicMatrix), -1)
# 使用 numpy 加速的代码
def process_dynamic_matrix(dynamicMatrix, codeMatrix):
    global waveMatrix  # 声明使用全局变量
    # 将 dynamicMatrix 转换为结构化数组
    dynamicMatrix = convert_to_structured_array(dynamicMatrix)
    # 获取 dynamicMatrix 的形状
    rows, cols = dynamicMatrix.shape
    # 创建一个布尔掩码,用于筛选出 vehicle 不为 '0' 和 '-1' 的元素
    mask = (dynamicMatrix['vehicle'] != '0') & (dynamicMatrix['vehicle'] != '-1')
    # 获取满足条件的 x 和 y 坐标
    x_indices, y_indices = np.where(mask)
    # 遍历满足条件的坐标
    for x, y in zip(x_indices, y_indices):
        # print(code)
        vehicle = dynamicMatrix[x][y]['vehicle']
        includeList = getWaveScopeByCode(x, y)
        for include in includeList:
            originWave = waveMatrix[include['x']][include['y']]
            waveMatrix[include['x']][include['y']] = mergeWave(originWave, vehicle)
def main():
    global radiusLen, codeMatrix, cdaMatrix, waveMatrix  # 声明使用全局变量
    if len(sys.argv) != 6:
        print("用法: python agv.py <radiusLen> <redisHost> <redisPwd> <redisPort> <redisIdx>")
        sys.exit(1)
    radiusLenStr = sys.argv[1]
    try:
        radiusLen = float(radiusLenStr)
    except ValueError:
        print("radiusLen 必须是一个浮点数")
        sys.exit(1)
    redisHost = sys.argv[2]
    redisPwd = sys.argv[3]
    redisPort = sys.argv[4]
    redisIdx = sys.argv[5]
    startTime = time.perf_counter()
    # 创建一个连接池
    try:
        pool = redis.ConnectionPool(host=redisHost, port=int(redisPort), password=redisPwd, db=int(redisIdx))
        r = redis.Redis(connection_pool=pool, decode_responses=True)
    except Exception as e:
        print(f"无法连接到 Redis: {e}")
        sys.exit(1)
    try:
        codeMatrixStr = r.get('KV.AGV_MAP_ASTAR_CODE_FLAG.1')
        if codeMatrixStr is None:
            raise ValueError("Redis 中未找到键: KV.AGV_MAP_ASTAR_CODE_FLAG.1")
        codeMatrix = np.array(json.loads(codeMatrixStr))
    except Exception as e:
        print(f"获取 codeMatrix 失败: {e}")
        sys.exit(1)
    try:
        cdaMatrixStr = r.get('KV.AGV_MAP_ASTAR_CDA_FLAG.1')
        if cdaMatrixStr is None:
            raise ValueError("Redis 中未找到键: KV.AGV_MAP_ASTAR_CDA_FLAG.1")
        cdaMatrix = np.array(json.loads(cdaMatrixStr))
    except Exception as e:
        print(f"获取 cdaMatrix 失败: {e}")
        sys.exit(1)
    try:
        dynamicMatrixStr = r.get('KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1')
        if dynamicMatrixStr is None:
            raise ValueError("Redis 中未找到键: KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1")
        dynamicMatrix = np.array(json.loads(dynamicMatrixStr))
    except Exception as e:
        print(f"获取 dynamicMatrix 失败: {e}")
        sys.exit(1)
    # 初始化 waveMatrix
    try:
        waveMatrix = initWaveMatrix()
    except Exception as e:
        print(f"初始化 waveMatrix 失败: {e}")
        sys.exit(1)
    # 处理 dynamicMatrix
    try:
        process_dynamic_matrix(dynamicMatrix, codeMatrix)
    except Exception as e:
        print(f"处理 dynamicMatrix 失败: {e}")
        sys.exit(1)
    # 将 numpy.ndarray 转换为嵌套列表
    waveMatrixList = waveMatrix.tolist()
    # 将嵌套列表转换为 JSON 字符串
    waveMatrixJsonStr = json.dumps(waveMatrixList)
    try:
        r.set("KV.AGV_MAP_ASTAR_WAVE_FLAG.1", waveMatrixJsonStr)
    except Exception as e:
        print(f"将 waveMatrix 写入 Redis 失败: {e}")
        sys.exit(1)
    end = time.perf_counter()
    # print('程序运行时间为: %s Seconds' % (end - startTime))
    print("1")
    # 如果需要,可以打印运行时间
    # print(f"程序运行时间为: {end - startTime:.2f} 秒")
if __name__ == "__main__":
    main()