Files
ros_contorl/scripts/build_sim.sh
T
arm_dev c1cd862eea 真机落地前的仿真补齐:夹持/腕力/真值位姿,让仿真能验证 S07–S09
这批是 09-24 那轮仿真工作的收尾,一直没提交。内容按目的分四块:

1) 仿真真能「夹住」工件
   sim_grasp_lock:给规与夹爪之间加接触锁(默认关,run_gauge_assembly --sim 才开)。
   没有它时仿真里规只靠摩擦,S08 棘轮一转就滑出指间,于是把「仿真不真」误读成
   「力判据不对」。新增 test_sim_grasp_lock.py。

2) 腕部力传感器进仿真
   sim_wrist_ft(+ config/wrist_ft.yaml):S07 的首选判据是腕部 FT 的轴向突变,
   而仿真里以前根本没有腕部力,S07 只能退到触觉兜底,两套判据从没在同一场景下比过。
   现在两条通道都在,接触判定可对照。

3) 真值位姿可查(不再靠猜)
   sim_live_pose / sim_pose_service:把 Gazebo 里刚体的实测位姿发布出来,
   stage2 的真值路径按**实测**位姿算孔位,而不是按场景文件里的标称位姿。
   顺带把真值孔位的推导(truth_holes)独立出来并补测。

4) 工具几何成为可配置项
   config/sim_tool_geometry.yaml + stage2 的 tool_tip_below_flange_m 启动参数:
   仿真里规会在指间下滑,工具长每次装夹都不同(实测见过 243/254mm),
   悬停高度与 S07 下探预算必须按实测值算,不能再写死。

应用层同时跟进:gauge_fsm / gauge_config 把「悬停时工具尖端入没入工件」的判据
(hover_z_guard)与拖件判定(drag_verdict)收成纯函数并补测;stage3 搜孔、
site 导出、run_gauge_assembly 与若干文档同步。
新增 test_gauge_exit_lift / test_gauge_gripper_client / test_node_handler_collisions。

测试:全仓库 1085 passed。
2026-09-28 10:17:06 +08:00

120 lines
4.8 KiB
Bash
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
# =============================================================================
# 在仿真环境里构建本工作区。
#
# 用法:
# bash scripts/build_sim.sh # 增量构建
# bash scripts/build_sim.sh --clean # 先删掉 build_sim/ install_sim/
# bash scripts/build_sim.sh --all # 不做任何排除(用于排查)
#
# 关键:构建产物写进 build_sim/ install_sim/,**绝不碰真机环境的 build/ install/**。
# 工作区只有一份源码,两个环境各用一套产物目录,互不覆盖。
# =============================================================================
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "${ROOT}"
CLEAN=0
NO_SKIP=0
for a in "$@"; do
case "$a" in
--clean) CLEAN=1 ;;
--all) NO_SKIP=1 ;;
-h|--help) sed -n '2,15p' "$0"; exit 0 ;;
*) echo "未知参数: $a" >&2; exit 2 ;;
esac
done
# --- 排除清单 ---------------------------------------------------------------
# 这些包在仿真里用不上,而且不少根本**装不上**(依赖真机 SDK),不排除就整个构建失败。
# 每一项都写清理由,避免以后有人不明就里地删掉或加回来。
SKIP=(
# 需要 Flexiv RDK C++ SDK(flexiv_rdk),仿真里硬件层由 gz_ros2_control 提供
flexiv_hardware
# 真机 RDK 桥接驱动(起子进程连真机),仿真里无真机可连
arm_driver_flexiv
# Flexiv 官方真机栈
flexiv_msgs
flexiv_bringup
flexiv_gripper
flexiv_robot_states_broadcaster
# 真机硬件测试节点
flexiv_test_nodes
# 真机 GPIO(气爪/电磁阀),仿真里没有对应的物理器件
gpio_controller
# MoveIt 配置:体量大,且仿真运动不走 MoveIt 规划
arm_moveit_config
flexiv_moveit_config
# 真机 bringup。它 CMake 硬依赖 arm_moveit_config,而仿真启动器是
# arm_sim_gazebo(见 devices/sim/gazebo/manifest.yaml 的声明),
# 不需要它。真机路径完全不受影响。
arm_bringup
)
echo "=== 构建仿真工作区 ==="
echo " 产物目录: build_sim/ install_sim/"
if [[ "${NO_SKIP}" -eq 1 ]]; then
echo " 排除: 无(--all)"
else
echo " 排除: ${#SKIP[@]} 个真机专属包"
fi
if [[ "${CLEAN}" -eq 1 ]]; then
echo " 清理: 删除 build_sim/ install_sim/ log_sim/"
rm -rf build_sim install_sim log_sim
fi
# --- 激活仿真环境 -----------------------------------------------------------
# shellcheck disable=SC1091
source "${ROOT}/scripts/sim_env.sh"
ARGS=(build --build-base build_sim --install-base install_sim)
# 注意:这里**不能**加 --symlink-install。仿真环境的 setuptools 较旧,
# 不认 --editable,会报 "error: option --editable not recognized"。
# 代价只是安装产物是拷贝而非软链,功能不受影响。
if [[ "${NO_SKIP}" -eq 0 ]]; then
ARGS+=(--packages-skip "${SKIP[@]}")
fi
# --- 先做语法自检(colcon **不**编译 .py)------------------------------------
# colcon 对 Python 包只做拷贝:语法错了它照样"构建成功",而报错会出现在
# 很久以后的 `ros2 run` / `pytest` 收集阶段,且长这样:
# File "install_sim/.../sim_truth_perception.py", line 441
# 看上去像"安装产物坏了",其实根因在源码里(实测过一个中文字符串里混了
# ASCII 引号)。在这里提前炸,能把"源码错"和"安装产物错"分开。
echo "检查 Python 源码语法(colcon 不编译 .py,语法错要到运行时才炸)…"
python3 - <<'PY'
import pathlib
import sys
bad = []
for p in sorted(pathlib.Path("src").rglob("*.py")):
try:
compile(p.read_text(encoding="utf-8"), str(p), "exec")
except SyntaxError as e: # noqa: PERF203
bad.append(f" {p}:{e.lineno}: {e.msg}")
if bad:
print("源码有语法错误,先修再构建:", file=sys.stderr)
print("\n".join(bad), file=sys.stderr)
raise SystemExit(1)
PY
colcon --log-base log_sim "${ARGS[@]}" 2>&1 \
| grep -vE 'anaconda-auth|conda-content-trust|Unknown distribution option|warnings\.warn'
# --- 修正入口脚本的 shebang ------------------------------------------------
# setuptools 写 console_scripts 时用的是**构建那一刻**的 python。如果在真机
# 环境(ros_flexiv)里跑过本脚本,install_sim/ 里的脚本 shebang 就会指向
# ros_flexiv —— 于是 ros2 run 起来的仿真节点其实跑在真机 conda 环境里。
# 两个环境都是 Humble + py3.11,所以多数时候"居然能跑",只有偶发的
# dlopen / 消息反序列化怪错误。这里统一改回仿真环境的 python。
# shellcheck source=lib/fix_shebangs.sh
source "${ROOT}/scripts/lib/fix_shebangs.sh"
echo
echo "检查入口脚本 shebang(是否误指向真机 conda 环境)…"
fix_shebangs "${ROOT}/install_sim" "${CONDA_PREFIX:-/usr}/bin/python3"
echo
echo "构建完成。启动仿真: bash scripts/run_sim_gz.sh"