环境设置
本文档详细介绍了以 setup.sh 脚本为中心的 IB-Robot 环境初始化过程。内容包括先决条件检查、git 子模块管理、系统依赖安装和 Python 虚拟环境配置。
有关设置后构建工作区的信息,请参阅 构建项目。有关驱动系统的配置文件详情,请参阅 配置系统。
概述
环境设置过程准备一个集成了 LeRobot 功能的 ROS 2 Humble 工作区。setup.sh 脚本协调四个主要阶段:
环境验证 - 检测冲突的 Python 环境(Conda)
仓库管理 - 初始化 git 子模块(LeRobot 和 PyMoveIt2)
系统依赖 - 通过
rosdep安装 ROS 2 包Python 环境 - 创建可访问系统 ROS 2 包的隔离 venv
设置工作流
以下图表展示了 scripts/setup.sh 执行的完整设置序列:
graph TB
START["./scripts/setup.sh"]
START --> CHECK_CONDA["check_conda()"]
CHECK_CONDA -->|"CONDA_PREFIX set"| ERROR_CONDA["Exit with error:<br/>Deactivate conda first"]
CHECK_CONDA -->|"No conda active"| SUBMODULE["update_submodules()"]
SUBMODULE --> CHECK_INIT{"All submodules<br/>initialized?"}
CHECK_INIT -->|"Yes"| ASK_UPDATE["Prompt:<br/>Update submodules?"]
CHECK_INIT -->|"No"| ASK_INIT["Interactive selection:<br/>1) All<br/>2) LeRobot only<br/>3) PyMoveIt2 only<br/>4) Individual"]
ASK_UPDATE -->|"Yes"| GIT_UPDATE["git submodule update<br/>--init --recursive"]
ASK_UPDATE -->|"No"| FORK_SETUP
ASK_INIT --> GIT_INIT["git submodule update<br/>--init --recursive [path]"]
GIT_UPDATE --> FORK_SETUP["setup_developer_forks()"]
GIT_INIT --> FORK_SETUP
FORK_SETUP --> PROMPT_USER["Prompt for<br/>GitCode username"]
PROMPT_USER -->|"Provided"| CONFIG_REMOTES["Configure remotes:<br/>origin = fork<br/>upstream = original"]
PROMPT_USER -->|"Skipped"| SYSTEM_DEPS
CONFIG_REMOTES --> SYSTEM_DEPS["install_system_deps()"]
SYSTEM_DEPS --> PKG_MGR{"Package<br/>manager?"}
PKG_MGR -->|"apt-get"| APT_UPDATE["apt-get update<br/>rosdep update"]
PKG_MGR -->|"dnf"| DNF_UPDATE["dnf update<br/>rosdep update"]
APT_UPDATE --> ROSDEP["rosdep install<br/>--from-paths src<br/>--skip-keys [...]"]
DNF_UPDATE --> ROSDEP
ROSDEP --> VENV["setup_python_venv()"]
VENV --> CREATE_VENV["python3 -m venv<br/>--system-site-packages<br/>venv/"]
CREATE_VENV --> ACTIVATE["source venv/bin/activate"]
ACTIVATE --> PIP_UPGRADE["pip install --upgrade pip"]
PIP_UPGRADE --> NUMPY["pip install 'numpy<2'"]
NUMPY --> SETUPTOOLS["pip install 'setuptools<80' 'setuptools>=71'"]
SETUPTOOLS --> LEROBOT_CHECK{"libs/lerobot<br/>exists?"}
LEROBOT_CHECK -->|"Yes"| LEROBOT_INSTALL["pip install -e libs/lerobot"]
LEROBOT_CHECK -->|"No"| HARDWARE_DEPS
LEROBOT_INSTALL --> HARDWARE_DEPS["pip install pyserial<br/>feetech-servo-sdk"]
HARDWARE_DEPS --> SCIPY["pip install scipy"]
SCIPY --> GITLINT["pip install gitlint<br/>gitlint install-hook"]
GITLINT --> VERIFY["Verification:<br/>import rclpy"]
VERIFY -->|"Success"| COMPLETE["Setup complete"]
VERIFY -->|"Failure"| ERROR_VERIFY["Exit with error:<br/>rclpy not accessible"]
COMPLETE --> NEXT["Next step:<br/>./scripts/build.sh"]
先决条件
运行 setup.sh 前,请确保已安装以下组件:
组件 |
版本 |
验证命令 |
|---|---|---|
Ubuntu/openEuler |
22.04 / Embedded |
|
ROS 2 Humble |
基础安装 |
|
Git |
2.x |
|
Python 3 |
3.10+ |
|
关键: 运行设置前必须安装并 source ROS 2 Humble。脚本假设 /opt/ros/humble/setup.sh 存在。
Git 子模块管理
工作区依赖两个作为 git 子模块管理的外部仓库:
graph LR
ROOT["IB_Robot<br/>(main repository)"]
ROOT -->|"submodule"| LEROBOT["libs/lerobot"]
ROOT -->|"submodule"| PYMOVEIT["src/pymoveit2"]
LEROBOT -->|"origin"| LEROBOT_URL["git@gitcode.com:<br/>openeuler/lerobot_ros2.git"]
PYMOVEIT -->|"origin"| PYMOVEIT_URL["https://github.com/<br/>AndrejOrsula/pymoveit2.git"]
LEROBOT -.->|"if fork setup"| LEROBOT_FORK["git@gitcode.com:<br/>username/lerobot_ros2.git"]
ROOT -.->|"if fork setup"| ROOT_FORK["git@gitcode.com:<br/>username/IB_Robot.git"]
子模块初始化策略
update_submodules() 函数 scripts/setup.sh:38-135 提供交互式初始化:
选项 |
初始化的子模块 |
使用场景 |
|---|---|---|
1 - All |
LeRobot + PyMoveIt2 |
完整开发设置 |
2 - LeRobot only |
libs/lerobot |
无 MoveIt 的 训练/推理 |
3 - PyMoveIt2 only |
src/pymoveit2 |
无 AI 的运动规划 |
4 - Individual |
每个模块用户选择 |
自定义配置 |
0 - Skip |
无 |
使用现有子模块状态 |
Git LFS 优化: 脚本设置 GIT_LFS_SKIP_SMUDGE=1
scripts/setup.sh:73,100,105,110,121 以在初始克隆时跳过下载大型模型文件,减少设置时间。
开发者 Fork 配置
对于有个人 fork 的贡献者,setup_developer_forks()
scripts/setup.sh:137-177 配置双远程:
origin → git@gitcode.com:username/IB_Robot.git (你的 fork)
upstream → git@atomgit.com:openeuler/IB_Robot.git (原始仓库)
这启用了用于贡献的标准 fork-and-pull 工作流。
系统依赖安装
install_system_deps() 函数 scripts/setup.sh:182-214 使用 rosdep 安装 ROS 2 包依赖:
rosdep install \
--from-paths src \
--ignore-src \
--rosdistro=humble \
-y -r \
--skip-keys "catkin roscpp lerobot trimesh[easy] simple-parsing cupy-cuda12x ctl_system_interface numpy_lessthan_2 ament_python feetech-servo-sdk pyserial"
跳过的依赖
以下包从 rosdep 安装中排除,因为它们单独处理:
包 |
排除原因 |
|---|---|
|
通过 pip 在 venv 中安装(可编辑模式) |
|
Python 依赖,非 ROS 包 |
|
LeRobot 的 Python 依赖 |
|
GPU 特定,可选依赖 |
|
通过 pip 在硬件依赖中安装 |
|
通过 pip 在硬件依赖中安装 |
|
自定义 rosdep 键,在 venv 中处理 |
|
自定义包,从源码构建 |
Python 虚拟环境
虚拟环境设置是最关键的组件,确保 ROS 2 系统包与 LeRobot 依赖之间的兼容性。
虚拟环境架构
graph TB
subgraph "System Python 3.10"
SYS_RCLPY["rclpy<br/>(ROS 2 core)"]
SYS_TF2["tf2_ros"]
SYS_CV_BRIDGE["cv_bridge"]
end
subgraph "venv/ (with --system-site-packages)"
VENV_PIP["pip 24.x"]
VENV_NUMPY["numpy 1.26.x<br/>(forced < 2.0)"]
VENV_SETUPTOOLS["setuptools 71-79<br/>(colcon compatible)"]
VENV_LEROBOT["lerobot<br/>(editable install)"]
VENV_TORCH["torch 2.x<br/>(LeRobot dependency)"]
VENV_HARDWARE["pyserial<br/>feetech-servo-sdk"]
VENV_SCIPY["scipy"]
VENV_GITLINT["gitlint"]
end
VENV_NUMPY -.->|"inherits from system"| SYS_RCLPY
VENV_LEROBOT --> VENV_TORCH
VENV_LEROBOT --> VENV_NUMPY
SYS_RCLPY -.->|"accessible via<br/>--system-site-packages"| VENV_PIP
SYS_TF2 -.->|"accessible"| VENV_PIP
SYS_CV_BRIDGE -.->|"accessible"| VENV_PIP
关键配置:–system-site-packages
venv 使用 --system-site-packages 标志创建
scripts/setup.sh:231:
python3 -m venv --system-site-packages "${WORKSPACE}/venv"
原因: ROS 2 Python 包(rclpy、tf2_ros 等)通过 apt/dnf 系统级安装。没有此标志,venv 将与这些包隔离,破坏 ROS 2 集成。
NumPy 版本约束
脚本强制使用 NumPy 1.x scripts/setup.sh:244-245:
python3 -m pip install "numpy<2" --quiet
原因: ROS 2 Humble 的系统包(特别是 cv_bridge 和传感器数据转换器)是针对 NumPy 1.x ABI 编译的。NumPy 2.0 引入了破坏性的 C API 更改,会导致 ROS 2 组件出现段错误。
Setuptools 版本范围
脚本安装特定的 setuptools 范围 scripts/setup.sh:248:
python3 -m pip install "setuptools<80" "setuptools>=71" --quiet
原因: - >= 71 LeRobot 构建系统所需 - < 80 colcon build 兼容性所需(setuptools 80+ 弃用了 ament_python 使用的功能)
LeRobot 可编辑安装
如果 libs/lerobot 存在,它以可编辑模式安装
scripts/setup.sh:251-254:
python3 -m pip install -e "${WORKSPACE}/libs/lerobot"
好处: 对 LeRobot 库代码的更改立即生效,无需重新安装,这对策略开发和调试至关重要。
验证过程
脚本验证 ROS 2 可访问性 scripts/setup.sh:271-277:
source /opt/ros/humble/setup.sh
python3 -c "import rclpy; print('ROS 2 Humble connection successful')"
如果失败,venv 配置错误,无法运行 ROS 2 节点。
环境验证
Conda 冲突检测
check_conda() 函数 scripts/setup.sh:25-33 防止在活动 Conda 环境中设置:
if [[ -n "${CONDA_PREFIX}" ]]; then
log_error "Active Conda environment detected at: ${CONDA_PREFIX}"
exit 1
fi
原因: Conda 环境覆盖系统 Python 路径,导致与 ROS 2 系统安装的包冲突。常见故障包括:- rclpy 导入错误(Conda 的 Python 与系统 Python 版本不匹配)- 共享库加载失败(混合 libpython 版本)- cv_bridge 段错误(NumPy ABI 不兼容)
解决方法: 执行 setup.sh 前运行 conda deactivate。
完整依赖图
以下图表映射设置期间安装的完整依赖链:
graph TB
SETUP["setup.sh"]
subgraph "Phase 1: System Dependencies (rosdep)"
ROSDEP_APT["apt packages:<br/>- ros-humble-*<br/>- python3-venv<br/>- python3-pip"]
ROSDEP_ROS["ROS 2 packages:<br/>- usb_cam<br/>- image_transport<br/>- moveit_ros<br/>- gazebo_ros2_control"]
end
subgraph "Phase 2: Python venv"
VENV_CORE["Core:<br/>- pip (latest)<br/>- numpy < 2<br/>- setuptools 71-79"]
VENV_LEROBOT_PKG["LeRobot:<br/>- torch<br/>- transformers<br/>- datasets<br/>- diffusers"]
VENV_HW["Hardware:<br/>- pyserial<br/>- feetech-servo-sdk"]
VENV_UTILS["Utilities:<br/>- scipy<br/>- gitlint"]
end
subgraph "Phase 3: Git Submodules"
SUBMOD_LEROBOT["libs/lerobot<br/>(editable install)"]
SUBMOD_PYMOVEIT["src/pymoveit2<br/>(source package)"]
end
SETUP --> ROSDEP_APT
SETUP --> ROSDEP_ROS
SETUP --> VENV_CORE
VENV_CORE --> VENV_LEROBOT_PKG
VENV_CORE --> VENV_HW
VENV_CORE --> VENV_UTILS
VENV_LEROBOT_PKG --> SUBMOD_LEROBOT
SETUP --> SUBMOD_LEROBOT
SETUP --> SUBMOD_PYMOVEIT
使用示例
典型的首次设置:
# 1. 克隆仓库
git clone <repository-url> ~/ib_robot_ws
cd ~/ib_robot_ws
# 2. Source ROS 2
source /opt/ros/humble/setup.bash
# 3. 运行设置脚本
./scripts/setup.sh
# 交互式提示:
# - Initialize all submodules? [y/N]: y
# - Enter GitCode username (leave empty to skip): <enter>
# 4. 设置完成,激活 venv
source venv/bin/activate
# 5. 验证环境
python3 -c "import rclpy; import lerobot; print('Environment ready')"
成功设置后,继续 构建项目。
故障排除
问题 |
症状 |
解决方法 |
|---|---|---|
Conda 冲突 |
|
设置前运行 |
rosdep 失败 |
|
更新 rosdep: |
rclpy 导入错误 |
|
使用 |
NumPy ABI 崩溃 |
cv_bridge 中出现段错误 |
确保 venv 中安装了 |
子模块为空 |
|
删除目录并重新运行 |
Git LFS 超时 |
大文件下载挂起 |
克隆前设置 |