首页
/ openpilot 支持车辆体系:从 CARS_template.md 到自动生成车型表的完整机制

openpilot 支持车辆体系:从 CARS_template.md 到自动生成车型表的完整机制

2026-09-04 23:38:54作者:郁楠烈Hubert

本文基于 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. --->

它由两部分组成:

  1. 静态骨架:定义最终文档的章节结构——"Supported Cars" 总述、"$supported_count Supported Cars" 车型大表、Footnotes 脚注区、"Community Maintained Cars" 社区维护车型区,以及 "Don't see your car here?" 支持性判定指南(含品牌配置包对照表、FlexRay 与 Toyota Security 两个不受支持场景)。
  2. 动态占位符:使用 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_docsget_all_footnotes)与列定义(ColumnSupportType)来自 opendbc.car.docs 模块。模板脚本只负责渲染,车型能力的真值定义在 opendbc 子模块中。
  • 只渲染 UPSTREAM 车型SupportType.UPSTREAM 过滤意味着表中只列出合入上游的车型;社区维护(community)车型不进入表格,只在模板末尾的 "Community Maintained Cars" 一节以指引形式存在。
  • 列与对齐规则_build_cars_tableColumn 枚举顺序取列,前三列(Make/Model/Supported Package)左对齐(---),其余列居中(:---:)。"Hardware Needed" 列通过一张 width=2000 的空白图片强制加宽(见 docs.pyWIDE_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.pyCar.__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" 章节为准。

如果你确认自己的车满足上文支持性条件,仓库提供了完整的移植工具链入口:

小结

CARS_template.md 是 openpilot 车型支持的"单一事实入口"骨架:docs.py 从 opendbc 读取每款车的文档化能力字段,渲染出 CARS.md 中的车型大表与脚注;而判定标准(CAN 总线 + 转向/油门/刹车接口 + ACC/LKAS 配置包)、FlexRay 与 Toyota SecOC 两个排除项,共同划定了 openpilot 的车型边界。理解这条"模板—脚本—车型数据—运行时 CarParams"的链路后,无论是查证某款车的能力列含义,还是为新车型做移植评估,都能在仓库内找到对应的源码依据。

登录后查看全文
热门项目推荐
相关项目推荐