6.9 KiB
6.9 KiB
CAN0 副驾座椅控制指令白名单
- 适用项目:
Cognitive_Agent - 适用分支:
feature/N7Web - 核对日期:2026-08-25
- 控制对象:CAN0 右前/副驾座椅
- 协议依据:
passenger_seat_firmware/firmware与Passenger_Seat_Controller_demo中共同存在的经典 CAN 协议 - 验证层级:固件源码、语义解析、参数门禁和离线编译;本次没有向真实 CAN 总线发送报文
CAN0 与 CAN1 必须分开解释。本文中的 seat passenger ... 只生成副驾座椅操作,不得改写为主驾 seat driver ...,也不得发往 CAN1。所有 CAN0 原始帧均为标准 11 位 ID、Classic CAN、DLC 8、无 BRS。
有效语义控制指令
| 类别 | 规范指令 | 参数约束 | 当前执行逻辑 |
|---|---|---|---|
| 水平绝对位置 | seat passenger horizontal position <0-100> |
整数百分比 | 有线和无线使用相同的固件原生 0x300:一般位置为 Opcode 0x01;显式 0% 为安全归零 Opcode 0x0B;均以 0x301/0x302 闭环确认 |
| 坐盆/高度绝对位置 | seat passenger basin position <0-100> |
整数百分比;对应固件 Motor 1 | 同上 |
| 靠背绝对位置 | seat passenger backrest position <0-100> |
整数百分比;对应固件 Motor 2 | 同上 |
| 腿托绝对位置 | seat passenger legrest position <0-100> |
整数百分比;对应固件 Motor 3 | 同上 |
| 水平相对移动 | seat passenger horizontal relative <forward|backward> <1-100> |
移动量为整数百分比 | 先根据 CAN0 当前位置计算有界绝对目标;位置有效时使用闭环 Opcode 0x01,位置未标定且移动量满足轴级限制时使用 Opcode 0x03 有界定时回退;有线和无线完全一致 |
| 坐盆/高度相对移动 | seat passenger basin relative <up|down> <1-100> |
同上;当前 C++ 台架工具依据实测把 up 映射为归一化位置增加、down 映射为减少 |
同上;该方向修正仅限 CAN0,不影响 CAN1 |
| 靠背相对移动 | seat passenger backrest relative <forward|backward> <1-100> |
同上 | 同上 |
| 腿托相对移动 | seat passenger legrest relative <up|down> <1-100> |
同上 | 同上 |
| 副驾通风 | seat passenger vent <off|low|medium|high> |
low/medium/high 对应 1/2/3 档 |
有线和无线均发送固件原生 0x29E,状态以 0x4FA 确认;无线模式把原始 CAN0 帧封装到 MQTT 控制话题 |
| 副驾加热 | seat passenger heat <off|low|medium|high> |
low/medium/high 对应 1/2/3 档 |
有线和无线均在开启时先发固件原生 0x3CE 模式,再发 0x29E,状态以 0x4FA 确认 |
| 木马模式 | seat passenger dynamic rocking-horse |
固件模式 ID 1 | 有线和无线均发送 0x300 Opcode 0x0E、ParamA=1,并以 0x301/0x306 确认 |
| 摇篮模式 | seat passenger dynamic cradle |
固件模式 ID 2 | 有线和无线均发送 0x300 Opcode 0x0E、ParamA=2,并以 0x301/0x306 确认 |
| 停止动态模式 | seat passenger dynamic stop |
无附加参数 | 有线和无线均发送 0x300 Opcode 0x0F、ParamA/ParamB=0 |
为了兼容现有页面,精确指令入口仍接受以下旧别名,但前端“已解析 CAN 控制指令”统一显示上表规范形式:
longitudinal→horizontalheight→basinseat passenger dynamic start rocking-horse→seat passenger dynamic rocking-horseseat passenger dynamic start cradle→seat passenger dynamic cradle
原生 0x300 控制字段
| Byte | 字段 | 说明 |
|---|---|---|
| 0 | Opcode | 0x01 绝对、0x02 固件原生相对、0x03 有界定时、0x08/0x09 停止、0x0B 已知量程归零、0x0E/0x0F 启停动态模式 |
| 1 | Control | bit0..1 Motor,bit2..3 Direction,bit4..5 Protocol Version=1 |
| 2..3 | Sequence | uint16 little-endian |
| 4..5 | ParamA | 绝对目标 0..10000;原生相对量为 int16;定时时长 100..60000 ms;归零密钥 0x4B52;动态模式为 1/2 |
| 6..7 | ParamB | 绝对/相对超时 0 或 100..60000 ms;定时 Duty×10 为 300..1000;归零超时 10..600 s;动态模式必须为 0 |
当前自然语言相对移动采用“读取当前位置→计算目标→闭环执行”的安全策略,不直接无条件暴露 Opcode 0x02。这是执行策略与语义命令的区别:用户仍能看到相对语义,底层可根据位置是否有效选择更安全的原始帧序列。
CAN0 状态反馈与前端映射
| 反馈 ID | 固件含义 | 后端/前端映射 |
|---|---|---|
0x301 |
系统状态、ACK、拒绝原因、有效轴掩码 | 作为命令 ACK 和安全诊断,不伪装成位置 |
0x302 |
单轴任务、方向、位置有效位、故障、归一化位置 | Motor 0→前后 longitudinal;1→高度 cushion_tilt;2→靠背 backrest_recline;3→腿托 legrest_height;Value_X100 / 100 显示为 0–100% |
0x303 |
Hall、量程、速度、最近电机事件 | 诊断缓存,不覆盖 0x302 的权威位置 |
0x304 |
单轴电流与堵转诊断 | 诊断缓存 |
0x305 |
风扇/加热电流诊断 | 诊断缓存 |
0x306 |
木马/摇篮模式、阶段、周期、故障掩码 | passenger.dynamic_mode,前端显示运行/空闲/故障 |
0x4FA |
副驾通风和加热状态 | passenger.ventilation、passenger.heating |
0x6A0/0x6A2 |
旧车机 seat-ota 查询/应答 | 保留兼容;位置查询应答转换为同一内部 0x302 状态,不与原生状态重复解释 |
0x6A0/0x6A2 只允许作为旧车机状态查询兼容输入。自然语言、设备控件和
无线 MQTT 控制白名单均禁止发送 0x6A0;无线只是把原生 CAN0 帧封装进
n7/n7-headunit/can/command,不会改变 CAN ID 或载荷。
无线状态来自 n7/n7-headunit/can/state 时,以上字段使用 wireless_mqtt_ch0 标记;有线台架使用 physical_can。前端只把这些物理来源显示为实车反馈。
自然语言示例
- “把副驾座椅前后位置调到 35%” →
seat passenger horizontal position 35 - “副驾坐盆向上调 10%” →
seat passenger basin relative up 10 - “副驾靠背向后移动 15%,空调设为 24 度” → CAN0
seat passenger backrest relative backward 15+ CAN1ac temp driver 24 - “开启木马模式并打开氛围灯” → CAN0
seat passenger dynamic rocking-horse+ CAN1light ambient on - “关闭摇篮模式,风量调到 2 档,打开遮阳帘” → CAN0
seat passenger dynamic stop+ CAN1ac fan 2+shade open
安全边界
- 百分比越界、非法方向、未知轴和不在枚举内的动态模式会在生成 CAN 帧前拒绝。
- 相对移动不会使用虚构位置计算目标;位置无效时仅允许编译器已限制时长、方向和 Duty 的
0x03回退,否则拒绝。 - MQTT Broker 接受消息只代表已提交;车辆动作是否完成仍以 CAN0 状态反馈为准。
- 固件还实现全量程校准、清故障和查询等维护 Opcode,但它们不属于面向自然语言和前端设备控件的控制白名单。