From 476e87c75f6b6501f0f0bcb0de55e0a7d0afb5d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E8=96=84=E4=BA=91?= Date: Tue, 28 Jul 2026 16:07:49 +0800 Subject: [PATCH] docs: design path smoothing comparison --- ...-07-28-path-smoothing-comparison-design.md | 673 ++++++++++++++++++ 1 file changed, 673 insertions(+) create mode 100644 docs/superpowers/specs/2026-07-28-path-smoothing-comparison-design.md diff --git a/docs/superpowers/specs/2026-07-28-path-smoothing-comparison-design.md b/docs/superpowers/specs/2026-07-28-path-smoothing-comparison-design.md new file mode 100644 index 0000000..53c292d --- /dev/null +++ b/docs/superpowers/specs/2026-07-28-path-smoothing-comparison-design.md @@ -0,0 +1,673 @@ +# 粗路径平滑算法对比实验台设计 + +## 1. 背景 + +`ParkrobTrajplanner/CoarsePath` 已经通过 `CoarsePathPlanningService` 输出经过连续车体碰撞、曲率、终点和方向分段复核的 Hybrid A* 粗路径。成功的 `PlanningResult` 包含: + +- 稠密的 `CoarsePathPoint`; +- 覆盖整条路径的前进/倒车 `PathSegment`; +- 累计弧长、车辆曲率、保守车体净空和换向标记; +- 地图、搜索和最终复核诊断。 + +粗路径由离散恒曲率运动原语拼接而成。它解决绕障拓扑、行驶方向和换向结构,但相邻原语之间的曲率可能跳变,不适合作为后续 SQP 的最终空间参考线。 + +本设计在 `CoarsePath` 之后增加独立的 `PathSmoothing` 模块。第一阶段先建设离线算法对比实验台,使用相同粗路径并行比较三次 B 样条、局部三次 Bézier 和分段五次多项式。实验台统一执行几何分析、安全复核、指标排序和 IEEE 风格绘图。算法成熟后,正式规划流程只调用选定的默认平滑方法。 + +## 2. 目标 + +本阶段必须完成: + +1. 定义稳定的粗路径平滑输入、输出、状态、配置和诊断契约。 +2. 保持粗路径已经确定的绕障侧、前进/倒车顺序、换向次数和目标进入方向。 +3. 使用三种互相独立的平滑方法处理同一条粗路径。 +4. 用统一的几何分析器计算原粗路径和三种平滑路径的弧长、航向与曲率。 +5. 对所有平滑候选重新执行完整车体碰撞、地图边界、最大车辆曲率、端点和方向分段复核。 +6. 支持现有粗路径端到端案例和不重复运行 Hybrid A* 的快速粗路径夹具。 +7. 为每个场景输出 IEEE 风格的四路径对比图、四曲率对比图和指标表。 +8. 输出可供后续 SQP 使用的不可变平滑空间路径,不包含速度和时间参数。 + +## 3. 非目标 + +本阶段不包含: + +- SQP、QP、Frenet 横向优化或速度规划; +- 时间戳、速度、加速度、角速度或 jerk; +- 改变 Hybrid A* 选定的绕障拓扑; +- 新增、删除或移动换向点; +- 现场实时重规划; +- 四舵轮角度、轮速和底盘跟踪控制; +- 把不可行平滑候选作为可执行路径发布; +- 用单一五次多项式覆盖任意长度的完整路径。 + +## 4. 总体架构 + +新增与 `CoarsePath` 平级的目录: + +```text +ClumsyPilot/ParkrobTrajplanner/ +├── CoarsePath/ +└── PathSmoothing/ + ├── Contracts/ + ├── Processing/ + ├── Algorithms/ + ├── Validation/ + ├── Comparison/ + ├── Visualization/ + ├── Facade/ + └── Test/ +``` + +各目录职责如下: + +| 目录 | 职责 | +| --- | --- | +| `Contracts` | 平滑请求、结果、点、方向段、配置、状态、指标和诊断 | +| `Processing` | 输入校验、按方向拆段、等弧长重采样、关键点保护和统一几何分析 | +| `Algorithms` | 三次 B 样条、局部三次 Bézier、分段五次多项式及内部算法契约 | +| `Validation` | 完整车体碰撞、地图边界、曲率、端点、换向和输出不变量复核 | +| `Comparison` | 同输入多算法运行、结果隔离、指标汇总、排序和推荐 | +| `Visualization` | 图形场景模型、IEEE 样式、SVG/PNG/CSV 导出和字体检查 | +| `Facade` | 正式单算法平滑入口和离线多算法比较入口 | +| `Test` | 固定夹具、端到端案例和报告生成入口 | + +`PathSmoothing` 只消费 `CoarsePath` 和 `Map` 的公开不可变数据,不读取传感器、定位、UI 或底盘。它不得修改已有 `PlanningResult`。 + +## 5. 数据流 + +```text +PlanningResult.Path + PlanningResult.Segments +PlanningGridMap + VehicleParameters + PathSmoothingConfiguration + │ + ▼ + 输入契约和原粗路径安全复核 + │ + ▼ + 按 Forward/Reverse 独立拆段 + │ + ▼ + 等弧长重采样、固定端点和换向点 + │ + ┌───────────┼───────────┐ + ▼ ▼ ▼ + 三次 B 样条 局部 Bézier 分段五次多项式 + │ │ │ + └───────────┼───────────┘ + ▼ + 统一航向、弧长和曲率分析 + │ + ▼ + 车体碰撞、边界、曲率、端点和分段复核 + │ + ▼ + 指标汇总、方法排序和 IEEE 风格报告 +``` + +三种方法不能串联。每种方法从同一份预处理输入开始,失败状态和重试次数分别记录。 + +## 6. 公共接口 + +### 6.1 正式单算法入口 + +```csharp +public sealed class PathSmoothingService +{ + public PathSmoothingResult Smooth( + PathSmoothingRequest request, + CancellationToken cancellationToken = default); +} +``` + +`PathSmoothingRequest` 包含: + +```text +CoarsePath IReadOnlyList +Segments IReadOnlyList +Map PlanningGridMap +Vehicle VehicleParameters +Configuration PathSmoothingConfiguration +``` + +调用方可以从成功的 `PlanningResult.Path` 和 `PlanningResult.Segments` 直接构造请求。请求仍需携带规划时使用的地图和车辆参数,因为平滑路径必须独立进行安全复核。 + +### 6.2 离线比较入口 + +```csharp +public sealed class PathSmoothingComparisonService +{ + public PathSmoothingComparisonResult Compare( + PathSmoothingComparisonRequest request, + CancellationToken cancellationToken = default); +} +``` + +比较请求复用同一份粗路径、地图、车辆和公共配置,并明确列出需要运行的方法。第一版默认方法集合固定为: + +```text +CubicBSpline +LocalCubicBezier +PiecewiseQuintic +``` + +比较服务不绘图。报告导出器只消费不可变比较结果,因此绘图失败不会改变算法状态或平滑路径。 + +## 7. 核心契约 + +### 7.1 平滑方法 + +```text +SmoothingMethod: + CubicBSpline + LocalCubicBezier + PiecewiseQuintic +``` + +### 7.2 平滑状态 + +```text +PathSmoothingStatus: + Success + FallbackToCoarsePath + InvalidInput + Infeasible + Failed + Cancelled +``` + +- `Success`:平滑路径通过所有复核。 +- `FallbackToCoarsePath`:所有允许的平滑尝试失败,且原粗路径重新通过安全复核后,按显式配置返回原路径。 +- `InvalidInput`:输入路径、方向段、地图、车辆或配置不符合契约。 +- `Infeasible`:算法产生了有限数值候选,但候选未通过安全或运动学复核。 +- `Failed`:算法发生数值退化或无法产生完整候选。 +- `Cancelled`:调用被取消,不能发布部分路径。 + +除 `Success` 和 `FallbackToCoarsePath` 外,正式 `PathSmoothingResult.Path` 和 `Segments` 必须为空。 + +### 7.3 平滑路径点 + +`SmoothedPathPoint` 是不可变值,包含: + +```text +X、Y 世界坐标,m +Heading 归一化车头航向,rad +UnwrappedHeading 连续展开车头航向,rad +ArcLength 从完整路径起点累计的非负弧长,m +Direction Forward 或 Reverse +GeometricCurvature 按行进弧长计算的有符号几何曲率,1/m +VehicleCurvature 车辆模型使用的有符号曲率,1/m +BodyClearance 扩大车体的保守净空下界,m +IsGearSwitchPoint 是否为新方向段开始的换向点 +Source Anchor、Interpolated、GearSwitch 或 CoarsePathFallback +``` + +回退原粗路径时 `Source` 使用单独的 `CoarsePathFallback`,避免把未经平滑的普通粗路径点错误标记为算法插值点。 + +设 `directionSign` 在前进时为 `+1`,倒车时为 `-1`。每个方向段内部采用: + +```text +GeometricCurvature = d(Heading) / ds +VehicleCurvature = directionSign × GeometricCurvature +``` + +曲率不得跨合法换向重复点求导。 + +### 7.4 平滑方向段 + +平滑后点数与粗路径不同,不能直接复用原 `PathSegment` 索引。`SmoothedPathSegment` 包含: + +```text +SegmentIndex +Direction +StartIndex +EndIndex +StartsAtGearSwitch +EndsAtGearSwitch +``` + +其索引必须连续、无重叠并完整覆盖平滑路径。 + +### 7.5 平滑配置 + +公共配置至少包含: + +```text +Method +OutputSpacingMeters 默认 0.05 +MaximumCollisionCheckStepMeters 默认 0.025 +MinimumClearanceReserveMeters +AllowFallbackToCoarsePath +SmoothingStrength +RetryStrengthScales +``` + +`RetryStrengthScales` 是有限、严格递减的只读集合。第一版建议为: + +```text +1.00, 0.75, 0.50, 0.25 +``` + +每种算法拥有独立的强类型子配置,不能用无语义的字符串字典传参。 + +`MaximumCollisionCheckStepMeters` 默认值为当前粗路径默认安全精度 `0.025 m`。若上游粗规划采用了更小的检查步长,调用方必须传入相同或更小的值;平滑模块不能从未携带的粗规划配置中猜测该参数。 + +## 8. 公共预处理 + +### 8.1 输入校验 + +处理前必须验证: + +- 粗路径和方向段均非空; +- 所有数值有限; +- 弧长非负且不递减; +- 唯一允许的相邻重复位姿是合法换向对; +- 方向段完整覆盖粗路径; +- 换向点的位置、航向和弧长保持成对一致; +- 地图可用于规划; +- 车辆尺寸、安全余量和最大曲率有效; +- 原粗路径在当前地图和车辆参数下仍然安全。 + +原粗路径复核失败时不得执行平滑,也不得回退。 + +### 8.2 方向拆分 + +每个 `PathSegment` 独立处理。方向段首尾点全部是强制锚点。换向两侧的重复位姿分别属于相邻方向段,两个点都必须保留。 + +### 8.3 重采样 + +所有方向段先转换为统一的等弧长采样。默认间距为 `0.05 m`,最后一个不足整步的区间保留精确段尾。 + +重采样不能跨换向点,不能改变段首、段尾的位置和车头航向。 + +### 8.4 安全移动范围 + +预处理器根据原路径的保守车体净空和 `MinimumClearanceReserveMeters` 计算每个样点允许的最大移动范围。该范围只用于减少平滑曲线切弯进入障碍物的概率,不构成安全证明。最终安全性只能由完整车体碰撞和扫掠复核确认。 + +## 9. 三种平滑方法 + +### 9.1 三次 B 样条 + +每个方向段使用夹持三次 B 样条近似: + +- 固定段首和段尾位置; +- 使用行进方向切向约束段首和段尾; +- 不把换向两侧合并成一条曲线; +- 通过平滑强度控制控制点对原粗路径的贴合程度; +- 输出后统一按弧长重采样。 + +该方法是普通长路径段的主要候选,优点是整体连续、控制点数量适中;风险是绕障拐角处可能切弯。 + +### 9.2 局部三次 Bézier + +先从统一重采样路径中识别超过配置航向变化阈值的局部转折区域,再使用三次 Bézier 替换该区域: + +- 区域外路径保持不变; +- 每个局部连接固定入口和出口位置; +- 控制柄沿入口和出口切向; +- 相邻局部区域重叠时先合并,避免重复处理; +- 直线和微小转折不创建无意义 Bézier 段。 + +该方法计算最快且局部可控,但只能保证所设计连接阶次内的连续性,整体曲率质量需要通过统一指标判断。 + +### 9.3 分段五次多项式 + +五次方法采用分段二维 Hermite 形式,而不是用单条五次多项式拟合完整方向段: + +- 每个子段约束首尾位置; +- 首尾一阶导数由行进切向确定; +- 首尾二阶导数由相邻曲率估计并进行连续化; +- 共享内部结点的一阶和二阶导数保持一致; +- 固定完整方向段的首尾位置、航向和曲率约束。 + +该方法追求二阶连续,适合终端连接和曲率连续性要求较高的参考线,但参数敏感且更容易在短段上数值退化。 + +## 10. 几何分析 + +原粗路径、三种候选和平滑回退路径全部通过同一个 `PathGeometryAnalyzer`。分析器逐方向段计算,禁止跨换向点差分。 + +分析器负责: + +1. 按位置重新计算累计弧长; +2. 根据行进切向和方向恢复车头航向; +3. 连续展开航向; +4. 计算几何曲率和车辆曲率; +5. 计算曲率总变化和曲率变化能量; +6. 生成完整路径和方向段索引。 + +原 `CoarsePathPoint.VehicleCurvature` 仍保留为粗规划诊断,但算法比较不直接拿它与重新计算的平滑曲率混用。 + +## 11. 平滑安全复核 + +`SmoothedPathValidator` 必须独立复核: + +- 所有点和派生数值有限; +- 起点、终点位置和车头航向与粗路径对应端点一致; +- 每个换向点的位置和车头航向不变; +- 前进/倒车段数量、顺序和边界拓扑不变; +- 累计弧长严格增加,合法换向重复点除外; +- `abs(VehicleCurvature)` 不超过车辆最大曲率; +- 每个点的扩大车体无碰撞且位于地图内; +- 相邻点之间的完整车体扫掠无碰撞; +- 发布的 `BodyClearance` 不高于复核得到的保守净空; +- 平滑方向段完整覆盖输出。 + +验证器复用现有车辆足迹和碰撞语义,不能引入另一套障碍膨胀规则。 + +## 12. 有限安全回退 + +每种方法先按 `SmoothingStrength` 运行。候选不通过复核时,依次使用 `RetryStrengthScales` 降低平滑强度。 + +```text +默认强度 + ↓ 不可行 +0.75 倍 + ↓ 不可行 +0.50 倍 + ↓ 不可行 +0.25 倍 + ↓ 不可行 +该方法标记 Infeasible +``` + +重试次数、采用强度和每次失败原因必须进入诊断。达到有限次数后必须停止,不能无限调参。 + +正式单算法服务只有在 `AllowFallbackToCoarsePath = true` 且原粗路径重新通过完整安全复核时,才能返回 `FallbackToCoarsePath`。比较实验中的方法失败不能被回退结果伪装成该方法成功。 + +## 13. 质量指标 + +每条原始或平滑路径都计算: + +```text +Feasible +PathLengthMeters +MaximumAbsoluteVehicleCurvaturePerMeter +RootMeanSquareVehicleCurvaturePerMeter +TotalAbsoluteCurvatureVariationPerMeter +CurvatureVariationEnergy +MinimumBodyClearanceMeters +ComputationElapsed +RetryCount +AcceptedStrength +``` + +曲率变化指标逐方向段计算后累加,不跨换向点产生虚假的曲率跳变。 + +每个平滑结果还报告相对于原粗路径的: + +```text +LengthChangePercent +PeakCurvatureChangePercent +CurvatureVariationChangePercent +MinimumClearanceChangeMeters +``` + +任何分母接近零的相对指标必须使用明确定义的绝对值替代,不能产生 NaN 或无穷值。 + +## 14. 方法排序 + +方法选择采用可解释的字典序,不使用隐藏的加权总分。对全部必选场景按以下聚合值依次比较: + +1. 安全可行场景数量更多; +2. 曲率变化能量的场景中位数更低; +3. 各场景最大曲率利用率中的最坏值更低; +4. 各场景最小净空损失中的最坏值更小; +5. 路径长度增量的场景中位数更小; +6. 计算耗时的场景中位数更短。 + +完全相同时使用稳定的方法枚举顺序打破平局,并在报告中显示所有原始指标。若没有方法通过必选场景,比较结果不推荐默认方法。 + +## 15. 场景体系 + +### 15.1 端到端场景 + +端到端组使用现有 `CoarsePathScenarioFactory` 的固定基准入口,不读取实时 AMR: + +| 场景 | 用途 | +| --- | --- | +| `ExplicitEmpty` | 直线不应被无意义扭曲 | +| `RectangleDetour` | 验证绕障转折和平滑切弯 | +| `ManualAndTwoLeg` | 验证多来源障碍和复杂路径 | +| `ReverseGearSwitch` | 验证方向分段和换向点保护 | + +`CacheHit` 不增加新的平滑几何,不进入算法比较。`NoFeasiblePath` 没有成功粗路径,只保留为上游粗路径测试。 + +### 15.2 快速粗路径夹具 + +快速夹具覆盖: + +```text +straight +single-turn +s-bend +large-heading-change +rectangle-detour +multi-obstacle-detour +narrow-corridor +forward-reverse-switch +``` + +每个夹具保存: + +- 稳定的英文场景 ID 和版本; +- 对应的固定地图重建信息; +- 车辆参数; +- 粗路径点和方向段; +- 生成该路径时的粗规划配置指纹; +- 期望的起终点、方向段数和换向点数。 + +快速实验重建地图但不调用 `HybridAStarPlanner`。夹具指纹与当前预期不一致时返回“夹具已过期”,不能静默继续,也不能在普通测试中自动覆盖夹具。 + +夹具更新必须通过显式开发入口完成,并在更新后运行端到端复核。 + +## 16. 比较报告 + +### 16.1 四条曲线 + +正常场景同时比较: + +1. 原始粗路径; +2. 三次 B 样条; +3. 局部三次 Bézier; +4. 分段五次多项式。 + +路径图和曲率图使用相同的四方法顺序。某种方法产生完整但不可行的候选时,实验报告可以绘制其候选并在违规位置标记叉号,同时明确标注“不可行”。该候选只能存在于比较报告的只读调试数据中,不能进入正式 `PathSmoothingResult.Path`。 + +数值失败且没有完整候选时,保留图例和指标行,显示“无有效曲线”,不得伪造曲线。 + +### 16.2 IEEE 风格版式 + +每个场景输出一张双栏宽度图: + +```text +物理尺寸:7.16 × 5.2 in +PNG:2148 × 1560 px +分辨率:300 dpi +``` + +布局: + +```text +┌─────────────────────┬───────────────┐ +│ (a) 四条路径对比 │ (b) 四条曲率 │ +│ 地图、障碍物、起终点 │ κ(s) 与限制线 │ +│ ├───────────────┤ +│ │ (c) 指标表 │ +└─────────────────────┴───────────────┘ +``` + +- 路径面板约占宽度的 60%; +- 路径面板强制 X/Y 等比例; +- 曲率横轴使用各路径自身的累计弧长 `s (m)`; +- 曲率面板显示车辆最大正、负曲率限制; +- 不放大标题,只使用紧凑的 `(a)`、`(b)`、`(c)`; +- 路径面板不使用背景网格; +- 曲率面板只保留零线、必要刻度和曲率限制线; +- 指标表小数点对齐,失败项显示状态而非虚构数值; +- 图例在所有场景中位置、顺序、颜色和线型一致。 + +IEEE 官方图形指南建议使用颜色和线型共同编码、保持字体和字号一致,并优先使用高分辨率或矢量图: + +- https://conferences.ieeeauthorcenter.ieee.org/write-your-paper/improve-your-graphics/ +- https://journals.ieeeauthorcenter.ieee.org/create-your-ieee-journal-article/create-graphics-for-your-article/resolution-and-size/ + +### 16.3 固定色卡 + +采用色盲友好的科学绘图色卡: + +| 内容 | 颜色 | 线型 | +| --- | --- | --- | +| 原始粗路径 | `#4D4D4D` 深灰 | 虚线 | +| 三次 B 样条 | `#0072B2` 深蓝 | 实线 | +| 局部三次 Bézier | `#D55E00` 朱红 | 点划线 | +| 分段五次多项式 | `#009E73` 蓝绿色 | 点线 | +| 曲率上下限 | `#CC79A7` 紫红 | 细虚线 | +| 障碍物 | `#D9D9D9` 填充、`#666666` 描边 | 实线 | + +起点使用带黑色边框的黄色圆形,终点使用带黑色边框的紫色菱形。图中不使用渐变、阴影或依赖透明度才能辨认的叠色。 + +### 16.4 字体、字号和防乱码 + +用户指定: + +```text +中文:SimSun(宋体) +英文、数字、希腊字母和公式:Times New Roman +``` + +绘图实现必须: + +1. 在导出前按准确字体族名检查两种字体; +2. 将混合文本按中文和非中文字符片段拆分; +3. 使用字体度量统一片段基线; +4. 使用同一排版模型生成 SVG 和 PNG; +5. 字体缺失时返回明确的 `FontUnavailable` 导出失败,不能静默替换; +6. SVG 使用 UTF-8 XML; +7. CSV 使用带 BOM 的 UTF-8; +8. PNG 写入并验证对应 300 dpi 的物理分辨率元数据; +9. 使用稳定英文文件名,中文只出现在图内和 CSV 内容中。 + +最终物理尺寸下建议: + +```text +坐标刻度:8 pt +坐标标题、图例和表格正文:9 pt +分图编号:10 pt +``` + +英文 Times New Roman 属于 IEEE 推荐字体。由于宋体不是 IEEE 通用英文字体清单的一部分,它只用于满足本项目中文图注需求;英文、数字和数学字符仍使用 Times New Roman。 + +### 16.5 输出格式 + +每个场景输出: + +```text +-comparison.svg +-comparison.png +-metrics.csv +``` + +SVG 是矢量母版,PNG 用于直接查看和现有工作流,CSV 保存每种方法的完整指标。报告输出属于生成产物,不提交到源码目录。 + +绘图使用独立的不可变 `SmoothingFigureModel`。SVG 和 PNG 渲染器都消费该模型,以保证面板范围、曲线、颜色、字体和文本一致。 + +## 17. 错误隔离 + +- 单个算法的预期失败只影响对应比较项; +- 单个算法发生数值异常时,比较服务记录算法名、异常类型和安全诊断,然后继续其他算法; +- 取消优先于继续比较,取消后不再启动后续算法; +- 报告导出失败不改变平滑比较结果; +- 某个场景所有算法失败时仍可生成只包含原粗路径、失败状态和诊断的报告; +- 正式服务不捕获并隐藏调用方编程错误,但所有输入契约错误必须转换为稳定状态和诊断; +- 所有错误消息包含场景、方法和处理阶段,不依赖堆栈才能定位。 + +## 18. 测试设计 + +### 18.1 契约测试 + +- 空路径、空方向段、空地图、空车辆和空配置; +- NaN、无穷值、负弧长和非法曲率; +- 非法重复点和不完整方向段; +- 成功和失败结果的只读集合; +- 失败状态不得携带可执行路径; +- 取消不得发布部分路径。 + +### 18.2 几何分析测试 + +- 直线的曲率为零; +- 已知半径圆弧的几何曲率和车辆曲率符合方向语义; +- 前进和倒车使用正确的曲率符号; +- 航向跨越 `-π/π` 时连续展开; +- 不跨换向重复点计算差分; +- 等弧长重采样保留精确段尾。 + +### 18.3 算法性质测试 + +三种方法分别验证: + +- 直线路径不产生无意义横向偏移; +- 方向段首尾位置和航向保持; +- 换向点的位置、航向和顺序保持; +- 输出点数和间距符合配置; +- 重试强度严格递减且次数有限; +- 短段和退化控制点产生明确失败而非 NaN。 + +### 18.4 安全复核测试 + +- 平滑切入障碍物时拒绝; +- 相邻点之间扫掠碰撞时拒绝; +- 车体越过地图边界时拒绝; +- 最大车辆曲率超限时拒绝; +- 净空被高估时拒绝; +- 方向段或换向结构改变时拒绝; +- 原粗路径复核失败时禁止回退。 + +### 18.5 比较和夹具测试 + +- 三种方法接收同一份预处理输入; +- 单个方法失败不影响其他方法; +- 排序规则按固定字典序执行; +- 没有可行方法时不推荐默认方法; +- 快速夹具路径不调用 Hybrid A*; +- 配置指纹变化会使夹具明确过期; +- 四个现有端到端场景保持预期成功和方向结构。 + +### 18.6 绘图测试 + +- 固定色值、线型、图例顺序和面板编号; +- 路径图 X/Y 比例相等; +- 曲率限制线数值正确; +- `SimSun` 与 `Times New Roman` 检测; +- `粗路径 κ(s) X (m) −π` 等代表性混合文本完整渲染; +- SVG 为有效 UTF-8,包含预期字体和所有四种方法; +- PNG 具有正确像素尺寸、PNG 结构、CRC 和 300 dpi 元数据; +- CSV 具有 UTF-8 BOM、稳定列顺序和不依赖区域设置的小数格式; +- 不使用依赖平台抗锯齿细节的脆弱逐像素金图测试; +- 至少对直线、绕障和换向三张代表图执行人工视觉检查,确认无乱码、遮挡、裁切和间距失衡。 + +## 19. 实施边界 + +第一轮实施只建立本设计中的接口、三种算法、统一验证、快速夹具和报告。正式 `MovementTest` 集成是后续独立工作,在默认方法通过离线比较并得到明确推荐后进行。 + +实验台不得让 `CoarsePath` 依赖 `PathSmoothing`。正式串联由更上层门面完成: + +```text +CoarsePathPlanningService + ↓ 成功 PlanningResult +PathSmoothingService + ↓ 成功或明确回退 +后续 SQP +``` + +## 20. 验收标准 + +设计实施完成需满足: + +1. 成功粗路径能通过单一公共接口得到不可变平滑路径结果。 +2. 三种方法对同一粗路径独立运行,不串联、不修改输入。 +3. 起终点、方向段和换向结构在所有成功结果中保持。 +4. 所有成功结果通过完整车体碰撞、边界、曲率和输出契约复核。 +5. 不可行候选不会进入正式可执行路径。 +6. 八个快速夹具无需运行 Hybrid A* 即可完成三算法比较。 +7. 四个现有端到端场景能够从建图和 Hybrid A* 连接到平滑比较。 +8. 每个场景生成包含四路径、四曲率和指标表的 SVG、300 dpi PNG 与 UTF-8 CSV。 +9. 图内中文使用宋体,英文、数字和数学字符使用 Times New Roman,代表性图无乱码、遮挡或裁切。 +10. 比较结果使用公开的字典序规则推荐方法;没有合格方法时明确不推荐。 +11. 输出可以作为后续 SQP 的空间参考路径输入,但不提前引入时间、速度或控制字段。