debug UI和ACC稳定性的分析

来自Trae扫描0.8.13, d2, r2三个分支所有代码后的分析:Debug UI 和 ACC 故障分析报告

1. UI 界面差异分析 (Debug 信息缺失问题)

1.1 问题描述

0.8.13 分支中存在的行驶角度 (Steering Angle)、预期角度 (Desired Angle)、发动机转速 (RPM) 等 Debug 信息,在 r2d2 分支中消失,且无法找到开启选项。

1.2 代码差异分析

通过对比三个分支的代码,发现主要差异集中在配置项、数据结构定义以及数据填充逻辑上。

1.2.1 配置项 (dp_conf.py)

  • 0.8.13: 存在 dp_ui_side 参数。

    • dp_conf.py: {'name': 'dp_ui_side', 'default': False, ...}

    • 该参数用于控制是否显示侧边栏的详细 Debug 信息。

  • r2 / d2: 在 common/dp_conf.py (或同等位置) 及代码库中搜索 dp_ui_side,未找到任何匹配项。

    • 结论: 控制该 UI 显示的开关配置已被移除。

1.2.2 数据结构 (log.capnp)

Debug 信息需要通过 IPC 消息从 controlsd 传递给 UI。

  • 0.8.13: cereal/log.capnp 中的 ControlsState 结构体包含特定字段:

     struct ControlsState {
       ...
       angleSteers @13 :Float32; # dp
       steeringAngleDesiredDeg @29 :Float32; # dp
     }

  • r2 / d2: ControlsState 结构体中移除了上述带有 # dp 标记的字段。

    • 结论: 底层通信协议中不再包含这些 Debug 数据,UI 即使想显示也无法获取数据源。

1.2.3 数据填充逻辑 (controlsd.py)

1.3 修复建议

如果需要在 r2 / d2 中恢复该功能,需要:

  1. cereal/log.capnpControlsState 中加回 angleSteerssteeringAngleDesiredDeg 字段。

  2. selfdrive/controls/controlsd.pypublish_logs 函数中,将当前角度和预期角度赋值给上述字段。

  3. 修改 UI 代码 (C++/Qt) 以读取这些字段并渲染。

2. ACC 故障分析 (r2 分支巡航偶发故障)

2.1 问题描述

r2 分支在巡航行驶时,一共行驶了 40 公里路程(速度区间 30-70 公里/小时),遇到了 3 次触发 ACC 相关功能全部报故障,重新点火可以恢复。相比之下,0.8.13d2 分支在该工况下表现非常稳定。

2.2 原因分析

2.2.1 关键差异:目标丢失保护逻辑 (Missing Lead Logic)

对比 r2d2controlsd.py,发现 d2 引入了针对前车目标丢失的特定处理逻辑,而 r2 缺失。

  • d2 分支: 包含 DP_LONG_MISSING_LEAD_SPEED (默认为 70 kph) 和 DP_LONG_MISSING_LEAD_COUNT 定义。

    • 这意味着 d2 有一套机制来处理特定速度(约 70km/h 分界)下的前车信号丢失问题。

    • 用户行驶速度覆盖 30-70 km/h,正是该逻辑可能生效或起到保护作用的区间。

  • r2 分支: 代码中完全没有搜索到 DP_LONG_MISSING_LEAD 相关逻辑。

2.2.2 潜在原因:转向饱和 (Steer Saturation)

在 30-70km/h 的中低速段,车辆对转向指令的响应较为敏感。如果 r2 的横向控制参数(PID/INDI/LQR)未针对此速度段进行充分优化,可能在弯道或修正方向时触发 steerSaturated

  • 逻辑路径:

    1. 车辆在 30-70km/h 区间行驶。

    2. 遇到路面起伏或弯道。

    3. controlsd.py 计算出的 desiredLateralAccelactualLateralAccel 偏差过大。

    4. 触发 EventName.steerSaturated

    5. 连续触发导致 ACC 退出。

2.3 结论

r2 分支的故障很可能是由于鲁棒性逻辑缺失导致的。用户在 40 公里行程中遇到 3 次故障,频率较高,且 d2 分支明确存在 DP_LONG_MISSING_LEAD 这样针对性的修复逻辑而 r2 没有,这极有可能是导致 r2 在常态巡航(特别是涉及跟车目标变化时)不稳定的核心原因。

2.4 解决建议

  1. 代码同步: 强烈建议将 d2 分支中 selfdrive/controls/controlsd.py 关于 DP_LONG_MISSING_LEAD 的逻辑移植到 r2

  2. 验证修复: 移植后,在相同路段(30-70km/h)进行路测,观察是否还有故障复发。