shemps/byd-atto3-openpilot-port

GitHub: shemps/byd-atto3-openpilot-port

一份详尽的比亚迪 Atto 3 openpilot 移植逆向工程笔记,涵盖 CAN 总线拓扑、DBC 校正、指纹识别以及实车调试中的关键陷阱与解决方案。

Stars: 0 | Forks: 0

# BYD Atto 3 — openpilot 移植发现 让 openpilot 在一台 **2024款 BYD Atto 3(元 Plus EV)** 右舵出口版上实现转向和速度控制的逆向工程笔记。公开发布,以免下一个人重复踩坑。有用自取 — [MIT 授权](LICENSE),没有任何附加条件。 **ADAS 摄像头:** Veoneer MVS4 — Veoneer 零件号 `682212300`,BYD 零件号 `SC2EM-3619100A`,HW 0.0.4,SW 4.01.04。 **VIN WMI:** `LGX`。 **状态:** 横向 + 纵向控制均已在实车上正常工作,作为日常辅助驾驶监督使用,截至 2026-07-30。 相关上游工作:[opendbc PR #3337](https://github.com/commaai/opendbc/pull/3337) (Atto 3), [PR #3352](https://github.com/commaai/opendbc/pull/3352) (Sealion 7), [issue #2065](https://github.com/commaai/opendbc/issues/2065) (harness)。 如果我的发现与这些内容有冲突,会在下文注明。 ## 从这里开始:最耗费我时间的五件事 如果你什么都不看,也请看看这些。每一个都是静默失败 — 没有报错,但就是不起作用。 1. **在 Atto 3 上,`0x318` 是恒定的 `0xFF` 垃圾数据。** 真正的 EPS 状态位于 `0x1FC STEERING_TORQUE`。 从 `0x318` 读取状态会给你一个永久性的幽灵转向故障,看起来就像硬件问题一样。 2. **`gasPressed` 必须取自 `PEDAL.GAS_PEDAL`,而不是 `DRIVE_STATE.RAW_THROTTLE`。** `RAW_THROTTLE` 并不是踏板。 使用它会静默阻断纵向接管 — 没有报错,但就是永远无法接管。 3. **FW 查询必须使用 `0xF195`。** BYD 的 ECU 在 `0xF195` (SUPPLIER_SOFTWARE_VERSION) 上响应。查询 `0xF188` 会导致指纹识别静默返回空结果。所有 24 个 bus-0 ECU 都会应答 `0xF195`。 4. **线缆颜色无法区分总线。** 两个 CAN_H 都是粉色,两个 CAN_L 都是紫色。只有引脚位置能区分 chassis 和 private 总线。接反了就会把 CAN-FD 总线接到经典控制器上。 5. **EPS 在静止时需要持续接收到 `0x1E2` 数据流。** 如果在“横向激活”时才门控这些报文,EPS 会在每次停车时锁存 `STATE=11` — 横向控制在第一次停车后就会失效,仅靠 `REQ=1` 永远无法恢复。只要系统启用了,就要持续发送空闲的 `REQ=0` 报文。 ## Harness / 总线拓扑 P13 摄像头连接器,8 个引脚孔位,6 个已接线。来自 BYD 的 *端子定义* 文档,并已用万用表确认。这**推翻了**电路图 SVG 和广泛流传的博客引脚定义 — 它们都是错的。 | 引脚 | 信号 | 线缆 | |---:|---|---| | 1 | 摄像头 GND | 黑色 | | 2 | IG1 (开关控制 12 V) | 红/灰 | | 3 | Private CAN_H | 粉色 | | 4 | Chassis CAN_H | 粉色 | | 7 | Private CAN_L | 紫色 | | 8 | Chassis CAN_L | 紫色 | - **Chassis CAN** (引脚 4/8):经典 CAN,500 kbit/s。这是 openpilot 读写的总线。 - **Private CAN** (引脚 3/7):**CAN-FD**,数据相位约 2 Mbit/s。点对点连接,恰好两个节点 — MVS4 摄像头 ↔ Veoneer 77V12FLR 前向雷达。上面没有其他车辆 ECU。 - Bus 2 需要 **在 panda 处有 ~60 Ω 的终端电阻,并且 panda↔摄像头 之间要有牢靠的共地**。如果缺了任何一个, TX 负载就会产生 bit0Error / bus-off 风暴,看起来就像接线故障。 - 引脚 2 上的 IG1 是一根细的 0.35 mm² 低电流供电线 — 不要在上面挂负载。 **读取 private 总线:** 在带有此 slcan 固件版本的 CANable 2.0 Pro (STM32G431) 上,在**经典模式下打开总线 — 不要传递 `fd=True`。** 固件会通过经典的 USB 接口转发 FD 报文,python-can 可以正常解析它们。传递 `fd=True` 会让适配器完全静默(0 报文)。这有悖常理,并且浪费了我一下午的时间。 ## Chassis DBC 修正 全部来自实车抓包,而非推测。 - **BYD 校验和** (key `0xAF`,对字节 0..6 进行 nibble 求和,byte 8 = 校验和):在 **12 个 ID / 3.6 万+ 报文** 中验证了 **100% 准确**。 - **`WHEELSPEED_BR` 是 14 位,而不是 16 位。** Bit 62 是一个单独的有效标志位。 - **`0x1E2 STEERING_MODULE_ADAS`** — 独立证实了 #3337 中将之前为 `UNKNOWN` 的位读取为速率限制的做法。在真实驾驶中测量:`ANGLE_RATE_LIMIT_UPPER` 0…+251,`ANGLE_RATE_LIMIT_LOWER` 0…−252, 两者 `E2E_ALIVE` 位均为常量 1,校验和依然是 100%。 - **`0x32E ACC_CMD`** — #3337 中包含的 `ACCEL_CMD` 缩放比例是错误的;在此已更正。 - **`0x316` 和 `0x1E2` 是经过字节级精确验证的报文。** 改变其中的任何一位,摄像头和刹车模块就会触发失效保护 → AEB/ACC/LKS/LDWS 全部变为“受限”状态,并且在 8 个模块中锁存 DTC。我是通过尝试屏蔽“手握方向盘”提醒而发现这一点的。千万别这么做。在发送之前,将你输出的字节与原厂报文进行对比 (Diff)。那个提醒是摄像头的,不是你的。 ## 指纹识别 - **109-ID bus-0 指纹** 来源于 13 次驾驶中的 2320 万个报文。 - FW 查询配置必须使用 `0xF195` (见坑点 3)。#3337 目前附带的是一个占位用的 FW 指纹。 - 点火信号必须来自 CAN — `DRIVE_STATE (0x242)` 档位,任何有效档位 ⇒ 点火开启。如果没有 CAN 点火钩子,系统就永远无法进入 onroad 状态。 **已验证的 UDS 请求地址:** 摄像头 `0x704`,刹车/IPB `0x782`,EPS `0x783`,雷达 `0x7f2`, 驱动单元 `0x7E0`。 ## 雷达 Veoneer private-bus FD 数据流已解码并实时提供给 `radard` — 目标轨迹位于 `0x280–0x289`。 在主动 ACC 期间通过跨总线相关性分析得到了证实:**丰富的雷达轨迹仅存在于 private 总线上。** chassis 总线仅承载前车标志和加速指令。如果你在想是否可以跳过 FD 总线,这一点很重要 — 如果你需要轨迹,就不能跳过。 ## 安全 - 重写了 `safety_byd.h`,**仅适用于 Atto 3** (移除了 Han 系列)。TX 白名单 = `0x1E2`、`0x316`、`0x32E`。 - 测量了实际的角度和加速度包络,而不是照搬其他 BYD 车型的常量。 - **49/49 个离线 libsafety 验收测试** 通过。 ## 值得了解的实车行为 - 横向:在 EPS `STATE=10` 下持续接管。在 `0x1E2` 上以 50 Hz 进行角度控制。 - 纵向:平顺且持续,跟车,走停。某次行驶路线:5 次带恢复的接管停车, 起步延迟中位数约 0.6 秒,停车车间距 3.4–4.6 米。 - **不需要 MVS4 介入即可实现接管**,通过 LKAS 按钮实现,并关闭原厂 ACC。 ## 范围 — 这些适用于你的车吗? 在以下方向需保持怀疑态度: 1. **一辆车,一种组装。** 单台 2024 款右舵出口版 Atto 3。中国市场的和其他年份的组装可能会有所 不同。在 COVID 供应链危机期间,BYD 还使用了**混合的摄像头供应商 (Veoneer 或 Bosch) 且接口不匹配** — 用万用表测你的接口,不要相信维修手册。 2. **不是 comma 硬件。** 这运行在搭载 comma **red panda** 的 x86 迷你 PC 上的 `carrotpilot` 分支上, 在摄像头接口处并联接入。没有 comma 3X,也没有 comma-connect 路由。 3. **没有继电器 harness。** 系统处于直连状态,因此当它运行时,原厂的 LKS/ACC/AEB 是*被替代*,而不是失效回退。一个带有旁路继电器的 comma 风格 harness 盒才是正确的解决方法。在照抄接线之前请了解这一点。 4. **我的车存在公开的车辆故障:** MPC 摄像头 `C1211` (缺少 ADAS 标定) — 需要 BYD 的 静态标定设备,这是店里才能干的活。 ## 获取更多 完整的逆向工程记录、抓包和解码工具、每次驾驶的验证日志、经过验证的 DBC 以及该移植的变更集都存在,我很乐意分享其中的任何内容。 **[新建一个 issue](https://github.com/shemps/byd-atto3-openpilot-port/issues)** 并提出你的需求 — 包括如果你更希望看到某些内容在这里正式发布,而不是通过其他方式发送。 不声称获得 opendbc 悬赏,也不会开竞争性的 PR。如果维护者或积极的移植者想要将其中任何内容上游化,尽管拿去用,没有任何附加条件。
标签:CAN总线, DBC文件, openpilot, 比亚迪, 汽车逆向工程, 自动驾驶, 逆向工具