docs: design full-direction EM trajectory visualization repair

This commit is contained in:
梁薄云
2026-08-06 17:59:23 +08:00
parent 2e2302c6a2
commit c354f11306
@@ -0,0 +1,282 @@
# 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 实车观察清单;任何未安全执行项都必须保持为未完成。