diff --git a/src/PathPlanning/AutoPathFinder.cs b/src/PathPlanning/AutoPathFinder.cs index 1a3712f..033026f 100644 --- a/src/PathPlanning/AutoPathFinder.cs +++ b/src/PathPlanning/AutoPathFinder.cs @@ -99,28 +99,20 @@ namespace NavisworksTransport.PathPlanning LogManager.Info($"[2.5D路径规划] A*算法找到原始路径,包含 {pathResult.PathPoints.Count} 个点"); - // 4. 路径优化(临时禁用以避免穿越问题) - // var optimizedPath = OptimizePath(pathResult.PathPoints, gridMap); - var optimizedPath = pathResult.PathPoints; // 直接使用原始A*路径,不进行优化 - LogManager.Info($"[2.5D路径规划] 路径优化已禁用,使用原始A*路径,包含 {optimizedPath.Count} 个点"); - - // 5. 对路径进行高度插值,利用2.5D高度区间信息 - var enhancedPath = InterpolatePathHeights2_5D(optimizedPath, gridMap, vehicleHeight); + // 5. 根据网格点通行高度区间对路径点Z坐标调整 + var enhancedPath = ApplyGridHeightConstraints(pathResult.PathPoints, gridMap, vehicleHeight); // 6. 精确高度修正 var heightCorrectedPath = ApplyPreciseHeightCorrection(enhancedPath, gridMap); - // 7. 直接返回高度校正后的路径(不再修改XY坐标) - var finalPath = heightCorrectedPath; - // 8. 验证路径中所有点的高度约束(特别是门网格) - ValidatePathHeightConstraints(finalPath, gridMap, vehicleHeight); + ValidatePathHeightConstraints(heightCorrectedPath, gridMap, vehicleHeight); // 更新PathFindingResult - pathResult.PathPoints = finalPath; + pathResult.PathPoints = heightCorrectedPath; pathResult.OriginalEndPoint = originalEnd; - LogManager.Info($"[2.5D路径规划] 路径生成完成,最终包含 {finalPath.Count} 个路径点,完成度: {pathResult.CompletionPercentage:F1}%"); + LogManager.Info($"[2.5D路径规划] 路径生成完成,最终包含 {heightCorrectedPath.Count} 个路径点,完成度: {pathResult.CompletionPercentage:F1}%"); // 路径优化 - 去除共线点 pathResult = OptimizePath(pathResult, gridMap); @@ -1232,8 +1224,6 @@ namespace NavisworksTransport.PathPlanning } var cell = gridMap.Cells[gridX, gridY]; - LogManager.Info($"[高度检查] 单元格状态:IsWalkable={cell.IsWalkable}, CellType={cell.CellType}, PassableHeights计数={cell.PassableHeights?.Count ?? 0}"); - // 检查基本可行走性 if (!cell.IsWalkable) { @@ -1244,8 +1234,6 @@ namespace NavisworksTransport.PathPlanning // 检查高度约束 if (cell.PassableHeights != null && cell.PassableHeights.Any()) { - LogManager.Info($"[高度检查] 检查 {cell.PassableHeights.Count} 个高度区间,车辆高度:{vehicleHeight}模型单位)"); - foreach (var interval in cell.PassableHeights) { bool spanOk = interval.GetSpan() >= vehicleHeight; @@ -1256,7 +1244,6 @@ namespace NavisworksTransport.PathPlanning if (spanOk && containsHeight) { - LogManager.Info($"[高度检查] ✅ 找到合适的高度区间,通过检查"); return true; } } @@ -1275,101 +1262,44 @@ namespace NavisworksTransport.PathPlanning } /// - /// 使用2.5D高度区间信息对路径进行高度插值 + /// 根据网格高度区间调整路径点Z坐标 /// /// 原始路径 /// 网格地图 /// 车辆高度(模型单位) - /// 插值后的路径 - private List InterpolatePathHeights2_5D(List path, GridMap gridMap, double vehicleHeight) + /// 调整后的路径 + private List ApplyGridHeightConstraints(List path, GridMap gridMap, double vehicleHeight) { - try + LogManager.Info($"[应用高度区间] 开始调整,路径点数: {path.Count}"); + + var adjustedPath = new List(); + int adjustedCount = 0; + + foreach (var point in path) { - LogManager.Info($"[2.5D高度插值] 开始插值,路径点数: {path.Count}"); - - var interpolatedPath = new List(); - int validHeightPoints = 0; - - for (int i = 0; i < path.Count; i++) - { - var originalPoint = path[i]; - - // 获取最优高度 - var optimalHeight = GetOptimalHeightFromGrid(originalPoint, gridMap, vehicleHeight); - - if (optimalHeight.HasValue) - { - var enhancedPoint = new Point3D(originalPoint.X, originalPoint.Y, optimalHeight.Value); - interpolatedPath.Add(enhancedPoint); - validHeightPoints++; - } - else - { - // 如果无法获取高度信息,使用原始点 - interpolatedPath.Add(originalPoint); - } - } - - LogManager.Info($"[2.5D高度插值] 完成,有效高度点: {validHeightPoints}/{path.Count}"); - return interpolatedPath; - } - catch (Exception ex) - { - LogManager.Error($"[2.5D高度插值] 插值失败: {ex.Message}"); - return path; // 返回原始路径 - } - } - - /// - /// 从网格中获取指定位置的最优高度 - /// - /// 世界坐标点 - /// 网格地图 - /// 车辆高度(模型单位) - /// 最优高度,如果无法确定则返回null - private double? GetOptimalHeightFromGrid(Point3D point, GridMap gridMap, double vehicleHeight) - { - try - { - // 将世界坐标转换为网格坐标 var gridPos = gridMap.WorldToGrid(point); - int gridX = gridPos.X; - int gridY = gridPos.Y; - // 确保坐标在有效范围内 - if (gridX < 0 || gridX >= gridMap.Width || gridY < 0 || gridY >= gridMap.Height) + // 检查网格有效性 + if (!gridMap.IsValidGridPosition(gridPos)) { - return null; + adjustedPath.Add(point); + continue; } - var cell = gridMap.Cells[gridX, gridY]; + var cell = gridMap.Cells[gridPos.X, gridPos.Y]; - // 如果有高度区间信息 - if (cell.PassableHeights != null && cell.PassableHeights.Any()) - { - // 查找满足车辆高度要求的最佳区间 - // vehicleHeight已经是模型单位,直接比较即可 - var validIntervals = cell.PassableHeights - .Where(interval => interval.GetSpan() >= vehicleHeight) - .OrderBy(interval => interval.MinZ) - .ToList(); + var bestInterval = cell.PassableHeights + .Where(interval => interval.GetSpan() >= vehicleHeight) + .OrderBy(interval => interval.MinZ) + .FirstOrDefault(); - if (validIntervals.Any()) - { - // 选择最低的有效区间的底部高度,转换为绝对坐标 - var bestInterval = validIntervals.First(); - return cell.WorldPosition.Z + bestInterval.MinZ; - } - } - - // 如果没有高度信息,返回原始Z坐标 - return point.Z; - } - catch (Exception ex) - { - LogManager.Error($"[最优高度获取] 获取失败: {ex.Message}"); - return point.Z; + var optimalZ = cell.WorldPosition.Z + bestInterval.MinZ; + adjustedPath.Add(new Point3D(point.X, point.Y, optimalZ)); + adjustedCount++; } + + LogManager.Info($"[应用高度区间] 完成,调整了 {adjustedCount}/{path.Count} 个点"); + return adjustedPath; } ///