Files
ros_contorl/scripts/build_sim.sh
T
arm_dev a89250d05d 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>
2026-09-23 13:52:04 +08:00

85 lines
3.1 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'
echo
echo "构建完成。启动仿真: bash scripts/run_sim_gz.sh"