| | |
| | | */ |
| | | private List<ExecutingTask> extractAgvTasks(AGVStatus agvStatus) { |
| | | List<ExecutingTask> tasks = new ArrayList<>(); |
| | | |
| | | // 检查AGV是否可用 |
| | | if (!agvStatus.isAvailable()) { |
| | | return tasks; |
| | | } |
| | | |
| | | System.out.println(" [调试] 正在提取 AGV " + agvStatus.getAgvId() + " 的任务"); |
| | | System.out.println(" [调试] isAvailable: " + agvStatus.isAvailable()); |
| | | |
| | | // 分析背篓状态 |
| | | List<BackpackData> backpack = agvStatus.getBackpack(); |
| | | if (backpack == null || backpack.isEmpty()) { |
| | | System.out.println(" [调试] AGV " + agvStatus.getAgvId() + " 背篓为空,跳过"); |
| | | return tasks; |
| | | } |
| | | |
| | | // 检查是否有已装载的任务(即使AGV不可用,如果有已装载任务也需要规划路径) |
| | | boolean hasLoadedTasks = false; |
| | | for (BackpackData bp : backpack) { |
| | | if (bp.isLoaded() && bp.getTaskId() != null && !bp.getTaskId().trim().isEmpty()) { |
| | | hasLoadedTasks = true; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // 如果AGV不可用且没有已装载任务,跳过 |
| | | if (!agvStatus.isAvailable() && !hasLoadedTasks) { |
| | | System.out.println(" [调试] AGV " + agvStatus.getAgvId() + " 不可用且无已装载任务,跳过"); |
| | | return tasks; |
| | | } |
| | | |
| | | // 如果有已装载任务但AGV不可用,记录日志但继续处理 |
| | | if (!agvStatus.isAvailable() && hasLoadedTasks) { |
| | | System.out.println(" [调试] AGV " + agvStatus.getAgvId() + " 不可用但有已装载任务,继续提取任务"); |
| | | } |
| | | |
| | | System.out.println(" [调试] AGV " + agvStatus.getAgvId() + " 背篓数量: " + backpack.size()); |
| | | |
| | | // 分别收集已装载和未装载的任务 |
| | | List<BackpackData> loadedTasks = new ArrayList<>(); |
| | |
| | | |
| | | for (BackpackData bp : backpack) { |
| | | if (bp.getTaskId() != null && !bp.getTaskId().trim().isEmpty()) { |
| | | System.out.println(" [调试] 发现背篓任务: taskId=" + bp.getTaskId() + |
| | | ", loaded=" + bp.isLoaded() + ", index=" + bp.getIndex()); |
| | | |
| | | TaskData taskData = getTaskData(bp.getTaskId()); |
| | | if (taskData != null) { |
| | | System.out.println(" [调试] 成功获取TaskData: " + taskData); |
| | | if (bp.isLoaded()) { |
| | | loadedTasks.add(bp); |
| | | } else { |
| | | unloadedTasks.add(bp); |
| | | } |
| | | } else { |
| | | System.out.println(" [调试] 警告:taskId=" + bp.getTaskId() + |
| | | " 在taskDataMap中未找到!"); |
| | | System.out.println(" [调试] taskDataMap包含的key: " + taskDataMap.keySet()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | System.out.println(" [调试] AGV " + agvStatus.getAgvId() + |
| | | " - 已装载任务: " + loadedTasks.size() + |
| | | ", 未装载任务: " + unloadedTasks.size()); |
| | | |
| | | // 确定下一步最优行动 |
| | | ExecutingTask nextTask = determineNextBestAction(agvStatus, loadedTasks, unloadedTasks); |
| | | if (nextTask != null) { |
| | | System.out.println(" [调试] AGV " + agvStatus.getAgvId() + |
| | | " 生成任务: " + nextTask.getTaskType() + |
| | | " " + nextTask.getCurrentPosition() + " -> " + nextTask.getTargetPosition()); |
| | | tasks.add(nextTask); |
| | | } else { |
| | | System.out.println(" [调试] AGV " + agvStatus.getAgvId() + |
| | | " determineNextBestAction返回null"); |
| | | } |
| | | |
| | | return tasks; |
| | |
| | | List<BackpackData> loadedTasks, |
| | | List<BackpackData> unloadedTasks) { |
| | | String currentPosition = agvStatus.getPosition(); |
| | | System.out.println(" [调试] determineNextBestAction - AGV " + agvStatus.getAgvId() + |
| | | " 当前位置: " + currentPosition); |
| | | |
| | | List<TaskOption> taskOptions = new ArrayList<>(); |
| | | |
| | | // 1. 收集所有可选的送货任务 |
| | | System.out.println(" [调试] 处理已装载任务数量: " + loadedTasks.size()); |
| | | for (BackpackData task : loadedTasks) { |
| | | TaskData taskData = getTaskData(task.getTaskId()); |
| | | if (taskData != null && taskData.getEnd() != null) { |
| | | System.out.println(" [调试] 计算送货距离: " + currentPosition + " -> " + taskData.getEnd()); |
| | | double distance = calculateDistance(currentPosition, taskData.getEnd()); |
| | | System.out.println(" [调试] 距离计算结果: " + distance); |
| | | |
| | | if (distance >= 0) { |
| | | double cost = calculateTaskCost(distance, "delivery", taskData.getPriority(), agvStatus); |
| | | taskOptions.add(new TaskOption(task, true, distance, cost, "delivery")); |
| | | System.out.println(" [调试] 添加送货选项,成本: " + cost); |
| | | } else { |
| | | System.out.println(" [调试] 警告:距离为负,跳过此送货任务"); |
| | | } |
| | | } else { |
| | | System.out.println(" [调试] 警告:TaskData或end为null,跳过"); |
| | | } |
| | | } |
| | | |
| | | // 2. 收集所有可选的取货任务 |
| | | System.out.println(" [调试] 处理未装载任务数量: " + unloadedTasks.size()); |
| | | for (BackpackData task : unloadedTasks) { |
| | | TaskData taskData = getTaskData(task.getTaskId()); |
| | | if (taskData != null && taskData.getStart() != null) { |
| | | System.out.println(" [调试] 计算取货距离: " + currentPosition + " -> " + taskData.getStart()); |
| | | double distance = calculateDistance(currentPosition, taskData.getStart()); |
| | | System.out.println(" [调试] 距离计算结果: " + distance); |
| | | |
| | | if (distance >= 0) { |
| | | double cost = calculateTaskCost(distance, "pickup", taskData.getPriority(), agvStatus); |
| | | taskOptions.add(new TaskOption(task, false, distance, cost, "pickup")); |
| | | System.out.println(" [调试] 添加取货选项,成本: " + cost); |
| | | } else { |
| | | System.out.println(" [调试] 警告:距离为负,跳过此取货任务"); |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | // 4. 选择成本最低的任务 |
| | | System.out.println(" [调试] 总任务选项数量: " + taskOptions.size()); |
| | | if (taskOptions.isEmpty()) { |
| | | System.out.println(" [调试] 警告:没有可选任务,返回null"); |
| | | return null; |
| | | } |
| | | |
| | |
| | | */ |
| | | private double calculateDistance(String pos1, String pos2) { |
| | | if (pos1 == null || pos2 == null) { |
| | | System.out.println(" [调试] 警告:位置为null: pos1=" + pos1 + ", pos2=" + pos2); |
| | | return -1; |
| | | } |
| | | |
| | | // 如果位置相同,返回0 |
| | | if (pos1.equals(pos2)) { |
| | | System.out.println(" [调试] 位置相同,返回距离0"); |
| | | return 0; |
| | | } |
| | | |
| | | int[] coord1 = JsonUtils.getCoordinate(pos1, pathMapping); |
| | | int[] coord2 = JsonUtils.getCoordinate(pos2, pathMapping); |
| | | |
| | | if (coord1 == null || coord2 == null) { |
| | | System.out.println(" [调试] 警告:坐标查找失败!"); |
| | | System.out.println(" pos1=" + pos1 + " -> coord1=" + |
| | | (coord1 != null ? "[" + coord1[0] + "," + coord1[1] + "]" : "null")); |
| | | System.out.println(" pos2=" + pos2 + " -> coord2=" + |
| | | (coord2 != null ? "[" + coord2[0] + "," + coord2[1] + "]" : "null")); |
| | | System.out.println(" pathMapping包含pos1? " + pathMapping.containsKey(pos1)); |
| | | System.out.println(" pathMapping包含pos2? " + pathMapping.containsKey(pos2)); |
| | | return -1; |
| | | } |
| | | |
| | | return JsonUtils.calculateManhattanDistance(coord1, coord2); |
| | | double distance = JsonUtils.calculateManhattanDistance(coord1, coord2); |
| | | System.out.println(" [调试] 曼哈顿距离: " + distance + " (" + pos1 + " -> " + pos2 + ")"); |
| | | return distance; |
| | | } |
| | | |
| | | /** |