通止规装配:配置段进 site.yaml + 中文手册 + 成败判定「不看 $?」
配置(site.yaml → gauge_assembly:,38 键全部带中文注释) ------------------------------------------------------ - 键名/单位/类型/交叉矛盾由 gauge_config.py 校验:拼错键名报错并给最相近的候选, 单位后缀(_deg/_mm/_m/_s/_pct/_delta)逐条对表,`contact_safe_delta ≤ contact_tangential_delta` 这类矛盾启动就拦(R1.2:没接线的键不许静默存在)。 - 借机清掉 4 个**没接线**的键(require_preview / track_*_s / hover_m:前两个是 stage1 那层的、后两个是 servo 那层的,放在这里等于第二份真相), 并把 contact_speed_m_s / coarse_timeout_s / 夹爪力速 真的接上。 - site.example.yaml 由 site.yaml 生成(gen_site_example.py --check 通过)。 成败判定:`ros2 launch` 的退出码**恒为 0** ------------------------------------------ 实测(Humble):子进程 exit 3,`ros2 launch` 仍返回 0。用 `$?` 判成败的脚本会把 "装配失败"记成"成功"——没人会去查一个说成功的脚本。改成: - 节点把结论**落盘**(--result-file,默认 /tmp/gauge_assembly_result.json,原子写、 先落盘再发话题),任何"没跑到收尾"的退出也会补一份 ok=false; - 脚本读结论文件判成败:0=成功、1=失败、**文件不存在也算失败**并说清; - 新增 test_gauge_result_gate.py:把脚本里那段判成败的 Python 抽出来, 对成功/失败/干跑/缺文件/坏 JSON 五种输入断言退出码 —— 判据本身也有测试。 顺带修掉两个"看着像玄学"的现象 ------------------------------ - **流程打完了终端不回提示符**:launch 里的静态 TF 发布者是常驻的,主节点退出 带不走它 —— 挂 OnProcessExit → Shutdown。 - **"已装 1/2 孔"**:结果里 hole_index 是 0 基当前孔号,不是"装完几个", 新增 holes_done 给人和脚本看。 文档(全部中文,含"怎么调参/还没做") ------------------------------------ - 新增 docs/GAUGE_ASSEMBLY.md:状态机全图、每步判据表、E1 掉件处理(**按实现**: 掉件后该孔作废、换下一个孔;最后一个孔掉件则序号被夹住=重试本孔)、 话题契约、调参顺序、验收命令、踩过的坑。 - FRAMEWORK_RULES 新增 R5.8(同一份数学只许一份 + 守卫测试)、R5.9(自检的 期望类型与调用处同源)、R5.10(缺依赖 skip,别留常年红)、R6.9(硬退出前打 traceback)、R6.10(ros2 launch 退出码恒 0)+ R5.7 补真机/仿真"生效方式不同" (真机软链即改即生效,仿真拷贝必须重编)+ 5 条症状反例、.cursor/rules 同步。 - WORKSPACE / INTERFACES / SITE_CONFIG / HANDBOOK / 两份 README 索引与决策表补齐。 验证(本机真跑) ---------------- pytest(仿真环境) 436 passed, 14 skipped(缺 onnx 跳过) 干跑 --sim --dry-run → 脚本退出码 0,结论 ok=true 已装 2/2 孔 不干跑 --sim → 脚本退出码 1,S00 拦住,未发任何运动指令 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -67,6 +67,18 @@ python3 scripts/check_text_only.py
|
||||
它比对语法树(删 docstring + 抹平字符串常量 + f-string 只留插值),
|
||||
不一致就报出来。基准是 `git HEAD`,所以要在提交前跑。
|
||||
|
||||
## 三个"看着不像坑"的坑(R5.8–R5.10、R6.9)
|
||||
|
||||
- **同一份数学/换算只许一份**,并写一条**守卫测试**扫描调用方禁止私有实现(四元数
|
||||
曾被抄成四份且退化角公式各不相同)。测试要覆盖**退化分支**(180°/270°),不只测一般值。
|
||||
- **自检里的"期望类型/话题名"必须与调用处同源**,不许两处各写一遍字面量 ——
|
||||
否则自检会永远报"类型不对",而人只会去怀疑服务本身。
|
||||
- **硬退出前先 `traceback.print_exc()`**(`os._exit` 会把"退出码 1"变成"日志空白");
|
||||
**环境缺依赖用 `importorskip`**,不许留下常年红 —— 长期红等于没人看测试结果。
|
||||
- **`ros2 launch` 的退出码恒为 0**(子进程 exit 3,它照样返回 0)——判成败必须靠节点
|
||||
**落盘**的结论文件,不许看 `$?`;"没有结论文件"要当失败。常驻节点(静态 TF 发布者)
|
||||
还不会随主节点退出,launch 要显式挂 `OnProcessExit → Shutdown`。
|
||||
|
||||
## 出问题先查症状表
|
||||
|
||||
`docs/FRAMEWORK_RULES.md` 第 8 节按**症状**列出全部历史反例
|
||||
|
||||
Reference in New Issue
Block a user