P5c-1:把 Gazebo 仿真环境真正装起来(独立 conda 环境),并固化安装/构建流程

在此之前,仓库里所有 Gazebo 相关的东西都是"声明"而非"事实":
arm.gazebo.xacro 零引用、stack.launch.py 的 isaac 分支只打印日志、
没有 world 文件、devices/sim/gazebo 下的目录全是空占位。
更关键的是:**这台机器上根本没装 Gazebo**,而 ROS 在 conda 里,没有 /opt/ros,
apt 的 ros-humble-gazebo-* 装了也不会被 conda 的 ROS 认到。

环境(与真机环境物理隔离)
- 新建 conda 环境 ros_gz_sim,**不碰能跑真机的 ros_flexiv**。
  仿真要往环境里塞 Gazebo 及 protobuf/ignition/渲染一整条链,
  和真机环境混装随时可能把它弄坏,代价远大于仿真带来的便利。
- 频道组合照抄 ros_flexiv 的安装记录(robostack-staging + conda-forge),
  那是本机已经证明可用的搭配。

两个实测踩到的坑(都写进了脚本注释,避免下次重踩)
1. empy 版本:conda 默认给 empy 4.x,而 Humble 的 rosidl_adapter 用的是 3.x 的
   API。症状是构建自定义消息包时报 `_interpreter.shutdown()` 的 AttributeError,
   报错点在 rosidl_adapter 内部,完全看不出跟 empy 有关。必须钉 empy=3.3.4。
2. conda 激活是**堆叠**的:同一 shell 里从 ros_gz_sim 切到 ros_flexiv 后,
   `which python` 指向 ros_flexiv,但 `python -m pip` 却解析到 ros_gz_sim 的 pip,
   导致 colcon --symlink-install 报 "option --editable not recognized"。
   这个报错和真实原因毫无关系,极易误判成"环境被搞坏了"。
   现在 scripts/lib/conda_switch.sh 会在切换前退到 base,两个 env 脚本共用。

仿真用独立构建产物
- build_sim/ + install_sim/(scripts/build_sim.sh)。工作区只有一份源码,
  若仿真也写 install/,就会覆盖真机的构建产物。
- 排除 11 个真机专属包(flexiv_hardware 需要 Flexiv RDK C++ SDK,根本装不上;
  另有真机驱动/GPIO/MoveIt 配置/真机 bringup),每个都在脚本里写了理由。

已验证(不是只看退出码)
- Gazebo Fortress 6.16 无头启动正常,物理初始化完成
- /clock 桥接到 ROS 成功收到仿真时间;ros_gz_sim create 成功往世界里建物
- 真机构建 18 包通过、233 项测试通过,build/ install/ 时间戳未变(没被覆盖)
- 仿真侧 7 包构建通过;两环境互切后各自都能正常构建

注:Humble 配的是 Gazebo Fortress(ignition-gazebo6,命令行 `ign gazebo`),
不是现代的 gz-sim —— 后者要 libprotobuf>=6.31,与 RoboStack Humble 钉住的
5.29.3 解不开依赖。Fortress 属于新 Gazebo 家族(非已 EOL 的 Classic),
且是 Humble 的官方配对版本。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
arm_dev
2026-09-23 13:52:04 +08:00
parent d289168dd0
commit a89250d05d
6 changed files with 366 additions and 1 deletions
+84
View File
@@ -0,0 +1,84 @@
#!/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'
echo
echo "构建完成。启动仿真: bash scripts/run_sim_gz.sh"