c1cd862eea
这批是 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。
120 lines
4.8 KiB
Bash
120 lines
4.8 KiB
Bash
#!/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"
|