⎿ 最少转弯路径实现计划(基于Roy-T.AStar官方API) 实施策略:严格保护现有算法 阶段一:数据结构扩展 1. 添加路径策略枚举 位置:src/PathPlanning/PathPlanningModels.cs public enum PathStrategy { Shortest = 0, // 默认:标准最短路径(现有行为) Straightest = 1 // 新增:直线优先路径 } 2. 扩展AutoPathFinder方法签名 位置:src/PathPlanning/AutoPathFinder.cs - 新增重载:FindPath(..., PathStrategy strategy = PathStrategy.Shortest) - 保留所有现有方法不变 阶段二:核心算法实现 3. 实现方向感知的网格转换 新增方法:ConvertToAStarGridWithStrategy() private Grid ConvertToAStarGridWithStrategy(GridMap gridMap, Point3D startPos, Point3D endPos, PathStrategy strategy, double objectHeight) { if (strategy == PathStrategy.Shortest) { // 调用现有方法,保证100%兼容 return ConvertToAStarGridWith2_5D(gridMap, channelCoverage, objectHeight); } // 直线优先实现 return ConvertToAStarGridStraightest(gridMap, startPos, endPos, objectHeight); } 4. 直线优先算法核心 基于文档第127行的AddEdge模式: private Grid ConvertToAStarGridStraightest(GridMap gridMap, Point3D start, Point3D end, double objectHeight) { // 1. 计算主方向 double dx = Math.Abs(end.X - start.X); double dy = Math.Abs(end.Y - start.Y); bool preferHorizontal = dx > dy; // 2. 差异化速度设置(基于文档的Velocity.FromKilometersPerHour) var mainDirectionVelocity = Velocity.FromKilometersPerHour(10); // 主方向:低成本 var crossDirectionVelocity = Velocity.FromKilometersPerHour(2); // 次方向:高成本 var diagonalVelocity = Velocity.FromKilometersPerHour(5); // 对角线:中等成本 // 3. 按现有模式创建和断开网格(文档第104-108行) var grid = Grid.CreateGridWithLateralConnections(gridSize, cellSize, mainDirectionVelocity); // 先断开所有连接 for (int x = 0; x < gridMap.Width; x++) { for (int y = 0; y < gridMap.Height; y++) { grid.DisconnectNode(new GridPosition(x, y)); } } // 4. 智能连接:根据方向设置不同速度(文档第115-126行模式) for (int x = 0; x < gridMap.Width; x++) { for (int y = 0; y < gridMap.Height; y++) { if (IsPassableWithHeight(gridMap.Cells[x, y], objectHeight)) { var pos = new GridPosition(x, y); // 水平连接 if (x + 1 < gridMap.Width && IsPassableWithHeight(gridMap.Cells[x + 1, y], objectHeight)) { var rightPos = new GridPosition(x + 1, y); var velocity = preferHorizontal ? mainDirectionVelocity : crossDirectionVelocity; grid.AddEdge(pos, rightPos, velocity); grid.AddEdge(rightPos, pos, velocity); } // 垂直连接 if (y + 1 < gridMap.Height && IsPassableWithHeight(gridMap.Cells[x, y + 1], objectHeight)) { var bottomPos = new GridPosition(x, y + 1); var velocity = preferHorizontal ? crossDirectionVelocity : mainDirectionVelocity; grid.AddEdge(pos, bottomPos, velocity); grid.AddEdge(bottomPos, pos, velocity); } // 对角线连接(可选) if (x + 1 < gridMap.Width && y + 1 < gridMap.Height && IsPassableWithHeight(gridMap.Cells[x + 1, y + 1], objectHeight)) { var diagonalPos = new GridPosition(x + 1, y + 1); grid.AddEdge(pos, diagonalPos, diagonalVelocity); grid.AddEdge(diagonalPos, pos, diagonalVelocity); } } } } return grid; } 阶段三:集成到现有流程 5. 扩展PathPlanningManager调用 位置:src/Core/PathPlanningManager.cs - 在AutoPlanPath方法中添加可选策略参数 - 默认值确保现有调用完全不变 6. 策略路由逻辑 public Task AutoPlanPath(..., PathStrategy strategy = PathStrategy.Shortest) { // 现有逻辑保持不变... // 策略感知的路径查找 pathResult = pathFinder.FindPath(startPoint.Position, endPoint.Position, gridMap, channelCoverage, objectHeight, strategy); } 阶段四:质量保证 7. 兼容性验证 - ✅ 所有现有单元测试必须通过 - ✅ 默认调用行为与当前完全一致 - ✅ 现有UI调用无需任何修改 8. 功能验证 - ✅ 对比两种策略的路径差异 - ✅ 验证直线优先路径确实减少转弯 - ✅ 性能测试确保无显著性能影响 9. 调试支持 基于文档第237行的日志模式: LogManager.Info($"[直线优先] 主方向: {(preferHorizontal ? "水平" : "垂直")}, 起点({start.X:F2},{start.Y:F2}), 终点({end.X:F2},{end.Y:F2})"); LogManager.Info($"[速度设置] 主方向: {mainDirectionVelocity.InKilometersPerHour}km/h, 次方向: {crossDirectionVelocity.InKilometersPerHour}km/h"); 交付成果 1. 零破坏性扩展:现有功能100%保持原样 2. 基于官方API:使用Roy-T.AStar文档化的最佳实践 3. 易于使用:通过可选参数启用新功能 4. 充分测试:确保稳定性和兼容性 5. 详细日志:便于调试和性能分析 测试用例设计 - 现有路径 vs 直线优先路径的转弯次数对比 - 长距离直线路径的优化效果验证 - 复杂地形下的算法鲁棒性测试