采用这个科研风格
后续页面都沿用细线、白底、论文式多子图与单位标注。
diff --git a/.gitignore b/.gitignore index bbeebc2..a3d7c53 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,6 @@ appsettings.Development.json # OS files Thumbs.db .DS_Store + +#Unfinished Traplanner +TrajPlanner \ No newline at end of file diff --git a/.superpowers/brainstorm/.last-port b/.superpowers/brainstorm/.last-port new file mode 100644 index 0000000..d4ad060 --- /dev/null +++ b/.superpowers/brainstorm/.last-port @@ -0,0 +1 @@ +52380 \ No newline at end of file diff --git a/.superpowers/brainstorm/.last-token b/.superpowers/brainstorm/.last-token new file mode 100644 index 0000000..2b306ca --- /dev/null +++ b/.superpowers/brainstorm/.last-token @@ -0,0 +1 @@ +c619697a72212b481e509ebd1c9023d987d76f98e8d335c1a428bd2f2e641248 \ No newline at end of file diff --git a/.superpowers/brainstorm/1212-1786007808/content/dashboard-layout-options.html b/.superpowers/brainstorm/1212-1786007808/content/dashboard-layout-options.html new file mode 100644 index 0000000..069c0be --- /dev/null +++ b/.superpowers/brainstorm/1212-1786007808/content/dashboard-layout-options.html @@ -0,0 +1,63 @@ + + +
所有方案都修复页签串页、增加 X/Y 数值刻度与单位、图例、图层显隐、框选缩放、滚轮缩放、复位和全屏查看。
+ +路径图最大,状态在右侧;图表作为底部工作区。适合先看全局几何。
左侧完整路径,右侧同时看当前选中的 ST/速度图与关键状态,减少来回切页。
地图在上方,LS/ST/速度三图并排;适合桌面大屏同时比较数据。
三种实现方式都保持 OBSERVE_ONLY。点击选择;推荐 C,它既表达完整方向段,又保留实时修正能力。
+ +实现简单,但速度、载荷或当前加速度变化后,固定制动点可能过早或来不及停车。
+完整性最好,但长方向段会产生很大的优化问题;现场参数变化时,整段重新求解可能很慢。
+先为完整方向段计算速度上限与停车包络,再按短周期重算当前轨迹;能主动起步,也能随实时状态调整制动点。
+主产物:一次优化得到完整当前方向段的 LS 与 ST;网页显示完整轨迹,而不是短窗口片段。
+所有轨迹均以完整采样点绘制,不使用任何连线。每张俯瞰图按路径包围盒加小边距取景,并保持 X/Y 等比例。
+ +保留障碍物、起终点与灰色粗路径点。
仅四组路径点、坐标轴和图例;无障碍物、无起终点。
灰色粗路径点作参照;蓝色为全部 B 样条输出点。
灰色粗路径点作参照;橙色为全部 Bézier 输出点。
灰色粗路径点作参照;绿色为全部五次输出点。
四组曲率采样点、统一坐标轴和图例;不绘制曲线。
请确认:这正是将被导出的六张独立 PNG + SVG 图的内容划分。看完后直接回复“确认”或指出需要调整的那一张。
布局已确认,继续在终端中准备实现。
+三种方案都保持 OBSERVE_ONLY。蓝线表示当前规划,灰线表示上一轮规划;红点专门标记滚动交接处。
+ + + +首屏保留路径、状态和异常;曲线按页签切换。信息完整,浏览器与车辆端的内存/重绘压力较平衡。
一次看到所有图,适合大显示器持续监控;小屏可读性较差,浏览器渲染负载最高。
一次聚焦一条曲线,最轻量、适合笔记本;跨图对照需要切换,实时总览能力较弱。
请点击一个布局。我的建议是 A:默认总览轻量,发生异常时再切到曲率或 v-a-j 细节。
diff --git a/.superpowers/brainstorm/1612-1785939150/content/dashboard-scientific.html b/.superpowers/brainstorm/1612-1785939150/content/dashboard-scientific.html new file mode 100644 index 0000000..17dd441 --- /dev/null +++ b/.superpowers/brainstorm/1612-1785939150/content/dashboard-scientific.html @@ -0,0 +1,70 @@ +以论文图表为基准:细线、白底、单位完整、图例克制;红色只表示真正越界。
+ + + +| t | 0.35 s |
| v | 0.182 m/s |
| a | 0.041 m/s² |
| j | −0.118 m/s³ |
| κ | 0.224 m⁻¹ |
| terminal speed ≠ 0 | PASS |
| |Δv| ≤ tol | 0.003 |
| |Δa| ≤ tol | 0.018 |
| |j| ≤ limit | PASS |
| trajectory age | 61 ms |
图表颜色始终语义一致:当前轨迹为蓝色、上一轮为灰色、交接点为橙色、越界才使用红色。
+ + + +浅色、低饱和、高可读性,适合长时间观察、截图和报告。
米白与墨色,接近论文/仪器输出,克制但稍显传统。
中性深灰、低炫光;比上一版更克制,适合暗光车间。
请点击一种风格;也可以回复“以 1 为基础,但……”。
diff --git a/.superpowers/brainstorm/1612-1785939150/content/waiting-architecture.html b/.superpowers/brainstorm/1612-1785939150/content/waiting-architecture.html new file mode 100644 index 0000000..093b38a --- /dev/null +++ b/.superpowers/brainstorm/1612-1785939150/content/waiting-architecture.html @@ -0,0 +1,6 @@ +界面说明使用中文;坐标轴、单位和数学符号保留英文规范。继续在终端讨论数据服务架构。
+请选择生成策略。重点考虑:既要自动化,也要让不同算法的关键机制真正容易理解。
+ +所有类型共享同一诊断叠加协议,但主图可以是流程、搜索路径、状态转移或数值曲线。表达力最强,同时保留统一点击体验。
+生成稳定、实现简单、读法一致;但数值曲线、状态跳转和搜索空间等算法特征会被压扁,可能仍停留在“文字方框”。
+定制能力最高,但生成成本大、输入要求高,也更依赖当次 Agent 是否完整理解算法,难以保证每份日报都有图。
+建议 A:使用“统一诊断协议 + 自适应主视图”。不管图形类型如何变化,点击节点后都固定展示源码、当前状态、原因、后果、修正方案和预期结果。
+下面以泊车路径规划为例。主画面直接呈现规划场景与算法结果,流程和文字只负责解释“为什么”。
+ +示意的是所有领域共用的操作方式;中央主画面会根据算法自动变成路径、曲线、搜索树、状态机或其他实际效果图。
+ +选择算法 → 查看正常机制 → 点击异常对象 → 播放影响传播 → 逐步预演纠正方案 → 切换已验证结果
+三种方案都能展示“正常功能 → 当前问题 → 原因 → 后果 → 纠正方案 → 预期结果”。请重点比较:第一眼是否容易理解,以及点击后能否逐层深入。
+ +先固定展示算法正常机制;点击问题后在同一流程上高亮故障节点、原因和影响,再切换到修正方案预演。上下文不丢失,最适合函数与算法诊断。
+阅读顺序最直观,适合汇报展示;但算法复杂或问题较多时页面会变长,比较多个问题时容易失去原流程位置。
+探索能力最强,适合大型算法和多个函数;但实现与维护成本最高,日报第一次打开时也更容易让读者迷失。
+我的建议:选择 B。它保留原算法作为稳定“地图”,问题和解决方案都是同一张地图上的可切换叠加层,最符合你强调的“点击就能理解目前状况和修正后结果”。
+正在终端中比较可复用的实现架构……
+主图展示算法阶段,节点可下钻至函数与源码。正在终端中确认修正预演的证据状态……
+正在终端中确认算法节点的组织粒度……
+正在终端中确认降级规则与验收标准……
+三种方案都包含独立页签、X/Y 数值刻度与单位、图例、图层显隐、框选/滚轮缩放、复位及单图全屏。
+大地图、右侧状态、底部单张分析图。
左侧完整路径,右侧同时看选中图表和终点状态。
地图在上,LS、ST、速度三图始终并排。
恢复之前的科研绘图语言,并进一步减小所有线宽。蓝色只表示完整规划轨迹,红色只表示真实越界。
+| Δ position | 0.012 m |
| Δ yaw | 1.8° |
| v terminal | 0.000 m/s |
| a terminal | 0.000 m/s² |
| yaw rate | 0.000 rad/s |
| segment length | 8.42 m |
| planned duration | 12.80 s |
| cruise target | 1.00 m/s |
| brake start | 6.31 m |
| zero progress | NO |
当前设计已收紧为:修复空白、页签、数据、刻度和图层缺陷;补充 s_end、换向点、车辆位置与路径对比,不重做布局。
++ 面向四舵轮AMR的第一阶段工程实现:暂不考虑蟹行与纯横移,仅采用车式运动模型, + 支持前进、倒车及换向,输出供后续SQP使用的无时间空间粗路径。 + 本文统一整理已经确认的第1至第14步,作为软件设计、编码、调试与验收依据。 +
+| 模块 | 主要职责 | 不负责 |
|---|---|---|
| Hybrid A* | 拓扑可达、无碰撞、基本运动学可行、前进/倒车结构、目标位置与航向接近 | 最终速度、加速度、时间、四轮舵角与轮速 |
| 路径后处理 | 回溯、稠密点恢复、关键点保留、弧长重采样、快速曲线平滑、完整复核 | 动态约束和最终轨迹时间参数化 |
| 后续SQP | 终点精确收敛、速度/加速度/角速度/时间戳、换向点停车、动态可跟踪性 | 重新决定绕障侧或凭空增加倒车拓扑 |
| 底盘逆解与控制 | 四轮舵角、轮速分配和轨迹跟踪 | 全局绕障搜索 |
目标平台为四舵轮AMR,但第一阶段只使用车式运动能力:
+输出空间路径点序列,至少包含:
+位置:x, y +车体航向:heading +运动方向:Forward / Reverse +累计弧长:s +参考/几何曲率:kappa +换向标记:isGearSwitchPoint +安全净空:clearance+
不输出速度、加速度、角速度、时间戳、四个舵轮角度与轮速。
+ +0.05 m;AMR使用旋转矩形车体碰撞模型,不能只用中心点或单圆近似。安全余量主要加到车体矩形上:
+CheckLength = VehicleLength + 2 × SafetyMargin +CheckWidth = VehicleWidth + 2 × SafetyMargin+
初始安全余量为0.03 m。避免地图膨胀与车体扩大同时重复计算同一余量。
车辆状态参考点采用AMR几何中心。
+ +dx/ds = cos(theta) +dy/ds = sin(theta) +dtheta/ds = kappa+
其中theta为车头航向角,kappa为车体中心路径曲率。
必须同时支持两种来源:
+MaxCurvature,或输入MinTurningRadius并换算kappa_max = 1 / R_min;ComputeMaxCurvature(VehicleKinematicParameters)计算。推荐三种模式:
+ExternalOnly +GeometryOnly +ConservativeMinimum+
当两种来源同时存在时,建议取更保守的较小值。若均无有效值,则返回配置错误。
+ +(x, y, theta, direction, curvatureIndex)+
x, y, theta保持连续值用于运动积分;direction为Forward或Reverse;curvatureIndex表示当前离散曲率等级。(ix, iy, iHeading, direction, curvatureIndex)+
推荐初始离散:
+0.05–0.10 m;5°;节点还应保存G/H/F代价、父节点索引、生成当前节点的原语积分点、最小净空、终止原因等。这些属于搜索管理信息,不属于车辆物理状态。
+{ -kappa_max, -0.5 kappa_max, 0, 0.5 kappa_max, kappa_max }
+每种曲率均支持Forward与Reverse。
+ +相邻原语曲率等级最多变化1级。例如:
+允许:0 → 0.5κmax +允许:0.5κmax → κmax +不允许:κmax → -κmax+
该限制可减少“左打死后立即右打死”的不合理跳变。
+ +PrimitiveLength = 0.50 m +IntegrationStep = 0.05 m+
完整原语最多包含10个内部积分点。只有原语终点进入Open List,内部积分点用于碰撞、净空和最终路径恢复。
+ +| 条件 | 处理 |
|---|---|
| 累计长度达到0.50 m | 生成正常候选节点 |
| 任一积分点碰撞 | 原语无效,立即终止 |
| 越界或进入未知区域 | 原语无效 |
| 中途满足目标规则 | 提前终止并保存实际有效段 |
| Reeds–Shepp连接成功 | 结束搜索 |
R_outer = 0.5 × sqrt(CheckLength² + CheckWidth²)+
D > R_outer表示安全;D ≤ R_outer只表示“无法确定”,不等于碰撞,必须进入矩形模板检查。
航向分辨率5°时,在初始化阶段自动生成72组模板:
+0°, 5°, 10°, ... , 355°+
每个模板保存旋转后的扩大车体矩形与地图栅格相交所对应的相对栅格偏移:
+GridOffset { Dx, Dy }
+运行时把当前车辆中心转换为栅格坐标,选择最近航向模板,将模板中的相对偏移平移到当前位置并查询占据状态。
+ +读取距离场 + ↓ +可安全放行?——是→继续 + ↓否 +选择航向模板 + ↓ +平移模板并查询Occupied / Unknown / 越界 + ↓ +任一命中→碰撞;全部通过→安全+
f(n) = g(n) + w_h × h(n)+
第一版HeuristicWeight = 1.3。
g_new = +g_parent ++ C_length ++ C_reverse ++ C_switch ++ C_curvature ++ C_curvatureChange ++ C_obstacle+
ReversePenalty = 1.3;GearSwitchPenalty = 2.0;h = max(h_2D, h_RS)+
h_2D:从目标反向运行二维Dijkstra得到的绕障距离;h_RS:基于当前位姿、目标位姿和最小转弯半径的Reeds–Shepp距离。所有权重必须外部可配置。
+GoalPositionTolerance = 0.15 m +GoalHeadingTolerance = 5°+
在每个0.05 m内部积分点检查位置和航向误差,避免越过目标。
+ +Hybrid A*可以在容差范围内结束,由后续SQP通过终端约束精确收敛到目标。但必须满足:
+GoalDirectionConstraint = Any | Forward | Reverse+
默认Any。该字段约束最后一段运动方向,不改变目标车头航向定义。
+ +| 模式 | 连接失败后的行为 | 适用场景 |
|---|---|---|
| Disabled | 不尝试,满足容差即可结束 | 开阔终点、调试对照 |
| Opportunistic | 失败继续搜索,满足容差仍可交SQP | 默认、普通导航 |
| RequiredNearGoal | 失败不能按容差结束,必须继续找可连接节点 | 狭窄钻入、精确泊入 |
2–5 m:每扩展10个节点尝试一次 +≤2 m:每扩展3个节点尝试一次 +采样碰撞步长:0.05 m+
连接路径必须检查地图边界、Unknown、扩大车体碰撞、安全净空、最大曲率、方向约束及与当前曲率的衔接。
+ +ReedsSheppMode = Opportunistic+
无需人工每次开启,由程序自动触发。任务类型可覆盖默认模式。
+搜索成功后从终止节点沿父节点索引回溯到起点,反转节点链,并恢复每条原语保存的0.05 m内部积分点。
+ +只输出原语终点会丢失圆弧形状、碰撞检查细节和换向局部结构。因此必须复用搜索时已经计算的内部点。
+ +x, y +heading, unwrappedHeading +curvature +direction +arcLength +clearance +isGearSwitchPoint +source+ +
原始0.05 m稠密路径不直接全部送入平滑和SQP。先保留关键结构,再按照累计弧长重采样。
+ +每个Forward或Reverse段独立处理,不能跨越换向点插值。
+ +普通区域:0.10 m +重点区域:0.05 m+
以下区域采用0.05 m:
+新插值点必须重新执行车体碰撞检查。最终输出点可为0.10 m,但碰撞验证内部步长仍不得大于0.05 m。
+全路径多轮QP还需要走廊生成、曲率线性化和反复碰撞检测,可能与后续SQP功能重复并增加耗时。因此第一版采用快速曲线优先,仅对失败局部使用QP。
+ +普通区域最大偏移:0.10–0.15 m +障碍物附近最大偏移:0.02–0.05 m +局部QP问题区间:失败点前后各约1.0 m+ +
0.95 κmax。第十三步不作为第一版主流程实现要求。前12步完整跑通并建立正确性基线后,再进行性能剖析与针对性优化。
+ +HybridAStarPlanner +├── MapProcessor +├── VehicleModel +├── MotionPrimitiveGenerator +├── CollisionChecker +├── HeuristicProvider +├── ReedsSheppConnector +├── GoalChecker +├── PathBacktracker +├── PathResampler +├── PathSmoother +├── PathValidator +└── PlanningDiagnostics+ +
public interface IHybridAStarPlanner
+{
+ PlanningResult Plan(PlanningRequest request);
+}
+
+输出不带时间的空间路径点和分段信息:
+X, Y +Heading, UnwrappedHeading +ArcLength +GeometricCurvature +VehicleCurvature +Direction +BodyClearance +IsGearSwitchPoint +Source+ +
ExactByReedsShepp +ReachedWithinTolerance +ExactAfterDirectSearch+ +
Success +SuccessWithToleranceGoal +SuccessWithSmoothingFallback +InvalidRequest / InvalidMap / InvalidVehicleParameters +StartOutsideMap / StartInCollision / StartInUnknownArea +GoalOutsideMap / GoalInCollision / GoalInUnknownArea +InvalidCurvatureConfiguration +SearchTimeout / SearchNodeLimitExceeded / NoFeasiblePath +ReedsSheppRequiredButFailed +BacktrackingFailed / ResamplingFailed / FinalValidationFailed +Cancelled / InternalError+ +
| 参数 | 推荐初值 | 说明 |
|---|---|---|
| MapResolution | 0.05 m | 读取地图配置,不写死 |
| HeadingResolution | 5° | 72个航向模板 |
| SafetyMargin | 0.03 m | 主要加在车体矩形 |
| PrimitiveLength | 0.50 m | 第一版固定 |
| IntegrationStep | 0.05 m | 碰撞与积分步长 |
| CurvatureLevels | -1,-0.5,0,0.5,1 × κmax | 5级 |
| GoalPositionTolerance | 0.15 m | Hybrid A*基础容差 |
| GoalHeadingTolerance | 5° | Hybrid A*基础容差 |
| HeuristicWeight | 1.3 | Weighted A* |
| ReversePenalty | 1.3 | 允许倒车但略微惩罚 |
| GearSwitchPenalty | 2.0 | 减少频繁换向 |
| ReedsSheppMode | Opportunistic | 默认自动机会式 |
| AnalyticExpansionDistance | 5.0 m | 进入后周期尝试 |
| NearGoalDistance | 2.0 m | 提高尝试频率 |
| AnalyticExpansionInterval | 10节点 | 2–5 m |
| NearGoalInterval | 3节点 | ≤2 m |
| NormalResampleSpacing | 0.10 m | 普通区域 |
| FineResampleSpacing | 0.05 m | 重点区域 |
| FineObstacleDistance | 0.50 m | 小于此值加密 |
| FineGoalDistance | 2.0 m | 目标附近加密 |
| GearSwitchDenseRange | ±0.30 m | 换向点附近 |
| CurvatureTransitionDenseRange | ±0.25 m | 曲率切换附近 |
| CurvatureLimitRatio | 0.95 | 平滑后留控制余量 |
| SearchTimeLimitMs | 3000–5000 ms | 第一版防失控,不是性能指标 |
PlanningResult Plan(request)
+{
+ ValidateRequest(request);
+ ValidateMap(request.Map);
+ ResolveVehicleCurvatureLimit(request.Vehicle);
+ ValidateStartAndGoal();
+
+ PrepareDistanceFieldIfNeeded();
+ PrepareHeadingFootprintTemplatesIfNeeded();
+ BuildGoalDijkstraHeuristic();
+
+ startNode = CreateStartNode();
+ PushOpen(startNode);
+
+ while (OpenList not empty)
+ {
+ CheckCancellationAndSafetyLimits();
+
+ current = PopBestValidNode();
+
+ if (ShouldTryReedsShepp(current))
+ {
+ rsPath = TryReedsShepp(current, goal);
+ if (ValidateAnalyticPath(rsPath))
+ return BuildFinalResult(current, rsPath);
+ }
+
+ if (GoalChecker.CanTerminateByTolerance(current))
+ return BuildFinalResult(current, noAnalyticPath);
+
+ foreach (primitive in GenerateAllowedPrimitives(current))
+ {
+ integrated = IntegratePrimitive(
+ current,
+ primitive,
+ step = 0.05 m,
+ maxLength = 0.50 m);
+
+ if (!integrated.Valid)
+ continue;
+
+ child = CreateChildNode(integrated);
+ if (!ImproveBestCost(child))
+ continue;
+
+ PushOpen(child);
+ }
+ }
+
+ return Failure(NoFeasiblePath);
+}
+
+BuildFinalResult(goalNode, analyticPath)
+{
+ rawDense = BacktrackAndRestorePrimitivePoints(goalNode);
+ AppendAnalyticPathIfAny(rawDense, analyticPath);
+
+ segmented = SplitByMotionDirection(rawDense);
+ resampled = PreserveKeyPointsAndResample(segmented);
+
+ smoothed = TryFastSplineSmoothing(resampled);
+ if (!ValidatePath(smoothed))
+ smoothed = TryLocalCurveOrQPFallback(resampled);
+
+ if (!ValidatePath(smoothed))
+ smoothed = resampled;
+
+ if (!ValidatePath(smoothed))
+ return Failure(FinalValidationFailed);
+
+ return Success(smoothed, diagnostics);
+}
+| 阶段 | 范围 | 完成标准 |
|---|---|---|
| M0 数据与工具 | Pose、地图、车辆参数、角度/坐标工具 | 单元测试通过 |
| M1 运动学与碰撞 | 恒曲率积分、航向模板、矩形碰撞 | 可视化验证不同角度无漏检 |
| M2 最小Hybrid A* | 无障碍、只前进、基础启发 | 稳定从起点到终点 |
| M3 障碍与倒车 | Dijkstra、前进/倒车、换向代价 | 绕障与一次倒车场景通过 |
| M4 终点模块 | 容差、GoalDirection、Reeds–Shepp三模式 | 普通与狭窄目标场景通过 |
| M5 后处理 | 回溯、0.05 m稠密点、分段、重采样 | 路径结构无断点、换向明确 |
| M6 平滑与复核 | B样条、Bézier、局部QP兜底 | 不改变拓扑,失败可回退 |
| M7 接口与集成 | PlanningRequest/Result、状态、诊断 | 可接入SQP |
| M8 性能TODO | 剖析、优化、100 ms目标 | 在正确性基线后执行 |