zy-acs-fake/src/main/java/com/zy/acs/fake/config/RedisProperties.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-acs-fake/src/main/resources/unlock.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-acs-manager/src/main/resources/agv.py | ●●●●● 补丁 | 查看 | 原始文档 | 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) 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 existNodes.add((nx, ny)) neighbor_code = codeMatrix[nx, ny] if neighbor_code == 'NONE': queue.append({"x": nx, "y": ny}) else: o1Cda = convert_to_float_array(cdaMatrix[originNode['x'], originNode['y']]) o2Cda = convert_to_float_array(cdaMatrix[x, y]) 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(x), "y": int(y), "code": str(codeMatrix[x, y])}) spreadWaveNode(originNode, nextNode, existNodes, includeList) includeList.append({ "x": int(nx), "y": int(ny), "code": str(codeMatrix[nx, ny]) }) queue.append({"x": nx, "y": ny}) # 找到某个值对应的 x, y 下标 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): # 将字符串解析为集合 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,13 +121,18 @@ # 遍历满足条件的坐标 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) def main(): global radiusLen, codeMatrix, cdaMatrix, waveMatrix # 声明为全局变量 if len(sys.argv) != 6: print("Usage: python script.py <radiusLen> <redisHost> <redisPwd> <redisPort> <redisIdx>") sys.exit(1) radiusLenStr = sys.argv[1] radiusLen = float(radiusLenStr) @@ -126,35 +148,45 @@ pool = redis.ConnectionPool(host=redisHost, port=int(redisPort), password=redisPwd, db=int(redisIdx)) r = redis.Redis(connection_pool=pool) # 获取并加载 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)) # 获取并加载 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)) # 获取并加载 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)) # 初始化 waveMatrix waveMatrix = initWaveMatrix() # # 使用 numpy 加速的代码 # 处理 dynamicMatrix process_dynamic_matrix(dynamicMatrix, codeMatrix) # 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) # 将结果保存回 Redis r.set("KV.AGV_MAP_ASTAR_WAVE_FLAG.1",waveMatrixJsonStr) end = time.perf_counter() # print('程序运行时间为: %s Seconds' % (end - startTime)) # 打印程序运行时间 # print(f"程序运行时间为: {end - startTime} Seconds") print("1") if __name__ == "__main__": main()