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, 比亚迪, 汽车逆向工程, 自动驾驶, 逆向工具