| | |
| | | import com.algo.model.ExecutingTask; |
| | | import com.algo.model.PathCode; |
| | | import com.algo.model.PlannedPath; |
| | | import com.algo.model.CTUPhysicalConfig; |
| | | import com.algo.util.PathTimeCalculator; |
| | | |
| | | import java.util.*; |
| | | |
| | |
| | | * 碰撞检测器 |
| | | */ |
| | | private final CollisionDetector collisionDetector; |
| | | |
| | | /** |
| | | * 路径时间计算器 |
| | | */ |
| | | private PathTimeCalculator timeCalculator; |
| | | |
| | | /** |
| | | * 构造函数 |
| | |
| | | */ |
| | | public CollisionResolver(CollisionDetector collisionDetector) { |
| | | this.collisionDetector = collisionDetector; |
| | | } |
| | | |
| | | /** |
| | | * 设置时间计算器 |
| | | */ |
| | | public void setTimeCalculator(PathTimeCalculator timeCalculator) { |
| | | this.timeCalculator = timeCalculator; |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | /** |
| | | * 为路径添加延迟 |
| | | * 为路径添加延迟(增强版,正确重计算时间窗) |
| | | * |
| | | * @param path 路径 |
| | | * @param timeStep 延迟开始的时间步 |
| | |
| | | |
| | | // 获取延迟位置的路径代码 |
| | | PathCode delayCode = codeList.get(timeStep); |
| | | |
| | | // 计算延迟时间(每个延迟步骤1秒) |
| | | long delayDuration = delaySteps * 1000L; |
| | | |
| | | // 创建延迟步骤 |
| | | List<PathCode> delaySteps_list = new ArrayList<>(); |
| | |
| | | waitCode.setPosType(delayCode.getPosType()); |
| | | waitCode.setLev(delayCode.getLev()); |
| | | waitCode.setTargetPoint(false); // 等待步骤不是目标点 |
| | | |
| | | // 设置等待步骤的时间信息 |
| | | if (delayCode.getArrivalTime() != null) { |
| | | long waitStartTime = delayCode.getArrivalTime() + (i * 1000L); |
| | | waitCode.setArrivalTime(waitStartTime); |
| | | waitCode.setDepartureTime(waitStartTime + 1000L); |
| | | } |
| | | |
| | | delaySteps_list.add(waitCode); |
| | | } |
| | | |
| | | // 插入延迟步骤 |
| | | codeList.addAll(timeStep, delaySteps_list); |
| | | |
| | | // 更新原路径点的时间(向后推迟) |
| | | if (delayCode.getArrivalTime() != null) { |
| | | delayCode.setArrivalTime(delayCode.getArrivalTime() + delayDuration); |
| | | if (delayCode.getDepartureTime() != null) { |
| | | delayCode.setDepartureTime(delayCode.getDepartureTime() + delayDuration); |
| | | } |
| | | } |
| | | |
| | | // 更新路径 |
| | | path.setCodeList(codeList); |
| | | |
| | | // 🔧 关键修复:重新计算后续路径点的时间窗 |
| | | if (timeCalculator != null) { |
| | | CTUPhysicalConfig defaultConfig = createDefaultPhysicalConfig(); |
| | | timeCalculator.recalculatePathTimingFromIndex(path, timeStep + delaySteps, defaultConfig); |
| | | } else { |
| | | // 备用方案:手动更新后续时间 |
| | | updateSubsequentPathTiming(path, timeStep + delaySteps, delayDuration); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 备用方案:手动更新后续路径点的时间 |
| | | */ |
| | | private void updateSubsequentPathTiming(PlannedPath path, int fromIndex, long timeOffset) { |
| | | List<PathCode> codeList = path.getCodeList(); |
| | | |
| | | for (int i = fromIndex; i < codeList.size(); i++) { |
| | | PathCode pathCode = codeList.get(i); |
| | | |
| | | if (pathCode.getArrivalTime() != null) { |
| | | pathCode.setArrivalTime(pathCode.getArrivalTime() + timeOffset); |
| | | } |
| | | |
| | | if (pathCode.getDepartureTime() != null) { |
| | | pathCode.setDepartureTime(pathCode.getDepartureTime() + timeOffset); |
| | | } |
| | | |
| | | if (pathCode.getCumulativeTime() != null) { |
| | | pathCode.setCumulativeTime(pathCode.getCumulativeTime() + timeOffset); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 创建默认物理配置 |
| | | */ |
| | | private CTUPhysicalConfig createDefaultPhysicalConfig() { |
| | | return new CTUPhysicalConfig(); // 使用默认构造函数 |
| | | } |
| | | |
| | | /** |