Files
Cognitive_Agent/docs/CAN0控制指令白名单.md
T
2026-08-26 20:11:09 +08:00

6.9 KiB
Raw Blame History

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 → horizontal
  • height → basin
  • seat passenger dynamic start rocking-horse → seat passenger dynamic rocking-horse
  • seat 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 + CAN1 ac temp driver 24
  • “开启木马模式并打开氛围灯” → CAN0 seat passenger dynamic rocking-horse + CAN1 light ambient on
  • “关闭摇篮模式,风量调到 2 档,打开遮阳帘” → CAN0 seat passenger dynamic stop + CAN1 ac fan 2 + shade open

安全边界

  • 百分比越界、非法方向、未知轴和不在枚举内的动态模式会在生成 CAN 帧前拒绝。
  • 相对移动不会使用虚构位置计算目标;位置无效时仅允许编译器已限制时长、方向和 Duty 的 0x03 回退,否则拒绝。
  • MQTT Broker 接受消息只代表已提交;车辆动作是否完成仍以 CAN0 状态反馈为准。
  • 固件还实现全量程校准、清故障和查询等维护 Opcode,但它们不属于面向自然语言和前端设备控件的控制白名单。