feberkeley-sn4 数据集:99 报文、1305 信号与 11 段帧 ID 分区

作者:

在

结论:feberkeley-sn4 数据集的核心是一份由 Python 定义生成的 DBC,含 99 条 BO_ 报文与 1,305 条 SG_ 信号。它的可复用之处在于一套清晰的帧 ID 分区策略:11 段地址区间按板卡/子系统划分并预留扩展空间。但有两个必须记住的边界——README 自称 SN4 库却描述为 SN5 车辆,且快照中未发现仓库许可证。

数据集的构成:从 Python 定义到 DBC 与 C 代码

这个库的工作方式不是手写 DBC,而是用 Python 的 cantools 对象描述报文,再由脚本生成 DBC 与 C 编解码代码。生成脚本 generate_can.sh 会自动创建虚拟环境、安装指定版本 cantools(39.4.13)、校验定义、生成 DBC、再由 DBC 生成 C 源文件,并归一化时间戳以保证 diff 稳定。

产物 路径 作用
DBC 数据库 gen/FEB_CAN.dbc 99 条 BO_ 报文、1,305 条 SG_ 信号
C 头文件 gen/feb_can_db.h 编解码函数与最新值数据库
C 实现 gen/feb_can_db.c 上述两者的实现

external_dbc/ 目录里放供应商 DBC,其中的 inverter.dbc(Cascadia PM100 逆变器)与 elcon.dbc(Elcon/HK 充电机)会被自动合并进生成结果。这意味着 99 条报文里包含第三方设备的定义,使用时需要知道哪些信号来自自有板卡、哪些来自外部设备。

帧 ID 分区:这套数据集最值得抄的部分

帧 ID 按板卡划段,每段都预留了扩展余量。这种分配方式让「新增一条报文」变成一个可判定的问题——先看所属板卡区间还有没有空位,而不是全局找一个没用过的 ID。

区间 归属 当前报文数 用途
0x00-0x08 BMS 5 电池管理
0x09-0x0F PCU 2 安全关键(制动、BSPD)
0x10-0x15 DASH 1 仪表盘 I/O
0x16-0x1D LVPDB 3 配电
0x1E-0x2C Sensors 8 胎温、轮速、线性电位计
0x2D-0x33 DART 2 风扇控制
0x34-0x3F TPS 4 电源监控芯片
0xC0-0xCF RMS 2 逆变器通信
0xD0-0xDF Heartbeats 6 板卡健康监测
0xE0-0xEF Debug 4 测试与调试报文
0xFF PCU 1 原始 ADC 值

注意地址空间并非连续填满:0x40 到 0xBF 之间是一大片未分配区域,Heartbeats 与 Debug 被放到了高位。这种「功能段上移、控制段下沉」的排布,让低地址区留给数量可能增长的子系统。

新增一条报文要改三处

流程是固定的:先在对应板卡的 *_messages.py 里写一个返回 cantools.db.Message 的函数,再在 generate.py 的 MESSAGE_REGISTRY 字典里用可用帧 ID 注册,最后重新运行 generate_can.sh 并用 --list 与 --dump 核验。校验阶段会拦两类错误:同一函数被注册到多个帧 ID(报 Duplicate function),以及帧 ID 超出标准 CAN 的 0x000-0x7FF 范围(报 Frame ID out of range)。

信号定义的统一约定

整个库统一使用小端字节序,这一点在排障提示里被单独强调:解包后数值不对,第一件事就是检查字节序与有无符号。位位置按小端排列,8 字节报文的位编号从 0 到 63,与字节序一一对应。

信号类型 典型长度 有无符号 用途
16 位电压/电流 16 无符号 以 mV、mA 为单位传输
16 位温度 16 有符号 摄氏度
单比特故障标志 1 无符号 故障位
8 位状态枚举 8 无符号 状态机取值
32 位计数器 32 无符号 计数与心跳

心跳报文有一套标准模式:64 个独立的错误标志位,实现见 lvpdb_messages.py 中的 get_lvpdb_heartbeat()。把板卡健康状态压成 64 个比特放进周期性心跳,是这套库里最通用的设计模式之一。

CI 里的 check 模式

GitHub Actions 工作流用 ./generate_can.sh --check 验证生成文件是否最新,确保 Python 定义与提交进仓库的 C 代码一致。这条检查把「改了定义忘了重新生成」变成一次 CI 失败,而不是运行期的错位解码。本地若遇到该检查失败,重新生成并提交 gen/ 目录即可。

使用边界:车款归属与权利状态

数据集有两处明确的边界,引用前必须确认。

边界项 实际情况 影响
车辆归属 仓库名为 SN4,README 却描述为 FEB SN5 方程式电动车 确切车款与赛季未定,复用需自行确认
许可证 快照中未发现仓库许可证 仅可作为私有离线研究副本
第三方定义 合并了 Cascadia PM100 与 Elcon/HK 的供应商 DBC 供应商定义的权利未单独声明,需另行确认
归档范围 仅归档生成的 DBC 与 README 两个供应商源文件未单独拷贝,但定义可能已在生成的 DBC 内

综合来看,这份数据集适合作为「如何组织一个多板卡 CAN 库」的参考实现——分区策略、生成流水线、心跳模式、CI 校验都可直接借鉴;但作为某辆具体赛车的权威信号定义来用则证据不足。

常见问题

这份 DBC 有多少报文和信号?

生成的 DBC 有 99 条 BO_ 报文与 1,305 条 SG_ 信号行。其中包含自动合并进来的第三方设备定义:external_dbc/ 目录下的 Cascadia PM100 逆变器 DBC 与 Elcon/HK 充电机 DBC 会被自动并入生成结果。

新增一条 CAN 报文的正确步骤是什么?

三步:先在对应板卡的 *_messages.py 里定义返回 cantools.db.Message 的函数;再在 generate.py 的 MESSAGE_REGISTRY 里用一个可用帧 ID 注册;最后重新运行 generate_can.sh,并用 –list 与 –dump 核验。校验会拦截同函数重复注册与帧 ID 超出 0x000-0x7FF 两类错误。

怎么知道哪些帧 ID 还没被占用?

运行 ./generate_can.sh –ids 查看帧 ID 分配图。帧 ID 按板卡分区并预留扩展空间,例如 BMS 为 0x00-0x08(已用 5 条)、Sensors 为 0x1E-0x2C(已用 8 条)、Heartbeats 为 0xD0-0xDF(已用 6 条)。

解包出来的数值不对,先查什么?

先查字节序与有无符号。这个库统一使用小端字节序,若定义与实际不符,解包结果就会错。其次确认 C 侧的 pack 函数名——报文名会被规范化成 C 标识符,实际函数名需在 gen/feb_can_db.h 中确认(小写、下划线)。

这份数据集能用于我自己的赛车吗?

作为组织方式的参考可以,作为权威信号定义则证据不足。仓库名为 SN4 但 README 描述为 FEB SN5 方程式电动车,确切车款与赛季未定;快照中未发现仓库许可证;合并的供应商定义权利也未单独声明。建议仅作私有离线研究副本。

延伸阅读

参考资料

  • 项目 07 —— public-can-dbc-datasets/additional/feberkeley-sn4/SOURCE.md(固定提交、99 报文 1,305 信号规模、车款归属疑问与权利状态)
  • 项目 07 —— public-can-dbc-datasets/additional/feberkeley-sn4/README.md(生成流水线、帧 ID 分区表、信号定义模式与 CI 校验)

免责声明

本文内容来自公开仓库的说明文件与生成产物统计,未对信号定义做逐条验证。数据集的车款归属与赛季在来源中存在不一致,且未发现仓库许可证,供应商定义的权利亦未单独声明。请仅作为私有离线研究副本使用,实际车辆应用前请以原始来源的权利确认与自有验证为准。

更新记录

  • 2026-10-14 初稿

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注