1. 局部直线优先路径算法 - 详细描述了算法原理、技术实现和效果对比 2. 路径策略选择系统 - 涵盖了UI界面改进和多策略架构实现 3. 网格可视化系统 - 描述了可视化功能和用户体验改进 4. UI架构现代化 - 包含Idle事件机制和统一状态栏系统 5. 内存管理与性能优化 - 涵盖COM API优化和碰撞算法改进
154 lines
5.9 KiB
Markdown
154 lines
5.9 KiB
Markdown
⎿ 最少转弯路径实现计划(基于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 vehicleHeight)
|
||
{
|
||
if (strategy == PathStrategy.Shortest) {
|
||
// 调用现有方法,保证100%兼容
|
||
return ConvertToAStarGridWith2_5D(gridMap, channelCoverage, vehicleHeight);
|
||
}
|
||
|
||
// 直线优先实现
|
||
return ConvertToAStarGridStraightest(gridMap, startPos, endPos, vehicleHeight);
|
||
}
|
||
|
||
4. 直线优先算法核心
|
||
|
||
基于文档第127行的AddEdge模式:
|
||
private Grid ConvertToAStarGridStraightest(GridMap gridMap, Point3D start, Point3D end, double vehicleHeight)
|
||
{
|
||
// 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], vehicleHeight)) {
|
||
var pos = new GridPosition(x, y);
|
||
|
||
// 水平连接
|
||
if (x + 1 < gridMap.Width && IsPassableWithHeight(gridMap.Cells[x + 1, y], vehicleHeight)) {
|
||
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], vehicleHeight)) {
|
||
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], vehicleHeight)) {
|
||
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<PathRoute> AutoPlanPath(..., PathStrategy strategy = PathStrategy.Shortest)
|
||
{
|
||
// 现有逻辑保持不变...
|
||
|
||
// 策略感知的路径查找
|
||
pathResult = pathFinder.FindPath(startPoint.Position, endPoint.Position, gridMap, channelCoverage, vehicleHeight,
|
||
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 直线优先路径的转弯次数对比
|
||
- 长距离直线路径的优化效果验证
|
||
- 复杂地形下的算法鲁棒性测试
|