06 - 信号录制与回放
解决 P8(回放能力弱:路测 bug 难复现)。现有
LogPropMonitor.py只能按 log 顺序回放、无精确时间戳/场景编排/可视化。本篇给三层录制回放方案 + LogPropMonitor 升级路径。🔎 AAOS 官方 JSON 重放机制(
JsonFakeValueGenerator)详见专题篇 06b。⚠️ 透明声明:录制回放专向 agent 因 API 周配额耗尽(2026-07-12 17:12 重置)未跑完,本篇基于 CAN agent、AAOS 官方 agent、业界 agent 的交叉结论 + 录制回放 agent 已完成的子任务(FakeVehicleHardware replay / vhal_emulation.py)+ 通用知识撰写。配额恢复后可深化(尤其 AAOS 公开 CarProperty 录制→JSON/CSV→重放工具链)。
1. 为什么需要录制回放
| 场景 | 现状痛点 | 录制回放价值 |
|---|---|---|
| 路测捕获的信号 bug | ”找车试一试”复现,成本高 | 录下来,开发机反复重放 |
| 充电曲线/档位切换等时序敏感 | 时序难手动还原 | 按原时间戳精确重放 |
| 一次完整驾驶循环 | 逐个 mock 不现实 | 整车信号序列一次回放 |
| 边缘/异常路径 | 真车难触发 | 录制后随时复现 |
2. 现状:LogPropMonitor.py 的能力与不足
能力(外部 Q&A 文档记录):
python LogPropMonitor.py xxxx.log # 解析 logcat prop 变化并模拟注入
python LogPropMonitor.py xxxx.log --save_only # 转储为 cmd_list.sh
python LogPropMonitor.py xxxx.log --output out.sh --exec # 转脚本并执行不足(P8 根源):
- ❌ 无精确时间戳:按 log 出现顺序立即注入,不保留原始时间间隔。
- ❌ 无场景编排:不能定义”开门→挂挡→行驶”组合场景。
- ❌ 无可视化:看不到信号波形/时序。
- ❌ 单向(只回放,不录制):依赖 logcat 已有的 prop 变化日志,不能主动录制整车信号。
- ⚠️ 依赖 log 质量:logcat 没打印的 prop 变化无法回放。
3. 三层录制回放方案(按注入层,验证范围递增)
App 层回放(LogPropMonitor 升级) ← 最易落地,验证 App UI
VHAL 层回放(vhal_emulator/FakeVHAL replay) ← 验证 CarService 链路
CAN 层回放(candump/canplayer) ← 验证全链路(含 vehiclecore 解析)
3.1 CAN 层:candump + canplayer(真车录制黄金组合,⭐最完整)
CAN agent 交叉印证——行业事实标准,开源、零成本:
# 真车录制(若车机内核开了 SocketCAN)
candump -l can0 # 生成 candump-YYYY-MM-DD_HHMMSS.log
# PC 回放(精确保留原始时间戳间隔)
canplayer -I candump.log vcan0 # 在 vcan0 上按原时序重放
# 配合解码看信号
canplayer -I candump.log vcan0 & candump vcan0 | cantools decode xiaomi.dbc --single-line- 价值:录制的是真实 CAN 帧,回放逐位一致,能验证 vehiclecore 的 DBC 解析/映射/值转换全链路。
- 限制:Android 车机内核默认不开 SocketCAN → 真车侧录制受限(见 03 §4);PC 侧回放需打通 vehiclecore。
candump.log格式是行业事实标准,几乎所有 CAN 工具都能读。
3.2 VHAL 层:vhal_emulator.py / FakeVehicleHardware replay
AAOS 官方 agent + 录制回放子任务 67 交叉印证:
vhal_emulator.py(packages/services/Car/tools/emulator/):host 端通过 SocketComm(端口 33452)连设备 FakeVehicleHardware,可编程设值。同目录driving_info_generator.py读 GPX 轨迹文件,回放为车速/挡位/位置信号——即”录制一段轨迹→回放成车信号”。- FakeVehicleHardware + JsonFakeValueGenerator(录制回放子任务 #6):AOSP 默认 VHAL 支持 JSON 配置初始值,可加载一份录制好的 prop 值序列做回放。
- 限制:依赖 default VHAL + SocketComm,小米真机 vendor VHAL 没集成(02 §4)→ 仅模拟器/Cuttlefish 可用。
- 对小米:这套是 Cuttlefish 离线环境下做”信号序列回放”的官方机制(配合 04 模拟器篇)。
3.3 App 层:LogPropMonitor.py 升级(⭐最易落地)
不改设备、不依赖 CAN/VHAL 环境,直接升级现有脚本(见 §5)。
4. 录制格式对比
| 格式 | 来源 | 特点 | 对小米适用性 |
|---|---|---|---|
| candump.log | can-utils | 行业事实标准,纯文本 (ts) iface id#data | ✅ CAN 录制首选 |
| MCAP | Foxglove | 新一代机器人/信号格式,支持任意 channel,Python/C++ 读写 | ✅ 通用录制(跨信号源) |
| rosbag2 | ROS | 录制回放事实标准,可脱离 ROS 用 | △ 偏重,引入 ROS 栈 |
| protobuf/自定义 | 自研 | 灵活,但要自己写读写 | △ 兜底 |
| GPX | 标准 | 轨迹(经纬度+时间),配合 driving_info_generator | △ 仅驾驶轨迹场景 |
建议:CAN 侧用 candump.log(行业标准);App/VHAL 侧如需通用录制,用 MCAP(生态好、可接 Foxglove 可视化)。
5. 可视化(让信号波形可见)
| 工具 | 定位 | 对小米 |
|---|---|---|
| Plotjuggler | 实时/离线时序数据可视化(ROS/CSV/自定义) | ✅ 画 prop 时序图,复现 bug 直观 |
| Foxglove Studio | 可视化 + 回放 MCAP/rosbag,可接自定义数据源 | ✅ 充电曲线/多 prop 时序对齐 |
| SavvyCAN | CAN GUI 抓包/回放/实时曲线(加载 DBC) | ✅ CAN 侧波形(03) |
现有手段全命令行无波形(P5/P8)——引入 Plotjuggler/Foxglove 能直接看到”为什么这次 UI 闪了一下”。
6. 时间戳精确回放的关键(核心价值)
回放的价值在于时序保真。要点:
- 录制时记 monotonic 时间(
SystemClock.elapsedRealtimeNanos,与 CarPropertyValue.timestamp 一致),不用 wallclock(避免系统对时跳变)。 - 回放按 Δt 排队:相邻两条信号的
t[i+1]-t[i]作为 sleep 间隔,通过dumpsys --mock_from_car或脚本注入。 - 处理丢帧:录制若采样不均,回放可插值或标注。
7. 小米落地路径
路径 A(⭐推荐,最易落地):升级 LogPropMonitor.py 为带时间戳的回放器
零设备依赖,1-2 人日:
1. 录制:循环 dumpsys get-property-value(或订阅 logcat prop 变化)→ 记 (timestamp, propId, areaId, value) 到 MCAP/JSON
2. 回放:读文件 → 按 Δt sleep → dumpsys --mock_from_car 注入
3. 可视化:导 CSV → Plotjuggler 看波形
解决 P8 的”无时间戳/无场景/无可视化”三项。
路径 B(CAN 侧,平台团队):真车 candump 录制 + PC canplayer 回放
见 03 §5 第二步,复现 vehiclecore 解析层 bug。
路径 C(云端,战略):参考 RemotiveCloud
业界 agent 印证:RemotiveLabs 的 RemotiveCloud 是云端驾驶循环录制库,开发者 HTTP 拉真实数据注入 AAOS——Volvo/P3/Ford 在用。小米自研 “Mi Car Signal Broker” 时可借鉴(10 路线图 P2)。
8. 结论与后续
| 子痛点 | 解药 | 落地门槛 |
|---|---|---|
| 无精确时间戳 | LogPropMonitor 升级按 Δt 回放(路径 A) | 低 |
| 真车录制回放 | candump -l + canplayer(路径 B) | 中(需 SocketCAN) |
| 无可视化 | Plotjuggler/Foxglove 导 CSV/MCAP | 低 |
| 云端驾驶循环 | 参考 RemotiveCloud(路径 C,战略) | 高 |
一句话:短期升级
LogPropMonitor.py为带时间戳+可视化的回放器(1-2 人日,解决 P8 大半);CAN 侧 candump/canplayer 是真车录制回放的行业标准;长期参考 RemotiveCloud 做云端录制库。后续:API 配额恢复后,可补深”AAOS 公开 CarProperty 录制→JSON/CSV→重放工具链”(如 google/automotive-design-for-android 参考仓库、Spectatio E2E 录制回放)。