openpilot 支持车辆体系:从 CARS_template.md 到自动生成车型表的完整机制
本文基于 openpilot 仓库中的 CARS_template.md 展开,讲解 openpilot 如何用一套"模板 + 生成脚本"的机制维护 300 余款支持车型清单,如何判断自己的车是否具备被支持的前提条件(CAN 总线与 ACC/LKAS 接口),以及哪些车型因 FlexRay 总线或 Toyota SecOC 新安全机制暂不受支持。读完后,你将理解 docs/CARS.md 中每一列数据的含义、生成脚本 docs.py 的工作原理,以及车型支持判定背后的源码级依据。
模板与生成物:CARS_template.md 的定位
CARS_template.md 本身不是给人阅读的最终文档,而是一份"受保护"的自动生成本源。文件第一行就带有显式标记:
<!--- AUTOGENERATED FROM openpilot/selfdrive/car/CARS_template.md, DO NOT EDIT. --->
它由两部分组成:
- 静态骨架:定义最终文档的章节结构——"Supported Cars" 总述、"$supported_count Supported Cars" 车型大表、Footnotes 脚注区、"Community Maintained Cars" 社区维护车型区,以及 "Don't see your car here?" 支持性判定指南(含品牌配置包对照表、FlexRay 与 Toyota Security 两个不受支持场景)。
- 动态占位符:使用 Python
string.Template的$语法,共五个占位符:
| 占位符 | 含义 |
|---|---|
$supported_count |
上游(UPSTREAM)支持车型总数 |
$table_header |
车型表表头行 |
$table_separator |
表头对齐分隔行 |
$table_rows |
全部车型数据行 |
$footnotes |
脚注内容 |
生成后的成品是仓库根目录下 docs 目录中的 CARS.md(当前版本显示 "335 Supported Cars")。两份文件头部都带有 AUTOGENERATED 注释,直接手改会被下次生成覆盖。
生成机制:docs.py 如何填充模板
负责填充模板的脚本是 docs.py,其核心调用链为:
CARS_MD_OUT = os.path.join(BASEDIR, "docs", "CARS.md")
CARS_MD_TEMPLATE = os.path.join(BASEDIR, "openpilot/selfdrive", "car", "CARS_template.md")
def generate_cars_md(all_car_docs, template_fn: str, **kwargs) -> str:
upstream_cars = [c for c in all_car_docs if c.support_type == SupportType.UPSTREAM]
table_header, table_separator, table_rows = _build_cars_table(upstream_cars)
footnotes = [fn.value.text.replace('</br>', '') for fn in get_all_footnotes()]
...
return template.substitute(
supported_count=len(upstream_cars),
table_header=table_header,
table_separator=table_separator,
table_rows=table_rows,
footnotes=footnotes_md,
)
结合源码可以归纳出几个关键事实:
- 数据源在 opendbc:车型元数据(
get_all_car_docs、get_all_footnotes)与列定义(Column、SupportType)来自opendbc.car.docs模块。模板脚本只负责渲染,车型能力的真值定义在 opendbc 子模块中。 - 只渲染 UPSTREAM 车型:
SupportType.UPSTREAM过滤意味着表中只列出合入上游的车型;社区维护(community)车型不进入表格,只在模板末尾的 "Community Maintained Cars" 一节以指引形式存在。 - 列与对齐规则:
_build_cars_table按Column枚举顺序取列,前三列(Make/Model/Supported Package)左对齐(---),其余列居中(:---:)。"Hardware Needed" 列通过一张width=2000的空白图片强制加宽(见 docs.py 中WIDE_HARDWARE_COL_NAME的定义)。 - 图标与脚注的渲染约定:星标图标(
assets/icon-star-*.svg)、YouTube 视频图标(assets/icon-youtube.svg,均位于 docs/assets 目录)以及脚注上标<sup>n</sup>(#footnotes)均由脚本统一注入。 - 命令行参数:脚本支持
--template与--out两个参数,默认值分别指向模板与docs/CARS.md,即默认执行:
python3 openpilot/selfdrive/car/docs.py
# 等效于:
# python3 openpilot/selfdrive/car/docs.py --template openpilot/selfdrive/car/CARS_template.md --out docs/CARS.md
如何读懂支持车型表
CARS.md 的表头如下(Hardware Needed 列在渲染时加了不可见的宽图占位符,这里按语义简化展示):
|Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed|Video|Setup Video|
各列含义:
- Supported Package:车辆需要具备的硬件配置包,例如 "Honda Sensing"、"Co-Pilot360 Assist+"、"Smart Cruise Control (SCC)","All" 表示不分配置。
- ACC:纵向(加减速)控制来源。取值分三类:
openpilot:纵向完全由 openpilot 计算并下发;openpilot available[n]:纵向控制可选,默认使用车机原生 ACC,附脚注说明限制(如脚注 1 指明该开关位于nightly-dev等非 release 分支;脚注 5 说明启用后 CMBS/AEB/FCW 功能将被禁用);Stock:纵向只能沿用原厂巡航系统。
- No ACC accel below:低于该速度时 ACC 不会主动加速(如 "26 mph")。这一限制源于原厂 PCM(Powertrain Control Module)巡航控制器的行为——openpilot 在 PCM 巡航路径下直接读取车机巡航速度,不自行注入目标速度。这一点可从 cruise.py 得到印证:
VCruiseHelper.update_v_cruise中,当CP.pcmCruise为真时,设定速度直接取自CS.cruiseState.speed(即车机上报的巡航速度);只有 PCM 巡航被完全接管(pcmCruise为假)时,openpilot 才启用自己的按钮调速逻辑,并把速度裁剪到[V_CRUISE_MIN, V_CRUISE_MAX](即 8~145 km/h,见 cruise.py 顶部常量)。 - No ALC below:低于该速度时车道居中(Lane Centering)不工作,同样多由原厂转向辅助的激活门槛决定。
- Steering Torque / Resume from stop:星标图标(full/half/empty)表示方向盘力矩能力与从静止恢复行驶能力的强弱,图标资源位于 docs/assets。
- Hardware Needed:展开式配件清单(harness box 转接线、OBD-C 线缆、connector、mount 等),脚注 12 说明 VW J533 类 harness 插接在仪表台下方 CAN 网关位置,脚注 17 说明 2022 年款及以后部分 VW 车型为 CAN 网关与 BCM 合体的新硬件、线束尚未发售。
支持性判定:什么样的车能被 openpilot 支持
模板中 "Don't see your car here?" 一章给出了判定标准,这是决定一辆车能否进入上述表格的根本依据:
核心原则:openpilot 复用车辆既有的转向、油门、刹车三个物理接口。三者缺一不可;若车辆同时具备 ACC 与某种 LKAS/LCA(车道保持/居中)功能,则几乎必然具备这三个接口。这类功能大约在 2016 年前后开始量产上车。由于厂商营销命名各异(例如现代把 ACC 称作 "Smart Cruise Control"),判断时应对照配置包而非功能名称。
模板完整保留了按品牌划分的配置包对照表,这里原文继承:
| Make | Required Package/Features |
|---|---|
| Acura | 任何带 AcuraWatch 的车型。AcuraWatch 在很多新款车型上标配。 |
| Ford | 任何带 Lane Centering 的车型大概率可行。 |
| Honda | 任何带 Honda Sensing 的车型。Honda Sensing 在很多新款车型上标配。 |
| Subaru | 任何带 EyeSight 的车型。EyeSight 在很多新款车型上标配。 |
| Nissan | 任何带 ProPILOT 的车型大概率可行。 |
| Toyota & Lexus | 带 Toyota/Lexus Safety Sense 且含 "LDA w/SA(带转向辅助的车道偏离预警)" 和/或 "LTA(车道追踪辅助)" 的车型。注意:不带转向辅助的 LDA 不可用。这些功能在多数新款车型上标配。 |
| Hyundai, Kia, & Genesis | 任何带 Smart Cruise Control (SCC) 且带 LFA 或 LKAS 的车型。LKAS/LFA 在多数新款车型上标配。任何形态的 SCC 均可,例如 NSCC。 |
| Chrysler, Jeep, & Ram | 任何带 LaneSense 和 Adaptive Cruise Control 的车型大概率可行。很多新款车型标配。 |
从源码结构看,这一判定逻辑最终落在 CarInterface 的能力描述上:card.py 中 Car.__init__ 通过 get_car(...)(来自 opendbc.car.car_helpers)完成车辆指纹识别(fingerprinting),生成每辆车唯一的 CarParams(简称 CP),再由 CP 决定该车是走 pcmCruise 路径还是 openpilot 纵向路径、是否 dashcamOnly、以何种 safetyModel 运行于 panda 微控制器等。也就是说,CARS.md 表格中的每一列,本质上都是某款车 CarParams 字段的文档化呈现。
暂不受支持的原因一:FlexRay 总线
openpilot 当前支持的全部车型都通过 CAN 总线与车内 ECU 通信。而多数(如果不是全部)BMW、Mercedes、Audi、Land Rover 及部分 Volvo 车型改用 FlexRay 总线。模板明确说明:这些车未来"可能有一天"会被支持,但目前没有支持 FlexRay 的计划。CAN 收发链路在 openpilot 中由 pandad 进程承载(pandad.py),这也是 FlexRay 车型无法直接复用的原因之一。
暂不受支持的原因二:Toyota 新型消息认证
由于引入新的消息认证机制(SecOC),以下 Toyota/Lexus/Subaru 车型暂不受支持:
- Toyota RAV4 Prime 2021+
- Toyota Sienna 2021+
- Toyota Venza 2021+
- Toyota Sequoia 2023+
- Toyota Tundra 2022+
- Toyota Highlander 2024+
- Toyota Corolla Cross 2022+(仅美规)
- Toyota Camry 2025+
- Lexus NX 2022+
- Toyota bZ4x 2023+
- Subaru Solterra 2023+
这一机制在源码中已有对应实现:card.py 中当 CP.secOcRequired 为真时,会从 /cache/params/SecOCKey 读取用户密钥,校验 16 字节(32 位 hex)后写入 CP.secOcKeyAvailable 并下发到 CarInterface 的 CS/CC 对象——说明认证密钥通道已打通,模板所述"尚未支持"指的就是这批车型整体适配尚未完成。
社区维护车型与车型移植
模板的 "Community Maintained Cars" 一节说明:部分品牌车型虽未合入上游(即不出现在 docs/CARS.md 表格中,因为生成脚本只渲染 SupportType.UPSTREAM),但社区已能在其他品牌车型上运行 openpilot,具体清单以各项目 wiki 的 "Community Supported Models" 章节为准。
如果你确认自己的车满足上文支持性条件,仓库提供了完整的移植工具链入口:
- docs/how-to/car-port.md:面向新车型移植的步骤文档;
- tools/car_porting/README.md 及配套脚本(如 auto_fingerprint.py、test_car_model.py):用于 CAN 指纹自动识别与车辆模型验证;
- docs/CARS.md 末尾脚注 3/6/10 等还给出了 GM、Nissan、Tesla 等品牌的额外安装细节指引。
小结
CARS_template.md 是 openpilot 车型支持的"单一事实入口"骨架:docs.py 从 opendbc 读取每款车的文档化能力字段,渲染出 CARS.md 中的车型大表与脚注;而判定标准(CAN 总线 + 转向/油门/刹车接口 + ACC/LKAS 配置包)、FlexRay 与 Toyota SecOC 两个排除项,共同划定了 openpilot 的车型边界。理解这条"模板—脚本—车型数据—运行时 CarParams"的链路后,无论是查证某款车的能力列含义,还是为新车型做移植评估,都能在仓库内找到对应的源码依据。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00