应用层修复: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:
Executable
+44
@@ -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
|
||||
Reference in New Issue
Block a user