Files
ParkingRobot/docs/problems.md

137 lines
14 KiB
Markdown
Raw Permalink 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横向误差完成。
### Detour自转退化会中断允许小角度误差的相对自转
- 处理:`MultiWheelRotateInPlace` 增加 `RelativeWheelOdometry` 反馈模式,直接读取并积分滤波轮组 `Vw`;活动自转期间不调用Detour。原有 `DetourAbsoluteHeading` 模式继续用于需要世界绝对航向的任务。
- 验证:2026-08-21第七轮包含19份轮组里程计自转记录,其中17份表现为正常停车并完成舵轮回正;这17份中轮组积分转角与Detour原始航向变化的绝对差中位数约0.89°、最大约3.07°。同批Detour原始位置端点变化中位数约56mm、最大约298mm,说明轮组模式确实绕开了自转期间的Detour退化依赖。
- 限制:CSV尚未记录请求角度、内部积分角和明确完成原因,因此上述数据不能作为目标角精度的正式验收;另有2份记录未完成回正,属于手动停止、小角度超时或其他原因仍待确认。轮组积分也不能替代绝对世界航向。
## 待解决
### 完整停车作业流程尚未实现
- 缺少或未接入新版流程:轮胎识别、自动钻车、夹抱/释放动作编排、完整安全状态机。
- 现有 `PilotConfig` 和IO字段不能视为业务流程已经完成。
### 多车执行链仍未完成
- 纯计算链 `FleetState → FleetController → FleetMotionCommand → FleetKinematics.Decompose()` 已实现,并有6个车队控制周期场景和4个刚体分解场景通过。
- `PilotConfig.cs` 的多车区域在 `#if false` 中,不参与当前编译。
- 当前仍没有布局采集/激活、车队状态估计、通信接收与时间对齐、相对布局闭环、能力限幅、安全降级、成员底盘发送和多车实车测试闭环,因此不能把纯计算层视为可运行的多车功能。
### 轮组速度初始化回退语义不一致
- `WheelFeedbackVehicleStateProvider` 在轮组首帧无效时局部选择Detour `Omega`,但随后以 `hasValidVelocityEstimate=false` 构造 `VehicleState``VehicleState` 会把整份速度对外置零,因此该Detour角速度回退实际不可见。
- 影响仅限轮组滤波尚未形成有效采样的初始化阶段;应确认期望是保持整份速度无效并置零,还是允许单独提供有效的Detour角速度,再决定是否修改代码和注释。
### 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现象不应继续归因于控制算法计算量。
- 2026-08-25静止诊断确认:目标角和角速度前馈均为零时,右后轮仍可形成约1s量级的持续差速转舵往复;死区由0.1°增至0.5°后,另外三轮均停止输出,但一次自转模式切回正常模式后的右后轮仍在约-1.9°至+2.9°间振荡。约2°的瞬态偏差本身不能证明硬件故障,待定位对象是仅该轮不收敛的闭环动态差异;应先用降低公共比例增益的重复切换实验区分控制稳定裕量,再对四轮分别辨识延迟、增益、摩擦和方向不对称,明显离群轮组先排查编码器、机械间隙和低速驱动响应。
- 不同速度、载荷下的舵轮物理响应和前馈参数仍需按具体工况验证。
- 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`