应用层修复:S00 自检假阴性、S07 触觉假断流、S07 下探静默卡死

三处都是"看着像硬件问题、其实是判据问题"的假警报:

1. S00 自检假阴性(gauge_boot.py)
   探测等待时用 time.sleep 不 spin → 订阅回调根本没机会执行,
   于是**健康的硬件也会被判"没有数据"**。改成等待期间持续 spin。

2. S07 触觉假断流(stage3_search_node.py)
   判据原本是 |fnormal| > 1.0,但力本来就可能是零或很小(真机轻触、
   仿真刚接触)→ 明明在发数据却判"触觉断流"。
   改成"数据够新(TACTILE_MAX_AGE_S 内)+ connected" —— 判活看的是
   **有没有在发**,不是**数值大不大**。

3. S07 下探静默卡死(gauge_fsm.py / gauge_assembly_node.py)
   _goto 的到位容差 ≥ 步长时,每一步都被判成"已在容差内",臂一步都不走,
   而外层只看到"没进度"→ 死循环到超时,日志里看不出原因。
   新增 descend_tol_m / descend_iter_budget / descend_progress:
   容差从步长推导(不该手工调大),并显式判"连续 N 步零位移"。
   容差 ≥ 步长的反例已进 site 回归测试,防止再犯。

4. site 分段化(export_site_env.py):89/91 两臂的 servo/handeye/点位
   各一段,避免"改 91 影响 89"。

另:run_unit_tests.sh 作为统一测试入口(932→933 项),
    devices/sim/gazebo/README.md 同步。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
arm_dev
2026-09-24 14:43:19 +08:00
parent b29339e522
commit 36a59c81bf
21 changed files with 1573 additions and 99 deletions
+44
View File
@@ -0,0 +1,44 @@
#!/usr/bin/env bash
# 跑全仓库的单元测试(纯逻辑:不需要硬件、不需要 Gazebo、不发运动指令)。
#
# 为什么要有这个脚本,而不是让人手敲 pytest
# ----------------------------------------
# 测试都按**包名**导入(arm_application.* / arm_sim_gazebo.* / arm_kinematics.*),
# 所以 PYTHONPATH 必须同时包含 src/ 下所有包目录。手敲很容易漏一个:
# 漏了 src/arm_kinematics,`from arm_application.pipeline_node import ...` 会在
# 收集阶段就 ModuleNotFoundError —— 现象是"测试跑了 0 个 / 1 个 error",
# 很容易被读成"测试环境坏了",而不是"少了一个路径"。
#
# 用法:
# bash scripts/run_unit_tests.sh # 全部
# bash scripts/run_unit_tests.sh -k gauge # 只跑名字带 gauge 的
# bash scripts/run_unit_tests.sh src/arm_sim_gazebo/test/test_sim_scene.py -x
#
# 环境:真机 conda 环境或仿真环境都能跑;缺可选依赖的用例自己会 skip
#(例如 onnx/ultralytics 只在真机环境有 —— 见各测试里的 pytest.importorskip)。
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PY="${PYTHON:-python3}"
# 把所有 src/* 目录挂到 PYTHONPATH 最前面(包名不冲突,顺序无关)。
paths=()
for d in "${ROOT}"/src/*/; do
paths+=("${d%/}")
done
export PYTHONPATH="$(IFS=:; echo "${paths[*]}")${PYTHONPATH:+:${PYTHONPATH}}"
test_dirs=()
for d in "${ROOT}"/src/*/test; do
[ -d "$d" ] && test_dirs+=("$d")
done
if [ "${#test_dirs[@]}" -eq 0 ]; then
echo "没有找到任何测试目录(src/*/test)—— 仓库不完整?" >&2
exit 1
fi
cd "${ROOT}"
if [ "$#" -gt 0 ]; then
exec "${PY}" -m pytest "${test_dirs[@]}" -q "$@"
fi
exec "${PY}" -m pytest "${test_dirs[@]}" -q