aed5d326a0
症状一(最隐蔽):同一 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>
97 lines
3.8 KiB
Bash
97 lines
3.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 --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"
|