06 - 信号录制与回放

解决 P8(回放能力弱:路测 bug 难复现)。现有 LogPropMonitor.py 只能按 log 顺序回放、无精确时间戳/场景编排/可视化。本篇给三层录制回放方案 + LogPropMonitor 升级路径。

🔎 AAOS 官方 JSON 重放机制JsonFakeValueGenerator)详见专题篇 06b

⚠️ 透明声明:录制回放专向 agent 因 API 周配额耗尽(2026-07-12 17:12 重置)未跑完,本篇基于 CAN agentAAOS 官方 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 根源):

  1. 无精确时间戳:按 log 出现顺序立即注入,不保留原始时间间隔。
  2. 无场景编排:不能定义”开门→挂挡→行驶”组合场景。
  3. 无可视化:看不到信号波形/时序。
  4. 单向(只回放,不录制):依赖 logcat 已有的 prop 变化日志,不能主动录制整车信号。
  5. ⚠️ 依赖 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.pypackages/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.logcan-utils行业事实标准,纯文本 (ts) iface id#data✅ CAN 录制首选
MCAPFoxglove新一代机器人/信号格式,支持任意 channel,Python/C++ 读写✅ 通用录制(跨信号源)
rosbag2ROS录制回放事实标准,可脱离 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 时序对齐
SavvyCANCAN GUI 抓包/回放/实时曲线(加载 DBC)✅ CAN 侧波形(03

现有手段全命令行无波形(P5/P8)——引入 Plotjuggler/Foxglove 能直接看到”为什么这次 UI 闪了一下”。


6. 时间戳精确回放的关键(核心价值)

回放的价值在于时序保真。要点:

  1. 录制时记 monotonic 时间SystemClock.elapsedRealtimeNanos,与 CarPropertyValue.timestamp 一致),不用 wallclock(避免系统对时跳变)。
  2. 回放按 Δt 排队:相邻两条信号的 t[i+1]-t[i] 作为 sleep 间隔,通过 dumpsys --mock_from_car 或脚本注入。
  3. 处理丢帧:录制若采样不均,回放可插值或标注。

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 录制回放)。