From d2aa9473613af8cd99c3a6dea0331765ecb830dc Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期二, 17 十二月 2024 13:57:20 +0800
Subject: [PATCH] #

---
 zy-acs-fake/src/main/resources/unlock.py                                     |   22 +++
 zy-acs-manager/src/main/resources/agv.py                                     |  174 ++++++++++++++----------
 zy-acs-fake/src/main/java/com/zy/acs/fake/config/RedisProperties.java        |   96 +++++++++++++
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java            |   78 +++++++++++
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java |    2 
 5 files changed, 299 insertions(+), 73 deletions(-)

diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/config/RedisProperties.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/config/RedisProperties.java
new file mode 100644
index 0000000..4ac338f
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/config/RedisProperties.java
@@ -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;
+    }
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java
index 1578c7a..6228265 100644
--- a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java
+++ b/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("瑙i攣璺緞鍑芥暟鑺辫垂鏃堕棿涓猴細{}姣......", System.currentTimeMillis() - startTime);
+
         } catch (Exception e) {
-            log.error("TrafficService.unlockPath", e);
+            log.error("MapService.unlockPath", e);
         }
 
     }
diff --git a/zy-acs-fake/src/main/resources/unlock.py b/zy-acs-fake/src/main/resources/unlock.py
new file mode 100644
index 0000000..33be43f
--- /dev/null
+++ b/zy-acs-fake/src/main/resources/unlock.py
@@ -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))
+
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
index d50cad9..aa8bb1c 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MapService.java
+++ b/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);
         }
 
     }
diff --git a/zy-acs-manager/src/main/resources/agv.py b/zy-acs-manager/src/main/resources/agv.py
index a366634..2634411 100644
--- a/zy-acs-manager/src/main/resources/agv.py
+++ b/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):
+    """
+    浣跨敤骞垮害浼樺厛鎼滅储锛圔FS锛夋潵浠f浛閫掑綊锛屼互閬垮厤閫掑綊娣卞害杩囧ぇ鐨勯棶棰樸��
+    """
     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):
     # 灏嗗瓧绗︿覆瑙f瀽涓洪泦鍚�
-    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 鍔犻�熺殑浠g爜
 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 鍔犻�熺殑浠g爜
-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()
\ No newline at end of file

--
Gitblit v1.9.1