Files
ParkingRobot/docs/problems.md
T

125 lines
12 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.
# 问题与验证状态
## 已解决(代码层)
### 轨迹数值检查和插值入口重复
- 现象:多个轨迹文件分别实现有限值检查和插值,语义容易漂移。
- 处理:Shared增加 `NumericGuard`;轨迹采样和投影共用 `Trajectory2D.InterpolateSegment()`
- 位置:`Shared/Validation/NumericGuard.cs``Trajectory2D.cs``TrajectoryProjector.cs`
- 验证范围:代码结构已统一;无自动化单元测试记录。
### 交叉/邻近轨迹可能发生投影进度跳变
- 原因:每周期在全轨迹搜索最近线段可能跳到空间上接近但进度不连续的线段。
- 处理:首周期全局搜索,后续按上次弧长使用后退0.10m、前进1.00m窗口,并在距离并列时优先原进度。
- 位置:`TrajectoryProjector``ParkingGeometricController`
### 倒车曲率和反馈符号不完整
- 处理:轨迹使用有符号参考速度,Yaw保持车头方向;横向误差继续相对轨迹执行点序定义,共同转角不再乘行驶方向,航向修正和曲率前馈保留倒车反号。
- 现有入口:`NewControllerReverseStraight4mTest`
- 验证:`MultiWheelC.Tests` 的8个无实车符号场景通过;2026-08-19第六轮实车记录中,倒车零偏置终点误差约15.9mm和12.8mm+150mm偏置横向误差由约-150.4mm收敛到-5.0mm、终点误差约18.1mm,已与正向直线精度接近。
- 限制:直线倒车有测试入口,曲线倒车仍归入待验证。
### 终点零速参考可能提前停车且无法收敛
- 处理:增加终点制动预瞄和单向低速逼近;越过终点不反向修正。
- 完成条件:剩余弧长、终点距离、终点航向和β方向轮组实际速度全部满足。
- 位置:`ParkingGeometricController``PilotConfig.ParkingControl.cs`
### 状态配置和终点速度来源不一致
- 处理:统一通过 `ParkingVehicleStateProviderFactory` 创建状态链;终点速度使用Vx/Vy沿β投影,不再让Detour横向速度单独影响普通前进判停。
- 后续补充:`WheelFeedbackVehicleStateProvider` 已保留并滤波轮组反馈Vy,支持蟹行纵向速度投影。
### 动作开始/结束时舵轮模式不明确
- 处理:轨迹跟踪开始前自动准备β方向;原地自转先准备自转姿态,完成后回正;组合计划在运动前预检全部段。
- 位置:`PrepareWheelsForward``TrajectoryTrackingMovement``MultiWheelRotateInPlace``MotionPlanExecutor`
### Detour持续小阶跃会直接扰动控制轨迹
- 处理:状态层已分离Detour原始坐标与任务控制坐标;疑似阶跃期间使用滤波后的轮组 `Vx/Vy/Vw` 短时预测,有限小偏移经连续帧确认后更新坐标变换,大幅或超时未恢复的变化返回状态不可用。
- 自转保护:动态航向阈值考虑实际轮组Vw和Detour源帧间隔;近似原地自转期间禁止自动吸收坐标偏移;位置单独异常时航向闭环可继续,到位停车后再恢复完整位姿,未恢复时阻止下一运动段。
- 位置:`DetourVehicleStateProvider``WheelFeedbackVehicleStateProvider``MultiWheelRotateInPlace``PilotConfig.ParkingControl.cs`
- 验证:第三轮实车组合动作中发生一次约47mm/3.44°的原始坐标变化,自动连续化计数增加后控制轨迹保持连续,动作最终以约24.7mm剩余距离、2.8mm横向误差完成。
## 待解决
### 完整停车作业流程尚未实现
- 缺少或未接入新版流程:轮胎识别、自动钻车、夹抱/释放动作编排、完整安全状态机。
- 现有 `PilotConfig` 和IO字段不能视为业务流程已经完成。
### 多车能力仍是占位
- `Shared/Fleet/FleetKinematics.cs` 没有实现。
- `PilotConfig.cs` 的多车区域在 `#if false` 中,不参与当前编译。
- 当前没有车队状态、通信、命令分配、安全降级和多车测试闭环。
### Detour跳变判据和动作段衔接仍需收敛
- 2026-08-19第四轮记录包含16次独立原地自转:4次未出现候选、3次候选后恢复、9次因候选超时变为不可用,共25个候选片段。全部由 `PositionInnovationExceeded` 触发,没有 `HeadingInnovationExceeded`;航向创新峰值约7.1°,动态允许量约7.5~9.3°,说明当轮航向动态判据不是主要失败点。
- 候选开始时Detour单帧平移中位数约53mm、最大约162.3mm,轮组 `Vx/Vy` 接近零;Detour新帧间隔约98.2134.4ms,中位数约114.4ms。候选开始时 `l_step` 为283,其中9/25发生在 `l_step<=3`,另有 `l_step=61` 的自转未触发候选,继续证明 `l_step` 不能单独作为有效性门限。
- 同轮7次直线中6次完成,其中2次完成有限坐标连续化;1次在约190mm原始阶跃后安全失败。组合动作完成,仅出现约47.7mm的短候选并自行清除。小范围连续化已有正面证据,大幅阶跃仍应保持安全边界。
- 已实施“自转期间位置/航向分离、停车后再恢复位置”的动作衔接,编译和统一打包通过,但尚待实车验证。预期它解决位置单独异常导致的自转中断,不代表已经消除Detour原始位置阶跃。
- 当前实现先读取Detour观测,再把轮速预测推进到本机当前 `Stopwatch` 时刻并比较两者;Detour观测对应的源时刻通常更早,因此比较时刻尚未严格对齐。0.4m/s且Detour约0.11s一帧时,这种时序差可产生约44mm表观位置创新,是固定40mm阈值可能过严的重要原因。短期可评估有界的“基础余量 + 平面轮速 × 源帧间隔”,但成熟修正应保存短时轮速/里程计历史,将观测与同一源时刻的预测比较,再把校正状态预测到当前时刻;该方案尚未实施。
- 健康 `l_step` 下仅凭预测创新不应轻易自动改写坐标系;在完成同一时刻比较前,不继续通过反复放宽阈值堆叠补丁。
- 不建议通过全局放宽0.60s确认窗口、40mm残差或允许自转期间完整坐标修正来掩盖问题。
- 2026-08-19第六轮记录确认普通正向/倒车直线、曲线和小范围运动中坐标连续化总体可用,主要剩余失败集中在原地自转:有样本在 `l_step=94` 时连续3个Detour新帧航向创新超限,状态层先短时使用轮组Vw预测,第三帧才安全终止,说明单帧航向容错已按设计生效;另有约163mm、207mm的位置不连续或候选不稳定导致停车后恢复失败。
- 当前决定:保持普通运动150mm自动连续化上限、自转最大角速度30°/s和角加速度40°/s²,不以全局放宽阈值或提高自转速度掩盖Detour退化。原地自转后的条件化“仅位置连续化”仍是可评估方案,但尚未实施;持续航向异常需要Detour质量/重定位语义或额外可信航向来源才能进一步收敛。
### 自动化测试和CI覆盖有限
- 现有 `[MovementTest]` 是Clumsy宿主人工/实车入口,不是 `dotnet test`
- `MultiWheelC.Tests` 是不进入正式打包的独立可执行回归项目,现已覆盖Stanley前进/倒车横向符号的8个场景;应长期保留其源码,`bin/obj`仅为可删除编译产物。
- 轨迹数学、坐标变换、状态跳变过滤和终点策略仍缺少标准测试框架下的可重复单元测试,当前也没有CI。
### 运行和发布信息不完整
- 宿主版本、正式插件目录、启动顺序、运行时配置文件位置和发布审批流程待补充。
- `mcu_serial_bridge.dll` 不在当前源码目录,实车运行依赖外部部署。
## 待验证
### Detour静态基线与运动跳变条件
- `Experiments/DetourStaticDiagnosticTest.cs` 已提供只读宿主测试,记录 `x/y/th/tick/l_step`、数据年龄、接口耗时、帧间差、四轮反算 `Vx/Vy/Vw` 及单轮反馈。
- 2026-08-18约881s静态记录中没有复现5~7cm阶跃:Detour新帧最大位移9.21mm、2s前后中值最大持续偏移6.11mm,前后30s位置中值变化约15.5mm;该结果是当前环境的正常静态基线,不证明运动中阶跃已经消失。
- 同次记录确认接口无失败或乱序,Detour实际新帧间隔中位数约109.94ms(约9Hz),数据年龄中位数57.19ms、最大134.49ms`getCartLocation()`调用本身中位耗时仅0.0139ms,说明接口主要返回缓存的最新定位。
- 静止时直接差分Detour位姿仍产生表观速度:线速度中位数约0.0132m/s、P95约0.0320m/s,角速度绝对值P95约0.680°/s;继续使用轮组反馈作为速度闭环来源是合理的。轮组反算在本次静态记录中基本为零,但仍需运动实验验证。
- `l_step` 正常基线主要为2,并约每30s出现一个新帧值3,且未与明显位姿变化相关;精确定义、异常阈值以及Detour是否提供显式重定位/坐标重置状态仍待确认。
- 运动记录进一步表明 `l_step` 与位姿创新并非一一对应。建议仅将其作为分级健康信号:低值稳定可支持恢复判断,高值持续且同时存在异常创新时才支持停车;实际分级阈值仍需结合部署端Detour/MDCS版本确认。
- C层轨迹CSV现已同时记录原始/滤波轮组 `Vx/Vy/Vw`、轮组采样时刻、Detour源帧间隔和预测时刻、实际/允许的位置与航向创新、候选触发原因、估计器状态及不可用原因。该记录解决了字段缺口,但Detour源 `tick` 与本机单调时钟/轮组采样时钟之间尚未建立统一时间轴,仍需通过新实验和Detour `tick` 语义确认后才能定量评价预测误差。
### 控制周期和舵轮响应
- 代码已经记录控制周期分段耗时、请求/限速后GCP命令和四舵角;M层已有轮速/舵角诊断CSV。
- 差速转舵角速度前馈默认增益0.9,曲率预瞄默认0.15s/0.12m。
- 2026-08-19第六轮共9131个轨迹控制周期:周期中位数约31.24ms、P95约32.68ms、最大约59.44ms;控制计算总耗时中位数约0.12ms、P95约0.22ms。当前C层计算不是主要周期瓶颈,历史约110ms现象不应继续归因于控制算法计算量。
- 不同速度、载荷下的舵轮物理响应和前馈参数仍需按具体工况验证。
- CAN/MCU正常运行逻辑风险较高;除诊断外不应在没有明确方案和实车回退措施时修改。
### 尚未覆盖的运动工况
- 曲线倒车。
- 45°/90°蟹行曲线及不同β下的机械限位。
- 非零β曲线中 `MultiWheelChassis.GetCarSpeed(true)` 的坐标一致性:`SetOriginBias` 会旋转 `sw.Position`,需要确认 `ReadAngle()` 返回值在该解算中的参考系与之匹配;当前不能仅由蟹行直线推断曲线速度反馈正确。
- 0~1.2m/s范围内曲率预瞄、速度滤波和GCP角速度限制的参数适用性。
- 高速、低附着、载车后质量/惯量变化、定位丢失和急停恢复。
### 参数与实车配置一致性
- `参考文档/*.json` 是否与当前实车配置一致待确认。
- `PilotDefinition.CarLength/CarWidth`、宿主底盘轮子布局、`ControlPointRadius`、舵轮零偏和机械限位需要按车辆编号核验。
## 排障入口
- C层轨迹CSV`TrackingExperimentRecorder`,默认宿主目录 `TrackingExperiments/`
- C层Detour静态诊断:`DetourStaticDiagnosticTest`,默认宿主目录 `DetourStaticDiagnostics/`
- C层周期耗时:`ParkingGeometricController.LastCycleTiming``*_timing.csv`
- M层轮速/舵角:`StartWheelSpeedDiagnostic()` / `StopWheelSpeedDiagnostic()`,默认 `logs/wheel-speed/`
- 底盘分解失败:`MultiWheelChassisAdapter.LastFailureReason``GcpCommandExecutor.LastFailureReason`
- 状态失败:`DetourVehicleStateProvider.LastFailureReason``WheelFeedbackVehicleStateProvider.LastFailureReason`