feat: harden seat intent and expand HIL coverage
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# T2G 座椅前端能力测试集
|
||||
|
||||
本测试集验证从前端自然语言输入、意图计划、`FunctionConfig`、CAN 编译到执行反馈展示的完整链路。机器自动化测试固定使用 `dry_run`,不会连接台架;真实台架部分必须由现场人员逐条执行并目视确认。
|
||||
本测试集验证从前端自然语言输入、意图计划、`FunctionConfig`、CAN 编译到物理反馈和整车孪生同步的完整链路。离线回归固定使用 `dry_run`;仓库另含可续跑的真实 HIL 执行器,逐条提交请求、失败后继续,并保存物理 CAN 与故障电流证据。
|
||||
|
||||
可执行用例源位于 `tests/fixtures/seat_frontend_capabilities.json`,HTTP 回归测试位于 `tests/e2e/test_seat_web_api.py`。
|
||||
离线用例源位于 `tests/fixtures/seat_frontend_capabilities.json`,真实 HIL 用例源位于 `tests/fixtures/seat_frontend_hil_suite.json`,HTTP 回归测试位于 `tests/e2e/test_seat_web_api.py`。
|
||||
|
||||
## 覆盖范围
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
| MOTION-02 | 副驾坐盆倾角35% | M1、`0x302≈3500`、COMPLETE/OK |
|
||||
| MOTION-03 | 副驾靠背130度 | M2、角度标定和真实位置反馈 |
|
||||
| MOTION-04 | 副驾腿托145度 | M3、角度标定和真实位置反馈 |
|
||||
| MOTION-TIME | 靠背向后移动70秒、座椅向前移动1分钟 | 秒/分钟解析、四轴时长上限钳制、提前到端点按成功返回及可见提示 |
|
||||
| MOTION-FALLBACK | 靠背向后移动70度、靠背200度、水平101% | 超量程意图钳制到对应机械端点,不因越界静默拒绝 |
|
||||
| COMBINED-01 | 一句话同时设置热管理和四轴 | 多操作编排、逐项反馈与失败传播 |
|
||||
| DEFAULT-01 | 未指定座位的通风请求 | 自动使用副驾,不生成主驾操作 |
|
||||
| SAFE-01 | 显式主驾通风请求 | 返回仅支持副驾,不得重定向或发 CAN |
|
||||
@@ -31,13 +33,34 @@ python -m unittest tests.e2e.test_seat_web_api
|
||||
|
||||
自动测试会逐条向 `/api/requests` 提交测试集中的自然语言输入,验证所有六项真实台架能力均生成副驾目标和正确参数,并确认执行模式保持为 `dry_run`。领域集成测试另行验证未指定座位时默认副驾,以及本地解析和模型输出中的显式主驾目标都被拒绝。
|
||||
|
||||
真实台架服务启用后运行:
|
||||
|
||||
```powershell
|
||||
python .\tools\run_seat_frontend_hil_suite.py `
|
||||
--confirm-hardware `
|
||||
--output .\artifacts\hil\seat_frontend_hil_latest.json
|
||||
```
|
||||
|
||||
可用 `--only-group thermal|motion|combined|mode|model|safety` 只执行一组,用 `--start-at CASE-ID` 从指定用例续跑,或重复传入 `--case CASE-ID` 精确复测一个有序子集。每次运行先强制执行四轴物理归零,重建霍尔位置记忆;失败时停止后续位置测试。当前清单共 186 条:129 条热管理/移动/组合输入、33 条模式输入、4 条 GPT-5.6-sol 模糊意图输入和 20 条安全拒绝输入。新增覆盖包括取暖/吹风口语、正常秒数/半秒/毫秒与最小时长钳制、四轴独立端点表达、坐垫与腿托超量程、靠背角度下溢,以及后排/左前/全部座椅、小数/负位置和零时长安全拒绝。每条用例均核对:所有座椅操作为 `passenger/front_right`、物理状态来源为 `physical_can`、目标位置误差不超过 2%、联合孪生值与物理状态相同;模型用例还会防止静默降级为本地规则,时长和超量程用例会核对界面可见的时长上限、实际执行时长和到达端点提示,拒绝用例会比较动作前后物理指纹。调试环境设置 `COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN_REQUIRED=false`,执行器和前端均不要求逐次输入硬件令牌。
|
||||
|
||||
## 真实台架执行顺序
|
||||
|
||||
1. 固定座椅、清空行程、准备急停和限流电源;保持 `COGNITIVE_AGENT_SEAT_AUTO_HOME_ENABLED=false`。
|
||||
1. 固定座椅、清空行程、准备急停和限流电源;普通失败继续下一条,真实高电流且无 Hall 活动等安全故障停止对应危险方向。
|
||||
2. 先执行 RECOVERY-01。可使用未烧写控制器,或仅在确认允许覆盖当前固件后进行;前端结果必须显示 `programmed_this_request=true`、`firmware_verified=true`,随后才出现动作反馈。
|
||||
3. 依次执行 THERM-01~04,确认开、关和档位回读。
|
||||
4. 让四轴处于有效位置后,依次执行 MOTION-01~04。每次只观察一个物理轴,映射或方向错误立即急停。
|
||||
4. 让四轴处于有效位置后,执行 M0~M3 双向中间位置,并分别验证安全轴的 `0%` 会编译为 `HOME_KNOWN_RANGE (0x0B)`,而不是把累计 Hall 计数清零。
|
||||
5. 单项全部通过后再执行 COMBINED-01;逐项核对 ACK、TaskState、位置、Hall、电流诊断及最终报告。
|
||||
6. 最后执行 SAFE-01~03,确认所有安全用例均未产生 CAN 动作。
|
||||
|
||||
普通一句话请求绝不触发全行程标定。若 `PositionValid=0`,保持自动归零关闭时动作应安全失败;只有确认台架无遮挡且允许回最近端后,才能单独启用已知量程归零。
|
||||
普通一句话请求绝不触发全行程标定。显式 `0%`/“归零”会触发已知量程回最近端,并要求 `Hall≤2` 后才通过。若其他绝对目标遇到 `PositionValid=0`,保持自动归零关闭时动作应安全失败;只有确认台架无遮挡且允许回最近端后,才能单独启用自动归零。
|
||||
|
||||
## 时长与超量程容错规则
|
||||
|
||||
- 支持“毫秒/秒/分钟”、阿拉伯数字、中文整数、全角字符和半分钟/半秒表达。按时长运动仍必须明确轴和方向;“座椅向前/向后”默认指水平轴。
|
||||
- 实际下发时长为 `min(max(用户时长, 300 ms), 轴最大允许时长)`。当前 M0/M2 为 30 秒、M1 为 20 秒、M3 为 25 秒;钳制不会中止请求。
|
||||
- 按时长运动提前到端点时,只有 `Near/Far Endpoint`、有效归一化位置或 Hall 端点证据与指令方向一致,才把固件的 `ENDPOINT_REACHED`、`STALL` 或 `TIMEOUT` 归一化为成功;无端点证据的堵转继续失败并执行 `STOP_ALL`。
|
||||
- 相对角度、相对百分比、绝对角度和绝对百分比超出剩余行程时,语义层保留原始请求并把实际目标钳制到相应端点。界面同时显示备用目标;真实执行后显示“轴最大允许时长、已执行秒数、到达最前/最后/最上/最下方”。
|
||||
|
||||
2026-08-01 的 M0/M2 无 Hall 与 M1 高电流无 Hall 记录最终定位为水平、坐盆和靠背 Hall 地线断开。2026-08-02 地线恢复、四轴手工归零后,revision 6 的完整自动 HIL 结果为 33/33 通过、0 失败、0 `safety_blocked`:覆盖加热/通风全部档位、M0~M3 双向中间位置、单轴及四轴归零、组合指令和全部 11 个预设模式。临时轴向安全阻塞已从测试清单移除;报告保存于 `artifacts/hil/seat_frontend_hil_20260802_full_retest_run1.json`。
|
||||
|
||||
2026-08-02 补齐时长和超量程容错后,扩充后的完整 HIL 为 161/161 通过、0 失败、0 `safety_blocked`,最终清理通过;独立 CAN 复核确认加热/通风均为 0 档、M0~M3 均为 0% 且四轴 `Position_Valid=1`。其中“靠背向后移动70度”、四轴双向超长时长、水平101%、靠背200度以及“打开零重力模式”均在完整序列中通过。完整报告为 `artifacts/hil/seat_frontend_hil_20260802_full_timed_overflow.json`,新增规则的定向 14/14 报告为 `artifacts/hil/seat_frontend_hil_20260802_timed_overflow_targeted.json`。
|
||||
|
||||
@@ -31,7 +31,7 @@ powershell -ExecutionPolicy Bypass -File .\tools\build_seat_firmware.ps1
|
||||
|
||||
| MotorID | 前端能力 | 物理执行器 | 最近端 → 最远端 | MaxHall | 全量程 |
|
||||
| ---: | --- | --- | --- | ---: | ---: |
|
||||
| M0 | `seat.set_longitudinal_position` | 水平前后 | 最前 → 最后 | 480 | 215 mm |
|
||||
| M0 | `seat.set_longitudinal_position` | 水平前后 | 最前 → 最后 | 499(本台架最新实测;标称 480) | 215 mm |
|
||||
| M1 | `seat.set_cushion_tilt` | 坐盆斜上下 | 最高 → 斜向下 | 374 | 水平 51 mm / 垂直 56 mm |
|
||||
| M2 | `seat.set_backrest_recline` | 靠背 | 竖直 → 后躺 | 917 | 68° |
|
||||
| M3 | `seat.set_legrest_height` | 腿托 | 最下 → 抬起 | 647 | 72° |
|
||||
@@ -43,11 +43,12 @@ powershell -ExecutionPolicy Bypass -File .\tools\build_seat_firmware.ps1
|
||||
- 热管理命令:`0x29E/0x3CE`;档位反馈:`0x4FA`。
|
||||
- 移动命令:`0x300`;系统 ACK:`0x301`;归一化位置:`0x302`;Hall/量程:`0x303`。
|
||||
- 电流诊断:`0x304` 四轴轮询,`0x305` 通风/加热;这些值用于台架可见性,当前保守阈值不能替代外部限流或量产保护。
|
||||
- Opcode 1 的 `ParamA` 为 0–10000 绝对位置,`ParamB=0` 使用各轴固件默认超时。
|
||||
- Opcode 3 的 `ParamA` 为持续时间,`ParamB` 为驱动等级×10(默认 90% 即 900)。
|
||||
- Opcode 1 的 `ParamA` 为 1–10000 绝对位置;后端显式发送 30 s 超时覆盖值。
|
||||
- 前端目标 `0%`/“归零”不是普通绝对位置,而是 `HOME_KNOWN_RANGE (0x0B)`;只有收到 `COMPLETE/OK`、Near、Hall≤2 和 PositionValid 才算成功。
|
||||
- Opcode 3 的 `ParamA` 为持续时间,`ParamB` 为驱动等级×10(默认 90%)。
|
||||
- `STOP_ALL` 的专用 ACK 为 4;完成/故障 TaskState 分别为 6/7。
|
||||
|
||||
新版固件把 `0x304/0x305` 用于电流诊断,不能继续发送旧版身份请求。后端在任何控制帧之前被动观察 `0x301–0x305`、`0x4FA`、四个 MotorID 和 MaxHall `480/374/917/647`;真实硬件执行启用后,未观察到完整签名会自动使用仓库内 IAR 镜像烧写,重新被动验证成功后继续原请求。烧写或复验失败时禁止发送座椅控制帧。
|
||||
新版固件把 `0x304/0x305` 用于电流诊断,不能继续发送旧版身份请求。后端在任何控制帧之前被动观察 `0x301–0x305`、`0x4FA`、四个 MotorID、固件 revision 6 和各轴标称 MaxHall(允许 5% 台架差异);真实硬件执行启用后,未观察到完整签名会自动使用仓库内 IAR 镜像烧写,重新被动验证成功后继续原请求。烧写或复验失败时禁止发送座椅控制帧。
|
||||
|
||||
## 启用配置
|
||||
|
||||
@@ -57,6 +58,7 @@ COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN_REQUIRED=false
|
||||
COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN=123456
|
||||
COGNITIVE_AGENT_SEAT_FIRMWARE_PROFILES=combined
|
||||
COGNITIVE_AGENT_SEAT_AUTO_FLASH_ENABLED=true
|
||||
COGNITIVE_AGENT_SEAT_POSITION_SYNC_ENABLED=true
|
||||
COGNITIVE_AGENT_IAR_CSPYBAT=D:\Program Files\IAR Systems\Embedded Workbench 9.2\common\bin\cspybat.exe
|
||||
COGNITIVE_AGENT_SEAT_CAN_BACKEND=zlgcan
|
||||
COGNITIVE_AGENT_SEAT_CAN_CHANNEL=0
|
||||
@@ -71,12 +73,24 @@ COGNITIVE_AGENT_SEAT_HOME_TIMEOUT_S=120
|
||||
|
||||
当前台架只公布并接受副驾目标 `passenger/front_right`。没有座位词的座椅指令默认副驾;显式主驾、主副驾或前排范围请求会在打开 CAN 前拒绝,不能静默重定向。热管理 CAN 中仍出现的 `Driver_Seat_*` 是板端既有协议字段名,不代表应用层可以控制主驾。
|
||||
|
||||
按时长移动使用 Opcode `0x03`,语义层先按轴钳制到安全时长上限:M0/M2 30 秒、M1 20 秒、M3 25 秒,最小时长 300 ms。运动提前碰到正确方向的机械端点时,执行器必须结合 `0x302` 的 Near/Far、`Position_Valid/Value_X100` 和 `0x303` Hall 证据判断;证据一致时端点返回属于成功完成并向前端报告实际执行秒数,证据不一致的 STALL/TIMEOUT 仍属于真实故障。相对或绝对位置超量程统一钳制到目标方向端点,并在前端明确显示备用目标,不能静默不执行。
|
||||
|
||||
## 绝对位置与已知量程归零
|
||||
|
||||
绝对命令发送前必须看到 `Position_Valid=1`。SMV8 clean 记录有效时,一句话可以直接下发绝对目标;位置无效时默认失败关闭,不会静默触发全行程标定。
|
||||
|
||||
`COGNITIVE_AGENT_SEAT_POSITION_SYNC_ENABLED` 在真实硬件执行启用时默认为 `true`。服务进程的第一次物理移动必须先对 M0–M3 依次执行 `HOME_KNOWN_RANGE(0x0B)`,以实际近端重建四轴 Hall 与 SMV8 基准;一旦固件守卫发现控制器运行过其他程序并重新烧写仓库固件,同一同步状态立即失效,下一次物理移动前再次执行四轴归零。完整 HIL 工具也会在每次套件开始时强制四轴归零,避免“其他程序移动过台架,但旧 WorkFlash 仍显示 PositionValid”的情况。显式四轴归零请求本身可完成同步,不会先重复执行另一轮归零。
|
||||
|
||||
台架无遮挡、急停就绪并且明确允许自动回最近端时,可设置 `COGNITIVE_AGENT_SEAT_AUTO_HOME_ENABLED=true`。后端仅对目标失效轴发送 `HOME_KNOWN_RANGE(0x0B)`,先核对 MaxHall,再等待 `COMPLETE/OK`、Near、Hall≤2 和 PositionValid,随后继续原绝对目标。此流程会产生真实机械运动,但不会访问最远端或重测量程。Opcode `0x0A` 全行程标定不会由普通一句话请求触发。
|
||||
|
||||
2026-08-01 长序列中记录到的 M0/M2 无 Hall、M1 高电流无 Hall 故障,后续确认由水平、坐盆和靠背 Hall 地线断开引起,并非软件标定或堵转阈值问题。2026-08-02 重新接好地线并用手工 HIL GUI 验证后,仓库 revision 6 自动烧写成功,四轴均从机械零位以 `PositionValid=1` 启动;自动前端 HIL 的 33 条热功能、单轴、四轴归零、组合和预设模式用例全部通过。因此测试清单中的临时 `safety_blocked` 已撤销。若以后再次出现同类现象,仍应以命令期间 `0x303` Hall 与 `0x304` 电流联合诊断,不能通过提高 Duty 或阈值掩盖线路故障。
|
||||
|
||||
2026-08-02 时长/超量程规则完成后,扩充清单的真实回归结果为 161/161 通过、0 失败、0 `safety_blocked`,最终清理和独立物理复核均通过。报告位于 `artifacts/hil/seat_frontend_hil_20260802_full_timed_overflow.json`;复核时加热/通风为 0 档,M0/M1/M2/M3 均为 0%,全部 `Position_Valid=1`。
|
||||
|
||||
2026-08-02 增加 GPT-5.6-sol 模糊意图与位置记忆同步后,完整回归为 162/162 通过;“前舱空间太挤了,把座椅调整到舒服的位置”明确记录 `provider_used=openai:gpt-5.6-sol`,物理目标为 M0/M1/M2/M3=`80/30/35/10%`。报告位于 `artifacts/hil/seat_frontend_hil_20260802_full_gpt56_position_sync.json`;最终独立复核仍为热管理关闭、四轴 0% 且全部 `Position_Valid=1`。
|
||||
|
||||
同日第二轮覆盖审计将清单扩充到 186 条,并修复未支持座位范围误默认到副驾、端点词跨轴污染两个风险。新增 24 条真实台架用例全部通过,包含 3 条 GPT-5.6-sol 模糊同义句、正常/最小时长、逐轴端点、超量程和 6 条无动作安全拒绝;报告位于 `artifacts/hil/seat_frontend_hil_20260802_new_coverage_targeted.json`。软件回归为 156 个测试、248 个子测试通过;最终独立 CAN 复核为热管理关闭、四轴 0% 且全部 `Position_Valid=1`。
|
||||
|
||||
## 上电与安全检查
|
||||
|
||||
1. 固定座椅,清空四轴全行程,准备硬件急停和 12 V 限流电源。
|
||||
|
||||
Reference in New Issue
Block a user