结论:process_replay 的 ProcessConfig 里 pubs 是注入给进程的主题,subs 是采集进程输出的主题——与被测进程自己的发布 / 订阅视角相反。回放的「首帧」「双摄齐备」「输出主题周期」都是测试调度逻辑,给出的是功能回归证据,不等于实时车载时序:processing_time 只用于给输出合成 logMonoTime,不是测量到的运行时延。固定快照基线为 c8fb906,本文对原版三个回调做了 AST 隔离探针,不启动任何受管进程。
配置字段与调用顺序
ignore 和 tolerance 由测试比较器消费;processing_time 仅给输出合成 logMonoTime;timeout 控制单个 run_step() 周期。vision_pubs 把相机状态与额外 VisionIPC 帧发送关联起来。注意 ignore_alive_pubs 在两个模型配置中赋值,但该字段在本回放模块没有读路径,不能把它当作已实现的存活校验豁免。
get_process_config() 从表中深拷贝配置;ProcessContainer.__init__() 再深拷贝配置及受管进程,故有状态触发器通常每次回放独立。start() 依次建立隔离前缀、Params / 环境、config_callback、fake 事件、Pub / Sub、可选 VisionIPC、进程,再执行 init_callback。ProcessConfig.__post_init__() 对普通 MessageBasedRcvCallback 自动把触发主题设为 main_pub,模型配置则显式指定 VisionIPC 端点——后者的事件同步点是图像流端点,不能简单等同相机状态消息自身。
14 个进程配置速查
下表是回放触发逻辑,不是车型支持或测试实际覆盖矩阵;默认测试会排除两个模型进程。各行 pubs / subs 的完整清单以 CONFIGS 定义为准。
| 进程 | 回放触发 / 同步入口 | 主要输出 |
|---|---|---|
selfdrived |
carState,并设置 first_frame=True |
selfdriveState、onroadEvents |
controlsd |
selfdriveState |
carControl、controlsState |
card |
can 输出频率与 sendcan 启动门,main_pub_drained=True |
sendcan、carState、carParams、carOutput、radarTracks |
radard |
modelV2 |
radarState |
plannerd |
modelV2 |
longitudinalPlan、driverAssistance |
calibrationd |
cameraOdometry,first_frame=True |
extrinsicsCalibration |
dmonitoringd |
driverStateV2 |
driverMonitoringState |
locationd |
cameraOdometry |
deviceMotion(合成处理时间 10 ms) |
paramsd |
deviceMotion |
vehicleParameters |
lagd |
deviceMotion |
lateralDelay |
ubloxd |
没有回调:每条被注入消息都可结束一轮 | ubloxGnss、gpsLocationExternal |
torqued |
deviceMotion,first_frame=True |
lateralTorqueParameters |
modeld |
双路道路相机状态标志;主入口为窄路 VisionIPC 端点 | modelV2、drivingModelData、cameraOdometry |
dmonitoringmodeld |
cabinCameraState;主入口为座舱 VisionIPC 端点 |
driverStateV2 |
除 locationd 外,显式 processing_time 是 selfdrived / card / paramsd 的 4 ms 和两个模型的 20 ms,其余默认 1 ms。这些值用于回放中不同进程输出的排序,不能拿来证明对应进程在硬件上达到该延迟。
ignore / tolerance 由测试比较器消费,属于输出比对边界,而不是进程行为的一部分;调整它们改变的是「通过」的定义,而非被测逻辑本身。ubloxd 没有回调,每条被注入消息都可结束一轮——这类「无触发门」的进程在回放里最容易产生与真实节拍不同的批次划分。模型配置的 fake 事件主入口是图像流端点(窄路或座舱 VisionIPC),而不是相机状态消息本身。
触发器逐函数行为
MessageBasedRcvCallback.__call__() 返回「当前主题是触发主题」或「first_frame=True 且 frame==1」。这里的 frame 实际是 run_step() 完成周期后递增的 self.cnt。对非触发主题做隔离探针,计数为 0、1、2 时结果依次为 False, True, False;因此「首帧」并不意味着第一个到达的输入无条件结束周期。
| 触发器 | 探针结果与含义 |
|---|---|
ModeldCameraSyncRcvCallback |
双摄时两路出现标志齐备才返回真并复位;单摄时窄路出现即可。输入 wide, wide, narrow 结果为 False, False, True——只追踪出现标志,不匹配 frameId,也不验证宽 / 窄帧同一时刻。 |
card_rcv_callback |
只对 can 计算输出主题周期 frame % int(can频率 / 输出主题频率),且 sendcan 在 (frame - 1) < 2000 时从候选主题删掉。频率相同且仅 sendcan 为输出时,周期计数 0、1、2000、2001 返回 False, False, False, True。 |
selfdrived_config_callback |
把 cfg.pubs 由列表改为集合差值,删除 GPS 二选一的一侧。 |
card_fingerprint_callback |
初始化时喂入最多 300 条 CAN,等待 CarParams 出现;get_car_params_callback() 优先按指定指纹构造参数,否则用 CAN、固件查询跳过标志和缓存去识别车型。 |
某一路相机缺失时消息会在 msg_queue 中继续累积,不能把「已等齐两路」解释为视觉同步已验证。card_rcv_callback 是测试初始化阶段的输出采集门,不是车端允许发送 CAN 的 safety 决策;配置的频率比还需保持可除且 int 后非零,源码没有在此函数显式校验非法配置。
对插件化与自制硬件的含义
新增插件不能只注册一个进程名:应同时声明输入 / 输出主题、schema、触发帧或时间门、初始 Params、相机帧关联键、输出完整性和故障策略。回放配置要能区分「收到任意消息」「收到触发主题」「同一 frameId 的双摄齐备」和真实 deadline;当前回放的标志同步与合成时间戳只给出功能回归证据。自制相机 / 计算板还须独立验证时间戳域、丢帧 / 重复帧、IPC 缓冲寿命、端到端帧年龄、超时回退,以及 panda / opendbc 的发送限制。本文未运行目标硬件或完整回放。
常见问题
pubs 和 subs 到底哪个是给被测进程的?
pubs 是注入给进程的主题,subs 是采集进程输出的主题,与被测进程自己的发布 / 订阅视角相反。混淆两者会读错回放配置。
回放的 processing_time 是真实运行时延吗?
不是。processing_time 只给输出合成 logMonoTime,用于回放中不同进程输出的排序。显式值有 selfdrived / card / paramsd 的 4 ms 与两个模型的 20 ms,其余默认 1 ms;不能拿来证明硬件达到该延迟。
双摄对齐在回放里有校验吗?
没有校验同一时刻。ModeldCameraSyncRcvCallback 只追踪宽 / 窄两路「出现」标志,标志齐备即返回真,不匹配 frameId。探针输入 wide, wide, narrow 得到 False, False, True。
「已等齐两路」能说明视觉同步已验证吗?
不能。回放只检查出现标志;某一路缺失时消息会在 msg_queue 中继续累积。「首帧」也不意味着第一个到达的输入无条件结束周期——它依赖周期计数在 1 时被其他条件允许。
延伸阅读
- 进程回放验证总览:调度主链与证据边界 —— 承接本文配置字段与调用顺序。
- 回放引擎:日志注入、进程编排与输出比较 —— 解释 pubs/subs 与合成时间戳的落点。
- 安全测试台的回放证据:什么算合格 —— 说明回放只给功能回归证据。
- 回放容器与调度器:参数与进程生命周期 —— 承接本文
ProcessContainer深拷贝与初始化顺序。
参考资料
- 项目 02 ——
openpilot-research/PROCESS_REPLAY_CONFIG_TRIGGER_SYNC_CONTRACT_DEEP_DIVE.md(取用了ProcessConfig字段、14 个CONFIGS、触发器探针行为与插件化含义分析)。
说明:本文为对固定源码快照的静态结构分析,未运行完整测试套件、未连接硬件、未验证目标车型的真实参数组合。文中所有阈值、行号索引与配置均出自源文档,标注为未验证的结论保留其原有边界。
更新记录
首次发布 2026-10-11 最近核对:2026-10-11
发表回复