Files
ParkingRobot/docs/superpowers/specs/2026-08-06-em-full-direction-segment-visualization-repair-design.md
T

283 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# EM 完整方向段轨迹规划与观察界面定点修复设计
**日期:** 2026-08-06
**状态:** 已批准设计
**适用范围:** EM 轨迹规划、MovementTest 只读观察、Web 观察页面与 Native Painter 语义修正
## 1. 背景与问题定性
部署机的 MovementTest 观察证据同时暴露了规划端与显示端的真实问题,不能把所有异常归因为“绘图错了”:
1. 静止起步时,纵向包络的种子速度直接取实车初速度。初速度为 `0` 时,全零 `PathS/v/a/j` 轨迹可满足当前不后退和上限约束,且目标函数没有足够的前进或巡航速度驱动。结果可被错误地标记为 `Success` 并发布。
2. 旧模式同时暴露 `DistanceHorizonMeters``TimeHorizonSeconds`,操作者必须手动把两者调大才能“看到整段”。这两个值本质上是滚动视窗的截断参数,不应成为完整方向段的输入目标。
3. 当前终点验证只检查了终端 `PathS`、速度、加速度和横摆角速度,没有验证世界坐标下的终点位置与 yaw。`yawRate = 0` 不等于终点朝向正确。
4. Web 的分页隐藏状态被 CSS `display` 规则覆盖,因此“LS / ST”与“曲率与运动学”会同时显示,造成两个按钮内容相同的假象。
5. Web 图表只生成 x 轴数值,y 轴网格没有对应数值刻度;单位、线型和图层语义也不够清晰。
6. 路径总览里的粗路径、平滑路径、当前轨迹和 horizon 使用过于接近的线型,且动态构建器可以把同一条轨迹重复发布为两个图层,导致规划结果被遮挡或无法辨认。
7. Native Painter 中显眼的大黑三角本质上是姿态的终端朝向箭头,尺寸与语义不匹配,会覆盖路径数据。
8. 现有 Web 测试主要检查静态字符串,无法证明分页、SVG 刻度、图层和缩放交互真正在 DOM 中正确渲染。
因此,截图中水平的 ST 线不只是坐标轴问题:它很可能如实显示了一条被错误接受的零进度轨迹。本设计要分别修正轨迹生成、验证和可视化,不使用前端伪造运动数据。
## 2. 目标
### 2.1 规划目标
- 新增明确的 `FullDirectionSegment` 规划范围:以粗路径分割出的“当前完整方向段”为边界,一次得到该段的完整 LS 和 ST。
- 静止起步时,若路径可行且尚未抵达终点,轨迹必须从 `v = 0` 自动加速,而不是用零速度填满整段。
- 在曲率、加速度、减速度和 jerk 约束内尽快趋近期望巡航速度,并根据终点停车包络自动决定何时开始减速。
- 完整方向段模式的 `s_end` 由 Local G2 平滑后实际路径的弧长决定,总时长 `T_end` 由该段的可行速度/停车包络决定。操作者不再手动输入一对可能相互矛盾的距离和时间窗口。
- 终点必须同时满足进度、停车、世界位姿与朝向边界。
### 2.2 观察目标
- 保留现有四个 Web 分页和白底论文风格,只修复错误、缺失数据、坐标刻度、图层语义与局部查看能力。
- 中文标题保持中文,数学符号保留 `S``s_end``κ``Δ``ω` 等标记。
- 让粗路径、完整 Local G2 路径、当前方向段、当前完整轨迹、历史轨迹、车辆位姿、`s_end` 和换向点在语义上可区分。
- 图表的缩放只改变观察视域,不改变、重采样或回写规划数据。
### 2.3 安全目标
- MovementTest 始终为 `OBSERVE_ONLY`,不产生底盘、转向、制动、电机或档位写输出。
- 规划失败、零进度、终点不匹配或资源超限时,结果不得以 `Success` 发布。
## 3. 非目标
- 本阶段不实现动态障碍物重规划、执行中滚动精化或实车跟踪控制。
- 不用一条轨迹跨越前进/后退换向边界。
- 不把 Web 页面重做为新布局,不更换已批准的视觉风格,不用粗线、渐变或装饰性元素掩盖数据。
- Native Painter 不做美化工程;只修正坐标、等比例、标记尺寸和语义。
- 不通过增大手动 `DistanceHorizonMeters` / `TimeHorizonSeconds` 来伪装完整方向段模式。
- 不在本阶段扩大修改到粗路径搜索、Local G2 算法重构或无关 UI 功能。
## 4. 规划范围与配置语义
### 4.1 独立的规划范围
引入显式的规划范围选择:
- `RollingHorizon`:保留现有滚动视窗行为。`DistanceHorizonMeters``TimeHorizonSeconds` 只在此模式下表示当前局部视窗。
- `FullDirectionSegment`:对粗路径的当前完整同向段做一次完整规划。此模式忽略旧的距离/时间视窗作为截断边界,而不是要求用户将它们设置为“足够大”。
MovementTest 的完整轨迹观察入口默认选择 `FullDirectionSegment`。旧的滚动模式保留为明确的兼容选项,不与新模式隐式混用。
`FullDirectionSegment` 在方向段激活时只规划一次,后续观察周期重复发布同一份冻结规划及新的观察状态,不根据每周期实时状态重做 ST。只有显式重启观察任务、当前方向段切换,或本次规划失败后由上层明确发起新请求,才能创建新的完整轨迹。“按实时状态滚动精化”留给后续独立阶段。
如果 MovementTest 在车辆已位于某方向段中部时启动,则以启动快照在该段 Local G2 路径上的最近合法投影作为 `s = 0`,一次规划剩余路径到真实方向边界。它不回到该段历史起点,也不穿过该段终点。
### 4.2 速度配置
此阶段采用以下可配置默认值:
| 方向 | 期望巡航速度 | 硬速度上限 |
| --- | ---: | ---: |
| 前进 | `1.0 m/s` | `1.0 m/s` |
| 后退 | `0.5 m/s` | `0.5 m/s` |
期望速度是优化目标,不是必须在任何路径上达到的硬下限。曲率、障碍物、加速度、减速度、jerk 和终点停车包络可以将可行速度降低。方向符号在发布轨迹时保留;包络计算可在方向段的正向弧长坐标中完成。
### 4.3 终端边界
对非空且尚未抵达的方向段,成功结果必须同时满足:
- `PathS = s_end`,允许数值离散对应的小容差,但不允许提前截断后声称到达。
- 终端 `v = 0``a = 0``ω = 0`,均按现有数值验证容差检查。
- 终端世界位置与该方向段目标位置的欧氏距离不大于 `0.03 m`
- 终端 yaw 与该方向段目标 yaw 的归一化角度差不大于 `5°`。角度差必须归一化到 `[-π, π]`,避免 `+π/-π` 跨界时误判。
`s_end` 取自已选中的 Local G2 实际路径弧长,世界位姿目标取自当前方向段的真实边界姿态。两者必须指向同一个边界,不得一个来自粗路径全局终点,另一个来自局部截断点。
## 5. 完整方向段数据流
### 5.1 方向段分割
1. 粗路径按前进/后退符号的真实变化分割为方向段。
2. 当前方向段的规划起点是方向段激活快照的真实起点或合法投影点,终点是下一个真实换向点;若不再换向,则是全路径终点。
3. Local G2 在该完整方向段上建立连续 LS,其输出的实际弧长定义 `s_end`
4. ST 只使用该段的 `s ∈ [0, s_end]`,不会穿过换向点。
### 5.2 空间速度上限
对 LS 路径的每个有效位置建立空间速度上限,取以下限制的最小值:
- 当前方向的硬速度上限;
- 由曲率和横向加速度上限推导的速度上限;
- 障碍物或安全规则产生的局部速度上限;
- 真实换向点或全路径终点的零速度边界。
终点停车不由固定的“提前几米”决定。算法从 `s_end` 反向传播可行减速/jerk 包络,得到每个 `s` 处为了最终停住而允许的最大速度。
### 5.3 静止起步与完整 ST
纵向规划不再把“当前速度”当成“整段目标速度”。它必须区分:
- 初始边界:来自实时状态的 `s0/v0/a0`
- 巡航目标:当前方向的期望速度;
- 可行上限:空间速度上限与加速度/jerk 包络;
- 终端边界:`s_end/v=0/a=0`
从初始状态正向传播起步可达包络,从终点反向传播停车可达包络,再与空间速度上限取交集。纵向优化目标跟踪该交集内的期望速度,并对无正当原因的零进度给予明确的前进代价。
`T_end` 是满足上述包络后走完 `s_end` 的结果,不是用户给定的强制到达时间。如果一条 5 m 路径按约束需要 7 s,则完整 ST 的结束时间约为 7 s;不会因为某个旧配置写着 2 s 就强制 2 s 到达,也不会因为写着 10 s 就在到达后虚构多余运动。
### 5.4 自适应优化网格与发布采样
“完整方向段”不等于“将整段按 0.1 s 全部塞进优化器”。优化结点和对外发布样本分离:
- 优化网格覆盖完整 `[0, s_end]` / `[0, T_end]`,并在起步、减速、曲率上限变化、停车和换向边界附近自适应加密。
- 发布层在优化成功后按已批准的时间分辨率(当前为 `0.1 s`)重采样,并强制包含精确终点样本。
- jerk 定义在相邻轨迹点之间的 `N-1` 个时间区间上;终点之后不生成额外 jerk 点。
- 自适应加密必须同时满足配置的最大空间步长、最大时间步长和边界变化误差。如果在配置的最大优化结点数内无法同时满足这些条件,则明确失败,不降级为截断轨迹。
这种分离保证用户看到的是完整 ST,同时避免优化问题的规模与展示样本数直接绑定。
## 6. 换向边界
每个方向段独立规划和发布:
1. 当前 N 段的 `s_end` 是真实换向边界时,其终端必须连续停车,不得把 N+1 段接到同一条轨迹中。
2. 沿用现有受监督的交接条件:连续停车保持,并且得到 3 个方向符号正确的速度样本后,才将观察高亮从 N 切换到 N+1。
3. 等待期间,Web 和 Native Painter 必须明确显示“N+1 段交接条件未满足”,而不是预先显示下一段已激活。
4. 条件满足后,以 N+1 方向段的初始状态进行新的一次完整规划。这不是对 N 段的滚动重规划。
## 7. Web 观察页面定点修复
### 7.1 结构与状态
- 保留“路径总览”、“LS / ST”、“曲率与运动学”、“周期历史与生效配置”四个现有分页。
- 修正 CSS/DOM 隐藏规则,任一时刻只显示被选中分页的内容。
- 路径总览没有可绘制数据时,在绘图区内显示具体缺失项(例如“未收到 Local G2 路径”),不留下无解释的大块空白。
- 页面顶部、控制台和数据状态中继续明确显示 `OBSERVE_ONLY`
### 7.2 坐标轴、刻度与单位
每张图同时绘制 x/y 两轴的数值刻度,刻度值由实际数据域生成,不使用与数据无关的固定范围。轴名与单位统一为:
| 数据 | 轴标记 |
| --- | --- |
| 参考弧长 | `ReferenceS (m)` |
| 路径弧长 | `PathS (m)` |
| 时间 | `t (s)` |
| 横向偏移 | `l (m)` |
| 速度 | `v (m/s)` |
| 加速度 | `a (m/s²)` |
| 加加速度 | `j (m/s³)` |
| 曲率 | `κ (m⁻¹)` |
| 横摆角速度 | `ω (rad/s)` |
零线、上下限和轨迹线使用不同线型,但线宽保持论文图表的纤细比例。当数据范围为常数时,在该值周围生成小而可读的对称范围,不将一条非零常数线误画成“看起来是零”。
### 7.3 路径总览图层
图层按以下顺序从底到顶绘制:
1. 粗路径:浅灰、半透明、细虚线;
2. 完整 Local G2 路径:深灰、细实线;
3. 当前方向段:轻量蓝色高亮,不覆盖底层形状;
4. 前一条已发布轨迹:灰色细虚线;
5. 当前完整规划轨迹:蓝色细实线,置于路径线之上。
“当前轨迹”和“当前 horizon”不得在指向同一组样本时重复绘制。如果滚动模式真的同时存在完整轨迹和局部 horizon,才使用两个语义明确的不同图层。
车辆实时位姿使用按世界坐标等比例绘制的小车轮廓和细朝向线;计划起点使用独立的小型记号。两者均不得按固定大像素覆盖轨迹。
### 7.4 `s_end`、换向点与高亮
- 世界路径图、LS 和 ST 都标记当前方向段的 `s_end`
- 如果 `s_end` 是换向边界,使用橙色小菱形并标注“换向点 N / `s_end`”;如果是最终目标,使用不同的终点记号,不混用换向语义。
- 周期交接等待时,高亮留在 N 段,并展示还缺失的停车保持/带符号速度样本条件。
### 7.5 局部放大
每张 SVG 图提供相同的轻量观察操作:
- 拖拽框选局部放大;
- 鼠标滚轮以指针位置为中心缩放;
- 双击或“重置”恢复完整数据域;
- “全屏”只放大当前图表容器。
缩放状态属于浏览器本地视图,新 SSE 周期到达时不改写原始数据,也不向规划器发送参数。
## 8. Native Painter 语义修正
Native Painter 仅作为辅助审计界面,修改范围限于:
- 世界路径按 x/y 等比例绘制,避免因视口拉伸误判曲率和轨迹形状;
- LS 的横轴为有定义的 `ReferenceS``PathS`ST 的纵轴为真实 `PathS`,不使用屏幕像素或局部索引假冒弧长;
- 终端朝向不再使用遮挡图像的大黑三角,改为小车轮廓与细朝向箭头;
- 使用与 Web 一致的 `s_end`、换向点、最终目标和当前方向段语义;
- 保留现有风格和交互,不引入新主题或重排整个界面。
## 9. 错误处理与发布门禁
至少增加以下可诊断失败:
- `NoProgress`:方向段长度超过终点容差,又不是真实停车/换向保持状态,但输出在整个区间内没有有效正进度。
- `TerminalPoseMismatch`:终端世界位置误差超过 3 cm,或归一化 yaw 误差超过 5°。
- `FullSegmentResourceLimitExceeded`:为满足完整方向段的离散精度或计算预算,所需优化规模超过已配置上限。
上述失败、求解器失败、约束违反或数据缺失都必须:
1. 保留首个有效失败原因和可复现诊断;
2. 将该周期标记为失败且 `published = false`
3. 在 Web、控制台和周期历史显示同一错误语义;
4. 不把轨迹截断、缩短或改回滚动模式后当作完整方向段成功。
零进度只在以下情况是合法的:当前已在终点位姿容差内,或正在真实换向边界执行只读的停车保持观察。障碍物导致无解时应返回无可行解,不应返回零轨迹 `Success`
## 10. 验证策略
### 10.1 规划器自动验证
1. **静止起步:** 无障碍、非零方向段、`v0 = 0` 时,输出在起步后产生正进度和正确带符号速度,且最终停在 `s_end`
2. **完整边界:** 完整模式不受旧距离/时间视窗截断,发布轨迹包含精确终点样本。
3. **自动时长:** 短路径在约束内提前完成,长路径自动得到更长 `T_end`,不把配置时间当作强制抵达时间。
4. **终点停车:** 高初速度和长直线场景中,减速起点由 jerk/减速包络推导,终端满足 `v/a/ω = 0`
5. **终点位姿:** 位置 3 cm、yaw 5° 边界内成功,边界外返回 `TerminalPoseMismatch`yaw 跨 `+π/-π` 时按归一化角度差判定。
6. **速度与曲率:** 前进直线场景可趋近 1.0 m/s,后退直线场景可趋近 0.5 m/s;急弯场景中根据曲率自动降速,不超过对应硬上限。
7. **换向分段:** 前进-后退路径产生两条独立完整轨迹,第一条在换向点停止,未满足交接条件前不激活第二条。
8. **零进度门禁:** 非终点、非停车保持的全零轨迹返回 `NoProgress` 且不发布。
9. **资源上限:** 通过测试中的小型配置上限稳定触发 `FullSegmentResourceLimitExceeded`,确认没有静默截断或滚动降级。
10. **结点分离:** 优化结点数与 0.1 s 发布样本数独立,加密发布采样不改变优化问题规模;jerk 样本始终为轨迹点数减一。
### 10.2 Web 与 Painter 自动验证
1. 使用真实 DOM/SVG 渲染测试,验证切换分页后只有目标 panel 可见,而不是只检查源码字符串。
2. 给定已知的非零 ST 数据,验证折线的 y 坐标随 `PathS` 增长,x/y 数值刻度、轴名和单位存在且与数据域一致。
3. 验证路径图层顺序、线型、透明度和去重,确保当前轨迹不被粗路径遮挡。
4. 验证 `s_end`、换向点、最终目标、实车位姿和计划起点分别使用正确语义,不出现大黑三角覆盖数据。
5. 验证框选、滚轮缩放、重置和全屏;缩放前后原始轨迹数组及服务端数据保持不变。
6. 空数据状态显示可操作的缺失原因,不呈现无说明空白画布。
7. Native Painter 使用非方形窗口测试世界 x/y 等比例,并验证 LS/ST 坐标的弧长语义。
### 10.3 MovementTest 与安全审计
- 使用固定场景执行只读观察,同时对日志、依赖边界和源码进行审计,证明全过程没有底盘、转向、制动、电机或档位写输出。
- 打开页面、慢客户端、关闭浏览器都不得阻塞规划观察周期。
- 停止 MovementTest 后,HTTP/SSE、端口和可选 Native Painter 必须全部回收。
- 实车验收仍只能在有人监督且环境安全时执行;不得通过操作真实底盘来“帮助”观察条件成立。
## 11. 兼容与迁移
- 现有 `RollingHorizon` 算法和观察语义保留,但不得被完整方向段入口隐式调用。
- `DistanceHorizonMeters``TimeHorizonSeconds` 继续作为滚动模式配置;完整方向段模式不删除它们,但在生效配置面板中明确标注“本模式不用于截断”。
- 现有 0.1 s 轨迹发布间隔保持,但不再决定优化结点数。
- 旧 Web/SSE 消费者保留现有字段;新增的边界类型、规划范围、位姿误差和失败码以向后兼容字段发布。
## 12. 完成标准
只有同时满足以下条件,才能声称本设计实现完成:
1. MovementTest 可通过一个明确开关选择 `FullDirectionSegment`,无需手动把距离和时间视窗调大。
2. 静止、无障碍的非零方向段产生从静止加速、必要时巡航、再在终点前减速至停止的完整 ST,不再发布全零成功轨迹。
3. 前进/后退速度目标与上限分别为 1.0/0.5 m/s,且轨迹始终满足加速度、jerk、曲率和安全限制。
4. 终端停车、位置 3 cm 和 yaw 5° 条件全部通过;否则不发布。
5. 每个换向方向段独立规划,交接高亮严格遵守停车保持和 3 个正确带符号速度样本。
6. Web 四个分页不再重叠,路径总览有数据则正确绘制、无数据则显示原因,所有图表具有正确的双轴刻度和单位。
7. 粗路径、Local G2、当前轨迹、车辆位姿、`s_end` 和换向点在原有论文风格中可清晰比较,没有粗线或大三角遮挡。
8. 每张图可局部放大、重置和全屏,且操作不修改规划数据。
9. 规划、Web 和 Painter 的自动回归验证全部通过,并完成 `OBSERVE_ONLY` 无硬件写输出审计。
10. 在有人监督的安全环境中重新执行受影响的阶段 8 实车观察清单;任何未安全执行项都必须保持为未完成。