仿真环境串味根治:清残留路径 + 补 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>
This commit is contained in:
arm_dev
2026-09-24 14:42:50 +08:00
parent bda2fa7129
commit aed5d326a0
5 changed files with 171 additions and 0 deletions
+12
View File
@@ -80,5 +80,17 @@ 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"