Files
ros_contorl/scripts/run_unit_tests.sh
T
arm_dev 36a59c81bf 应用层修复: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>
2026-09-24 14:43:19 +08:00

45 lines
1.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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