From 6362b52c7c6233af81ea773c4910024c60cd864b Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期一, 16 十二月 2024 15:05:08 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/resources/agv.py | 135 +++++++++++++++++--------- zy-acs-manager/src/main/resources/agv1.py | 160 ++++++++++++++++++++++++++++++++ 2 files changed, 247 insertions(+), 48 deletions(-) diff --git a/zy-acs-manager/src/main/resources/agv.py b/zy-acs-manager/src/main/resources/agv.py index 1b2669a..2425f67 100644 --- a/zy-acs-manager/src/main/resources/agv.py +++ b/zy-acs-manager/src/main/resources/agv.py @@ -1,19 +1,14 @@ import ast import sys - import numpy as np import json import time import redis radiusLen = None - -#with open("./codeMatrix.txt", "r") as file: -# codeMatrix = np.array(json.loads(file.read())) - -#with open("./cdaMatrix.txt", "r") as file: -# data = json.loads(file.read()) -# cdaMatrix = np.array(data) +codeMatrix = None # 鍏ㄥ眬鍙橀噺 +cdaMatrix = None # 鍏ㄥ眬鍙橀噺 +waveMatrix = None # 鍏ㄥ眬鍙橀噺 # 灏嗗瓧绗︿覆杞崲涓烘诞鐐瑰瀷鏁扮粍 def convert_to_float_array(str_array): @@ -64,6 +59,7 @@ return list(zip(indices[0], indices[1])) def initWaveMatrix(): + global codeMatrix, waveMatrix # 澹版槑浣跨敤鍏ㄥ眬鍙橀噺 lev = 1 waveMatrix = np.empty_like(codeMatrix, dtype=object) @@ -79,7 +75,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) # 杩斿洖搴忓垪鍖栧悗鐨勫瓧绗︿覆 @@ -96,6 +95,7 @@ # 浣跨敤 numpy 鍔犻�熺殑浠g爜 def process_dynamic_matrix(dynamicMatrix, codeMatrix): + global waveMatrix # 澹版槑浣跨敤鍏ㄥ眬鍙橀噺 # 灏� dynamicMatrix 杞崲涓虹粨鏋勫寲鏁扮粍 dynamicMatrix = convert_to_structured_array(dynamicMatrix) @@ -111,59 +111,98 @@ # 閬嶅巻婊¤冻鏉′欢鐨勫潗鏍� 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(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 # 澹版槑浣跨敤鍏ㄥ眬鍙橀噺 -codeMatrixPath = sys.argv[2] -cdaMatrixPath = sys.argv[3] + if len(sys.argv) != 6: + print("鐢ㄦ硶: python agv.py <radiusLen> <redisHost> <redisPwd> <redisPort> <redisIdx>") + sys.exit(1) -redisHost = sys.argv[4] -redisPwd = sys.argv[5] -redisPort = sys.argv[6] -redisIdx = sys.argv[7] + radiusLenStr = sys.argv[1] + try: + radiusLen = float(radiusLenStr) + except ValueError: + print("radiusLen 蹇呴』鏄竴涓诞鐐规暟") + sys.exit(1) -with open(codeMatrixPath, "r") as file: - codeMatrix = np.array(json.loads(file.read())) + redisHost = sys.argv[2] + redisPwd = sys.argv[3] + redisPort = sys.argv[4] + redisIdx = sys.argv[5] -with open(cdaMatrixPath, "r") as file: - data = json.loads(file.read()) - cdaMatrix = np.array(data) + startTime = time.perf_counter() -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) -waveMatrix = initWaveMatrix() + 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) -# 鍒涘缓涓�涓繛鎺ユ睜 -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') + 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) -dynamicMatrix = np.array(json.loads(dynamicMatrixStr)) -# # 浣跨敤 numpy 鍔犻�熺殑浠g爜 -process_dynamic_matrix(dynamicMatrix, codeMatrix) + 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) -# 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 + try: + waveMatrix = initWaveMatrix() + except Exception as e: + print(f"鍒濆鍖� waveMatrix 澶辫触: {e}") + sys.exit(1) -# 灏� numpy.ndarray 杞崲涓哄祵濂楀垪琛� -waveMatrixList = waveMatrix.tolist() -# 灏嗗祵濂楀垪琛ㄨ浆鎹负 JSON 瀛楃涓� -waveMatrixJsonStr = json.dumps(waveMatrixList) + # 澶勭悊 dynamicMatrix + try: + process_dynamic_matrix(dynamicMatrix, codeMatrix) + except Exception as e: + print(f"澶勭悊 dynamicMatrix 澶辫触: {e}") + sys.exit(1) -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") + 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() diff --git a/zy-acs-manager/src/main/resources/agv1.py b/zy-acs-manager/src/main/resources/agv1.py new file mode 100644 index 0000000..b58567c --- /dev/null +++ b/zy-acs-manager/src/main/resources/agv1.py @@ -0,0 +1,160 @@ +import ast +import sys + +import numpy as np +import json +import time +import redis + +radiusLen = 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(): + 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): + # 灏嗗瓧绗︿覆瑙f瀽涓洪泦鍚� + set_data = set(ast.literal_eval(originWave)) + # 濡傛灉 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 鍔犻�熺殑浠g爜 +def process_dynamic_matrix(dynamicMatrix, codeMatrix): + # 灏� 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) + 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) + +radiusLenStr = sys.argv[1] +radiusLen = float(radiusLenStr) + +redisHost = sys.argv[2] +redisPwd = sys.argv[3] +redisPort = sys.argv[4] +redisIdx = sys.argv[5] + +startTime = time.perf_counter() + +waveMatrix = initWaveMatrix() + +# 鍒涘缓涓�涓繛鎺ユ睜 +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)) + +cdaMatrixStr = r.get('KV.AGV_MAP_ASTAR_CDA_FLAG.1') +cdaMatrix = np.array(json.loads(cdaMatrixStr)) + +dynamicMatrixStr = r.get('KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1') +dynamicMatrix = np.array(json.loads(dynamicMatrixStr)) + +# # 浣跨敤 numpy 鍔犻�熺殑浠g爜 +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) + +r.set("KV.AGV_MAP_ASTAR_WAVE_FLAG.1",waveMatrixJsonStr) + +end = time.perf_counter() +# print('绋嬪簭杩愯鏃堕棿涓�: %s Seconds' % (end - startTime)) +print("1") + -- Gitblit v1.9.1