diff --git a/docs/superpowers/specs/2026-08-05-em-observation-web-visualization-design.md b/docs/superpowers/specs/2026-08-05-em-observation-web-visualization-design.md index 945b397..4790605 100644 --- a/docs/superpowers/specs/2026-08-05-em-observation-web-visualization-design.md +++ b/docs/superpowers/specs/2026-08-05-em-observation-web-visualization-design.md @@ -75,6 +75,8 @@ localhost browser 主项目通过 `ProjectReference` 引用新类库,并排除对子项目源码的重复编译。插件发布流程必须包含新增程序集及其必要依赖。网页资源作为程序集嵌入资源发布,不依赖 CDN、Node.js 或外网。 +类库和主项目均继续以 `netstandard2.0` 为目标框架并使用 C# 10。JSON 使用仓库现有的 `Newtonsoft.Json 13.0.4`;不引入 ASP.NET Core、Kestrel 或新的前端包。由于 Windows `HttpListener` 可能要求额外的 HTTP.sys URL ACL,运行时使用 `TcpListener(IPAddress.Loopback, port)` 实现本功能所需的受限 HTTP/1.1 GET 与 SSE 子集,不依赖管理员预注册。 + ## 4. 可视化类库公共边界 类库只暴露三个主要生命周期操作: @@ -92,7 +94,7 @@ visualization.Stop(); - 静态快照:地图边界、障碍物、全局粗路径、Local G2 路径、全部方向段、换向点和冻结后的生效配置。每次会话只生成并传输一次。 - 动态快照:实车状态、当前段、当前/上一轮轨迹、当前采样点、本轮规划结果、交接指标和诊断摘要。 -服务只绑定 `127.0.0.1`。页面和事件接口均校验随机会话令牌。服务最多接受两个浏览器客户端,额外连接被拒绝。前端静态资源通过普通 HTTP 获取,动态帧通过 Server-Sent Events 发送;客户端断开或读取缓慢时丢弃旧帧,不对发布者形成反压。 +服务只绑定 `127.0.0.1`。页面和事件接口均校验随机会话令牌。服务最多接受两个浏览器客户端,额外连接被拒绝。前端静态资源通过普通 HTTP 获取,动态帧通过 Server-Sent Events 发送;客户端断开或读取缓慢时丢弃旧帧,不对发布者形成反压。请求解析器只接受 `GET`,请求头上限为 `16 KiB`,首行/请求头读取超时为 `2 s`;其他方法返回 `405`,未知路径返回 `404`,令牌错误返回 `403`。 ## 5. 资源与性能约束 @@ -129,6 +131,8 @@ GearSwitchStopHoldSeconds = 0.20 原生 Painter 与网页独立控制。`EnableNativePainterVisualization=false` 时不取得或刷新 World、LS、ST Painter,避免与浏览器重复绘图。两种显示都关闭时,规划循环和控制台诊断仍工作。 +自动打开浏览器只由 MovementTest 主机调用 `Process.Start`,类库本身不读取桌面环境或启动外部进程。该调用必须捕获异常;Windows 服务会话或无桌面环境中只打印完整 URI。 + ## 7. 多方向段观察状态机 现有硬编码 `segmentIndex = 0` 改为只允许顺序前进的活动段状态机。 @@ -185,6 +189,8 @@ GearSwitchStopHoldSeconds = 0.20 - `j[i]` 表示真实区间 `[tᵢ,tᵢ₊₁)`;jerk 曲线点数严格为轨迹点数减一。最后一个轨迹点不绘制伪造的 `j=0`,而标注“末点后无时间区间”。 - 同图展示实际带符号车速与当前选中轨迹点速度。 +纵向加速度与 jerk 由当前主程序集内的 EM Adapter 读取 `EmTrajectoryPoint` 的现有内部字段并转换成通用曲线 DTO;不为可视化修改 EMPlanner 的公共契约。 + ### 8.4 周期历史 最近 `VisualizationHistoryCycleLimit` 个周期展示:周期号、时间、成功/失败、是否发布、规划耗时、段索引、方向、纵向模式、终端类型、末端速度、末端加速度和失败原因摘要。 @@ -233,6 +239,7 @@ GearSwitchStopHoldSeconds = 0.20 - `Publish` 非阻塞且最新帧容量为 `1`。 - 历史严格受容量限制。 - 服务只监听回环地址并校验令牌。 +- 原始 TCP HTTP 解析器拒绝超大请求头、非 GET 方法、未知路径和错误令牌。 - 慢客户端不阻塞发布者。 - 静态快照不重复进入动态帧。 - 启停、重复停止和端口释放。 @@ -283,3 +290,4 @@ dotnet build ClumsyPilot/ClumsyPilot.csproj -p:ExcludeLegacyAutoAvoidance=true - 滚动末端语义、jerk 区间语义和换向分段高亮均能由页面直接观察。 - 可视化关闭或失败时不改变 EM 规划行为。 - 源码和运行时证据均证明 `OBSERVE_ONLY` 不变。 +- 插件包包含 `ClumsyPilot.dll`、`TrajectoryPlanningVisualization.dll`、固定 OSQP 运行时及许可证,且没有遗漏新增托管依赖。