| | |
| | | package com.zy.acs.manager.core.service; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.zy.acs.framework.common.Cools; |
| | | import com.zy.acs.common.utils.Utils; |
| | | import com.zy.acs.framework.common.Cools; |
| | | import com.zy.acs.manager.common.utils.MapDataUtils; |
| | | import com.zy.acs.manager.core.constant.MapDataConstant; |
| | | import com.zy.acs.manager.core.service.astart.DynamicNodeType; |
| | |
| | | import com.zy.acs.manager.manager.entity.AgvDetail; |
| | | import com.zy.acs.manager.manager.entity.AgvModel; |
| | | import com.zy.acs.manager.manager.entity.Code; |
| | | import com.zy.acs.manager.manager.enums.AgvModelType; |
| | | import com.zy.acs.manager.manager.service.AgvDetailService; |
| | | import com.zy.acs.manager.manager.service.AgvModelService; |
| | | import com.zy.acs.manager.manager.service.AgvService; |
| | |
| | | |
| | | import javax.annotation.PostConstruct; |
| | | import javax.annotation.PreDestroy; |
| | | import java.io.BufferedReader; |
| | | import java.io.IOException; |
| | | import java.io.InputStreamReader; |
| | | import java.util.List; |
| | | import java.util.concurrent.ExecutorService; |
| | | import java.util.concurrent.Executors; |
| | |
| | | return; |
| | | } |
| | | |
| | | String[][] codeMatrix = mapDataDispatcher.getCodeMatrix(lev); |
| | | String[][] waveMatrix = mapDataDispatcher.initWaveMatrix(lev); |
| | | AgvModel agvModel = agvModelService.selectByType(AgvModelType.CTU_BOX_TRANSPORT_AGV.toString()); // can be optimized |
| | | |
| | | // vehicle |
| | | // for (Agv agv : agvService.list(new LambdaQueryWrapper<>())) { |
| | | // AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); |
| | | // AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); |
| | | // Code code = codeService.getById(agvDetail.getRecentCode()); |
| | | // |
| | | // Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModel.getDiameter(), MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR); |
| | | // List<NavigateNode> includeList = mapService.getWaveScopeByCode(lev, code.getData(), avoidDistance); |
| | | // |
| | | // for (NavigateNode navigateNode : includeList) { |
| | | // String waveNode = waveMatrix[navigateNode.getX()][navigateNode.getY()]; |
| | | // waveMatrix[navigateNode.getX()][navigateNode.getY()] = MapDataUtils.generateWaveNode(waveNode, agv.getUuid()); |
| | | // } |
| | | // |
| | | // } |
| | | Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModel.getDiameter(), MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR); |
| | | |
| | | // lock path |
| | | DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(lev); |
| | | for (int i = 0; i < dynamicMatrix.length; i++) { |
| | | for (int j = 0; j < dynamicMatrix[i].length; j++) { |
| | | DynamicNode dynamicNode = dynamicMatrix[i][j]; |
| | | String vehicle = dynamicNode.getVehicle(); |
| | | if (!DynamicNodeType.ACCESS.val.equals(vehicle) && !DynamicNodeType.BLOCK.val.equals(vehicle)) { |
| | | AgvModel agvModel = agvModelService.getById(agvService.selectByUuid(vehicle).getAgvModel()); // can be optimized |
| | | long startTime = System.currentTimeMillis(); |
| | | |
| | | Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModel.getDiameter(), MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR); |
| | | List<NavigateNode> includeList = mapService.getWaveScopeByCode(lev, codeMatrix[i][j], avoidDistance); |
| | | ProcessBuilder processBuilder = new ProcessBuilder("python" |
| | | , "D:\\tmp\\pyagv\\agv4.py" |
| | | , String.valueOf(avoidDistance) |
| | | ); |
| | | processBuilder.redirectErrorStream(true); |
| | | |
| | | for (NavigateNode navigateNode : includeList) { |
| | | String waveNode = waveMatrix[navigateNode.getX()][navigateNode.getY()]; // overlay |
| | | waveMatrix[navigateNode.getX()][navigateNode.getY()] = MapDataUtils.generateWaveNode(waveNode, vehicle); |
| | | } |
| | | try { |
| | | Process process = processBuilder.start(); |
| | | |
| | | // 读取Python脚本的输出 |
| | | BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); |
| | | String line; |
| | | StringBuilder builder = new StringBuilder(); |
| | | while ((line = reader.readLine()) != null) { |
| | | builder.append(line); |
| | | } |
| | | |
| | | // 等待Python脚本执行完成 |
| | | int exitCode = process.waitFor(); |
| | | if (exitCode != 0) { |
| | | System.out.println("Python script exited with error code: " + exitCode); |
| | | 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 (IOException | InterruptedException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | log.error("python finish {}", System.currentTimeMillis() - startTime); |
| | | |
| | | // mapDataDispatcher.printMatrix(waveMatrix); |
| | | mapDataDispatcher.setWaveMatrix(lev, waveMatrix); |
| | | // String[][] codeMatrix = mapDataDispatcher.getCodeMatrix(lev); |
| | | // String[][] waveMatrix = mapDataDispatcher.initWaveMatrix(lev); |
| | | // |
| | | // // lock path |
| | | // DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(lev); |
| | | // for (int i = 0; i < dynamicMatrix.length; i++) { |
| | | // for (int j = 0; j < dynamicMatrix[i].length; j++) { |
| | | // DynamicNode dynamicNode = dynamicMatrix[i][j]; |
| | | // String vehicle = dynamicNode.getVehicle(); |
| | | // if (!DynamicNodeType.ACCESS.val.equals(vehicle) && !DynamicNodeType.BLOCK.val.equals(vehicle)) { |
| | | // AgvModel agvModel = agvModelService.getById(agvService.selectByUuid(vehicle).getAgvModel()); // can be optimized |
| | | // |
| | | // Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModel.getDiameter(), MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR); |
| | | // List<NavigateNode> includeList = mapService.getWaveScopeByCode(lev, codeMatrix[i][j], avoidDistance); |
| | | // |
| | | // for (NavigateNode navigateNode : includeList) { |
| | | // String waveNode = waveMatrix[navigateNode.getX()][navigateNode.getY()]; // overlay |
| | | // waveMatrix[navigateNode.getX()][navigateNode.getY()] = MapDataUtils.generateWaveNode(waveNode, vehicle); |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // |
| | | //// mapDataDispatcher.printMatrix(waveMatrix); |
| | | // mapDataDispatcher.setWaveMatrix(lev, waveMatrix); |
| | | |
| | | } catch (Exception e) { |
| | | |