Files
ros_contorl/scripts/build_sim.sh
T
arm_dev aed5d326a0 仿真环境串味根治:清残留路径 + 补 conda lib + 修入口脚本 shebang
症状一(最隐蔽):同一 shell 里先 source 过真机环境(scripts/env.sh)再
source 仿真环境,install/ 与 ros_flexiv 的路径不会被 conda deactivate 撤掉,
长在 install_sim/ 前面:
  - PYTHONPATH 里真机那份 arm_msgs 压住仿真那份 → 消息类型混用
  - LD_LIBRARY_PATH 里没有 $CONDA_PREFIX/lib → sim_tactile_adapter 订阅
    ros_gz_interfaces/Contacts 时抛
      Type support not from this implementation ...
      cannot open shared object file
    而库其实就在 conda 里、ldd 全齐。整条触觉链静默死掉(话题不发)。

症状二:setuptools 写 console_scripts 用的是**构建那一刻**的 python。
若在真机环境里跑过 build_sim.sh,install_sim/ 里 7 个入口脚本的 shebang
会指向 ros_flexiv —— 而 ros2 run 是照 shebang 执行的,于是**仿真节点一直
跑在真机 conda 环境里**。两个环境都是 Humble+py3.11,所以"居然能跑",
只有偶发 dlopen / 反序列化怪错。

修法:
  - conda_switch.sh 新增 path_drop_patterns:按 glob 从冒号列表里删条目
  - sim_env.sh 清掉真机残留 + 末尾补 $CONDA_PREFIX/lib(优先级最低)
  - 新增 lib/fix_shebangs.sh,build.sh / build_sim.sh 收尾各扫一遍(幂等)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-24 14:42:50 +08:00

97 lines
3.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 --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"