← 返回目录

航行日志分析程序改进方案(对照协议故障表)

项 内容
版本 v1.0
日期 2026-05-31
依据 协议说明截图(故障位 / 故障详情 / 状态 / 告警)
对照代码 trajectory-log-analyzer/tla/esc_faults.py、fault_engine.py、session_analyzer.py
当前分析器版本 1.0.2

1. 结论:有没有调整价值?

有,且建议分阶段做。 协议表把「故障 / 告警 / 状态」分层写清楚了,而当前分析程序仍是数据驱动反推码表 + 少量 ESC/ECU/BMS 掩码,与 App/协议展示存在三类差距:

  1. 码表不完整:协议里十几种故障,分析器只稳定识别 4 个 ESC + 3 个 ECU + 4 个 BMS 掩码。
  2. 「板体失控」口径未固化:研发三条(堵转 / 0x400000 / 转速超范围)未合成独立字段,报表只能猜。
  3. 语义存在固件分支差异:0x400000 在协议/App 与 feature_motorstuck 固件里可能不是同一含义(见 §3)。

不做调整的风险:后台「故障会话」与 App 弹窗、研发复盘口径继续不一致;版本监控和失控案例筛选漏检/误报。


2. 协议表与日志字段的关系(先对齐层级)

2.1 日志里实际有的字段(分析器已用)

轨迹点字段 用途
escEventCode ESC 上报事件(running_error << 16 等合成)
ecuEventCode ECU 侧故障/通信类
bmsEventCode BMS 侧故障
motorSpeed 主机侧转速反馈(含冻结、脏包、超范围)
throttleLeverQuantity 油门
electricCurrent 电流
mode 模式(如 99 断驱等)

2.2 协议表里的分层(截图)

层级 示例 分析器现状
故障位 bit0.1–0.25 stall_fault、fall_fault、motor_fault… 未按协议索引建模
故障详情 1–24 过流、堵转、通讯超时、蓝牙、IMU、倾斜、跌落、碰撞、急停… 部分掩码可对应,多数未命名
状态 standby / running / charging / fault / ota 未入库(可从 mode 推导)
告警 低电量、高温、超速、偏航 未单独统计(与故障混淆)

重要: 协议「故障序号」≠ 日志 escEventCode 的 bit 位置,需一张对照表由研发确认后写进 esc_faults.py,不能仅靠截图序号硬猜。


3. 「板体失控」三条条件 — 对照协议与代码

研发口径(你方确认):

# 条件 日志检测方式 当前程序
1 堵转 0x20000 escEventCode & 0x20000 ✅ stall_points
2 0x400000 escEventCode & 0x400000 ✅ overvoltage_points(命名按过压)
3 转速 < -20000(固件亦含 ≥20000) motorSpeed 超范围 ❌ 未实现(仅有 D4A081 脏包 corrupt_speed_points)

3.1 关于 0x400000 的语义风险(必须和研发确认)

来源 对 0x400000 的解释
当前分析器 / JetWave.xml 过压保护 ESC_FAULT_OVERVOLTAGE_PROTECTION
协议截图(bit0.22 / 部分行) 有资料写成 跌落 fall_fault 等
feature_motorstuck 固件 异常转速误置 runningError bit6 → 上报成 0x400000(语义错误,非真过压)

建议: 分析器保留掩码检测,但展示名改为中性 ESC_EVENT_0x400000,并在报表/tooltip 注明「可能是过压 / 固件误映射 / 协议跌落位,需结合转速与电流判断」。
确认后再决定是否改名为 fall_fault 或拆成两列。

3.2 第 3 条应与固件一致

固件(15265 报告):

if (escSpeedInfo->speed <= -20000 || escSpeedInfo->speed >= 20000)

分析器应新增(与 D4A081 脏包并列):

def is_invalid_motor_speed(motor_speed) -> bool:
    v = int(motor_speed)
    return v <= -20000 or v >= 20000

统计 → invalid_speed_points(或 speed_out_of_range_points)。


4. 协议故障表 vs 当前码表差距矩阵

协议/常见含义 建议日志掩码(待研发签字) 分析器 v1.0.2
过流 over_current 0x10000? ❌
过温 over_temp 0x40000? ❌
堵转 stall_fault 0x20000 ✅
通讯超时 comm_timeout ECU 0x40000000? 或 ESC 其他位 部分(仅 ECU 计数)
蓝牙 bt_fault mode/连接状态,未必在 escEvent ❌
IMU imu_fault 待确认 BMS/ECU/ESC ❌
倾斜 tilt_fault 待确认 ❌
跌落 fall_fault 0x400000? ⚠️ 当作过压统计
碰撞 collision_fault 待确认 ❌
急停 emergency_stop 待确认 ❌
过压(真过压) 与 0x400000 可能冲突 ⚠️ 同上
空转 / 其他 0x800000 等高频未知 仅 unknown 名

BMS 侧(协议未逐条列出但数据很多): 0x10/0x20/0x400/0x1000 已统计,但 has_fault=1 常仅因 BMS,导致「故障会话」很多 severity=none(如 8668),报表易误解。


5. 现状问题(结合报表与协议)

问题 影响
无 has_board_out_of_control 无法按研发三条 OR 一键筛失控案例
无 invalid_speed_points 漏检「超范围转速」;与 D4A081 脏包混淆
has_fault 过宽 BMS 轻微码也算故障,和 App「红色故障」不一致
severity 与协议故障等级无关 自研打分,难对应「故障 / 告警」
故障命名绑定错误语义 0x400000 标成过压,motorstuck 分支下误导
告警未建模 低电量、高温、超速等无法和故障分栏
状态未建模 running/fault/ota 无法过滤分析任务

6. 改进目标

  1. 与协议/App 展示同源:故障名、图标类别可映射。
  2. 板体失控可复现:三条条件固化为字段 + 报表筛选。
  3. 可演进码表:研发更新协议时只改 esc_faults.yaml / 表,不改核心逻辑。
  4. 向后兼容:旧 stall_points 等保留,新增字段增量迁移。

7. 方案设计

7.1 码表外置(P0)

新增 trajectory-log-analyzer/tla/fault_catalog.yaml(或 DB 表 surf_fault_code_dict):

esc:
  - code: ESC_FAULT_STALL_PROTECTION
    mask: 0x20000
    protocol_name: stall_fault
    display_zh: 电机堵转
    board_out_of_control: true
  - code: ESC_EVENT_0x400000
    mask: 0x400000
    protocol_name: TBD  # fall_fault | overvoltage
    display_zh: ESC事件0x400000
    board_out_of_control: true
    notes: motorstuck 分支可能为异常转速误映射
motor_speed:
  - rule: out_of_range
    min: -20000
    max: 20000
    board_out_of_control: true
  - rule: corrupt_d4a081
    field: motorSpeed
    board_out_of_control: false  # 归类为通信/数据异常

esc_faults.py 改为加载 YAML,生成 match_* 与 fault_detail 行。

7.2 板体失控合成字段(P0)

会话级:

board_out_of_control = (
    stall_points > 0
    or esc_0x400000_points > 0   # 重命名 overvoltage_points 或双写
    or invalid_speed_points > 0
)

入库:

ALTER TABLE surf_motion_trajectory_analysis
  ADD COLUMN invalid_speed_points INT NOT NULL DEFAULT 0 COMMENT '|motorSpeed|>=20000 点数',
  ADD COLUMN has_board_out_of_control TINYINT(1) NOT NULL DEFAULT 0 COMMENT '板体失控(研发三条OR)',
  ADD COLUMN fault_domain_primary VARCHAR(16) NULL COMMENT 'esc|ecu|bms|motor|comm 主因';

analyzer_version → 1.0.3,触发旧数据重算。

7.3 故障 / 告警 / 异常 三分(P1)

类型 判定 报表
协议故障 协议掩码表命中 ESC/ECU/BMS 对齐 App 故障图标
告警 电量/温度/超速阈值(点级或会话级) 黄色告警栏
数据异常 D4A081、trajectory_gaps、空轨迹 研发向,不进「用户故障」

新增 has_protocol_fault、has_warning,has_fault 改为 OR 关系且可配置。

7.4 扩展 ESC/ECU 掩码(P1,需研发确认)

优先补充(日志已见高频 0x800000 等):

掩码 临时名 协议候选
0x10000 ESC_OVERCURRENT over_current
0x40000 ESC_OVERTEMP over_temp
0x800000 ESC_UNKNOWN_800000 待命名
0x1000000 ESC_UNKNOWN_1000000 待命名
ECU 0x40000000 ECU_COMM_FAULT comm_timeout

7.5 严重度与评分(P2)

stall_score 保留,改为辅助排序,不作为唯一严重度来源。

7.6 报表 / API(P1)

筛选项 SQL 条件
板体失控 has_board_out_of_control = 1
堵转 stall_points > 0
ESC 0x400000 esc_0x400000_points > 0
转速异常 invalid_speed_points > 0
脏包转速 corrupt_speed_points > 0
仅 BMS has_fault=1 AND stall_points=0 AND ...

会话列表增加列:has_board_out_of_control、invalid_speed_points、fault_domain_primary。


8. 实施计划

阶段 内容 工作量 产出
P0 invalid_speed_points + has_board_out_of_control;0x400000 中性命名;analyzer_version=1.0.3 1–2 天 可筛失控三条
P0 研发确认《日志掩码 ↔ 协议故障表》对照页(1 页纸) 依赖研发 避免误映射
P1 fault_catalog.yaml + 扩展 5–8 个掩码 2–3 天 故障明细与 App 对齐
P1 has_protocol_fault / has_warning 拆分 1 天 报表统计口径清晰
P2 告警阈值(电量/温度/超速) 2 天 对齐协议「告警」区
P2 日聚合表增加 session_board_out_of_control 计数 0.5 天 版本/设备趋势

9. 建议研发确认清单(阻塞 P1)

  1. 日志 escEventCode 每个已知 bit 与协议表 1–24 的一一映射。
  2. 0x400000 在量产权 App 协议里究竟是过压、跌落还是「ECU 误映射位」。
  3. motorSpeed 单位是否与固件 speed 一致(0.1 rpm?),-20000 阈值是否直接用于日志。
  4. ecuEventCode=0x40000000 是否对应「通讯超时 / 板体失控」类。
  5. 蓝牙断链看 mode=255 还是独立故障位?
  6. 告警(低电量、高温)是否写入 bmsEventCode/escEventCode 还是仅 App 本地?

10. 改完后如何验证

用例 期望
15265 / 14873 stall_points>0,has_board_out_of_control=1
含 D4A081 脏包 corrupt_speed_points>0,invalid_speed_points 可能为 0
含 -25000 转速(非 D4A081) invalid_speed_points>0
仅 BMS 0x20 has_fault=1 但 has_board_out_of_control=0(若配置排除 BMS)
8668 类会话 报表可区分「BMS 故障」与「板体失控」

11. 是否建议立刻改?

场景 建议
马上要上线定时分析 先上 P0(三条失控 + 新字段),码表扩展可下一版
报表已给用户看 同步改前端筛选与图例,注明 0x400000 待确认
仅内部研发复盘 P0 + 研发确认清单并行

不建议在未确认 0x400000 语义前,把 overvoltage_points 直接改名为 fall_fault 或仅保留过压文案。


12. 相关文件(改动触点)

trajectory-log-analyzer/
  tla/esc_faults.py          # 码表扩展 / YAML 加载
  tla/fault_engine.py        # 评分与 domain 主因
  tla/session_analyzer.py    # 新字段汇总
  sql/migrations/            # ALTER 新列
  sql/surf_motion_trajectory_analysis.sql
analysis/
  esc_faults.py              # 与 tla 同步

附录 A:板体失控推荐 SQL(P0 后)

SELECT trajectory_id, remote_sn, session_date,
       stall_points, overvoltage_points AS esc_0x400000_points,
       invalid_speed_points, corrupt_speed_points,
       has_board_out_of_control, severity
FROM surf_motion_trajectory_analysis
WHERE has_board_out_of_control = 1
ORDER BY session_date DESC;

附录 B:当前已覆盖掩码(v1.0.2)

ESC: 0x20000 0x400000 0x800000 0x1000000 0x2000000 0x4
ECU: 0x40000000 0x80000000 0x8000000
BMS: 0x20 0x10 0x1000 0x400
转速: 仅 0xD4A081xx 脏包(非 ±20000)