来自Trae扫描0.8.13, d2, r2三个分支所有代码后的分析:Debug UI 和 ACC 故障分析报告
1. UI 界面差异分析 (Debug 信息缺失问题)
1.1 问题描述
在 0.8.13 分支中存在的行驶角度 (Steering Angle)、预期角度 (Desired Angle)、发动机转速 (RPM) 等 Debug 信息,在 r2 和 d2 分支中消失,且无法找到开启选项。
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 中恢复该功能,需要:
在
cereal/log.capnp的ControlsState中加回angleSteers和steeringAngleDesiredDeg字段。在
selfdrive/controls/controlsd.py的publish_logs函数中,将当前角度和预期角度赋值给上述字段。修改 UI 代码 (C++/Qt) 以读取这些字段并渲染。
2. ACC 故障分析 (r2 分支巡航偶发故障)
2.1 问题描述
r2 分支在巡航行驶时,一共行驶了 40 公里路程(速度区间 30-70 公里/小时),遇到了 3 次触发 ACC 相关功能全部报故障,重新点火可以恢复。相比之下,0.8.13 和 d2 分支在该工况下表现非常稳定。
2.2 原因分析
2.2.1 关键差异:目标丢失保护逻辑 (Missing Lead Logic)
对比 r2 和 d2 的 controlsd.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。
逻辑路径:
车辆在 30-70km/h 区间行驶。
遇到路面起伏或弯道。
controlsd.py计算出的desiredLateralAccel与actualLateralAccel偏差过大。触发
EventName.steerSaturated。连续触发导致 ACC 退出。
2.3 结论
r2 分支的故障很可能是由于鲁棒性逻辑缺失导致的。用户在 40 公里行程中遇到 3 次故障,频率较高,且 d2 分支明确存在 DP_LONG_MISSING_LEAD 这样针对性的修复逻辑而 r2 没有,这极有可能是导致 r2 在常态巡航(特别是涉及跟车目标变化时)不稳定的核心原因。
2.4 解决建议
代码同步: 强烈建议将
d2分支中selfdrive/controls/controlsd.py关于DP_LONG_MISSING_LEAD的逻辑移植到r2。验证修复: 移植后,在相同路段(30-70km/h)进行路测,观察是否还有故障复发。