开发指南概述
相关源文件
以下文件用作生成此 wiki 页面的上下文:
本页面为参与 IB-Robot 代码库开发的开发者提供实用指南。内容涵盖环境配置、IDE 设置、构建系统使用、调试技术和验证工作流程。有关初始设置说明,请参阅 入门指南。有关特定包的开发详情,请参考 包参考。
开发环境架构
IB-Robot 开发环境由三个集成层组成:带有 ROS 2 系统站点包的 Python 虚拟环境、带有工作区特定 mixin 的 colcon 构建系统,以及用于 IntelliSense 和调试的 VS Code 配置。
graph TB
subgraph "Layer 1: Environment Setup"
SETUP["setup.sh<br/>Environment Initialization"]
subgraph "Conda Detection"
CONDA_CHECK["check_conda()<br/>CONDA_PREFIX detection"]
CONDA_BLOCK["Exit with error<br/>if Conda active"]
end
subgraph "Git Submodule Management"
SUBMOD_DETECT["Check .git directories<br/>libs/lerobot, src/pymoveit2"]
SUBMOD_PROMPT["Interactive selection<br/>All/LeRobot/PyMoveIt2/Individual"]
SUBMOD_UPDATE["git submodule update<br/>--init --recursive"]
end
subgraph "Python venv Creation"
VENV_CREATE["python3 -m venv<br/>--system-site-packages"]
VENV_DEPS["pip install requirements<br/>numpy<2, setuptools<80"]
LEROBOT_INSTALL["pip install -e libs/lerobot"]
HW_DEPS["pip install pyserial<br/>feetech-servo-sdk"]
end
SETUP --> CONDA_CHECK
CONDA_CHECK --> CONDA_BLOCK
CONDA_CHECK --> SUBMOD_DETECT
SUBMOD_DETECT --> SUBMOD_PROMPT
SUBMOD_PROMPT --> SUBMOD_UPDATE
SUBMOD_UPDATE --> VENV_CREATE
VENV_CREATE --> VENV_DEPS
VENV_DEPS --> LEROBOT_INSTALL
LEROBOT_INSTALL --> HW_DEPS
end
subgraph "Layer 2: Build System"
COLCON[".colcon/defaults.yaml<br/>merge-install: true"]
subgraph "Mixin Definitions"
MIXIN_INDEX[".colcon/mixin/index.yaml"]
MIXIN_BUILD[".colcon/mixin/build.mixin.yaml"]
DEBUG_MIXIN["debug mixin<br/>CMAKE_BUILD_TYPE=Debug"]
RELEASE_MIXIN["release mixin<br/>CMAKE_BUILD_TYPE=Release"]
DEV_MIXIN["dev mixin<br/>symlink-install + Debug"]
PROD_MIXIN["prod mixin<br/>Release + no testing"]
end
MIXIN_INDEX --> MIXIN_BUILD
MIXIN_BUILD --> DEBUG_MIXIN
MIXIN_BUILD --> RELEASE_MIXIN
MIXIN_BUILD --> DEV_MIXIN
MIXIN_BUILD --> PROD_MIXIN
end
subgraph "Layer 3: VS Code Integration"
SETTINGS[".vscode/settings.json<br/>Python interpreter + paths"]
TASKS[".vscode/tasks.json<br/>colcon build tasks"]
LAUNCH[".vscode/launch.json<br/>Debug configurations"]
EXTENSIONS[".vscode/extensions.json<br/>Recommended tools"]
CPP_PROPS[".vscode/c_cpp_properties.json<br/>C++ IntelliSense"]
end
HW_DEPS -.->|provides Python env| SETTINGS
COLCON -.->|used by| TASKS
MIXIN_BUILD -.->|applied in| TASKS
SETTINGS -.->|configures| LAUNCH
来源: scripts/setup.sh:1-307, .vscode/settings.json:1-33, .colcon/defaults.yaml:1-23, .colcon/mixin/build.mixin.yaml:1-19, .vscode/tasks.json:1-26
Python 虚拟环境配置
工作区使用启用了 --system-site-packages 的 Python 虚拟环境,以便在隔离项目依赖的同时访问 ROS 2 系统安装的 rclpy。
关键依赖项
包 |
版本约束 |
原因 |
|---|---|---|
|
|
ROS 2 Humble 组件需要 NumPy 1.x API |
|
|
平衡 LeRobot 需求与 colcon 兼容性 |
|
可编辑安装 |
开发修改 立即生效 |
|
最新版本 |
Feetech 舵机 通信 |
|
最新版本 |
SO-101 硬件 接口 |
|
最新版本 |
四元数/旋转 矩阵转换 |
|
最新版本 |
提交消息 验证 |
设置流程
虚拟环境由 scripts/setup.sh:216-278 创建:
# Create venv with system site packages
python3 -m venv --system-site-packages venv
# Activate and install dependencies
source venv/bin/activate
pip install --upgrade pip
pip install "numpy<2"
pip install "setuptools<80" "setuptools>=71"
pip install -e libs/lerobot
pip install pyserial feetech-servo-sdk scipy
pip install gitlint
gitlint install-hook
Conda 冲突检测
如果检测到 Conda 环境处于活动状态,设置脚本将阻止执行 scripts/setup.sh:25-33:
check_conda() {
if [[ -n "${CONDA_PREFIX}" ]]; then
log_error "Active Conda environment detected"
log_warn "Conda environments conflict with ROS 2 Python libraries"
exit 1
fi
}
原因:Conda 的包隔离可能会覆盖 ROS 2 系统包,导致 rclpy 和 tf2_ros 的导入冲突。
Git 子模块管理
工作区包含 .gitmodules:1-11 中定义的两个子模块:
子模块 |
路径 |
用途 |
|---|---|---|
|
|
带有 ROS 2 集成的 LeRobot 库 |
|
|
MoveIt 2 的 Python API |
交互式初始化
设置脚本提供选择性子模块初始化 scripts/setup.sh:38-135:
graph LR
START["setup.sh execution"]
CHECK{"Submodules<br/>initialized?"}
PROMPT_UPDATE["Prompt: Update all?"]
UPDATE_ALL["git submodule update<br/>--init --recursive"]
PROMPT_SELECT["Menu:<br/>1. All<br/>2. LeRobot only<br/>3. PyMoveIt2 only<br/>4. Individual<br/>0. Skip"]
INIT_ALL["Initialize all submodules"]
INIT_LEROBOT["Initialize libs/lerobot"]
INIT_PYMOVEIT["Initialize src/pymoveit2"]
INIT_CUSTOM["Interactive per-submodule"]
START --> CHECK
CHECK -->|All exist| PROMPT_UPDATE
CHECK -->|Some missing| PROMPT_SELECT
PROMPT_UPDATE -->|Yes| UPDATE_ALL
PROMPT_UPDATE -->|No| SKIP
PROMPT_SELECT -->|1| INIT_ALL
PROMPT_SELECT -->|2| INIT_LEROBOT
PROMPT_SELECT -->|3| INIT_PYMOVEIT
PROMPT_SELECT -->|4| INIT_CUSTOM
PROMPT_SELECT -->|0| SKIP
SKIP["Continue without update"]
开发者 Fork 配置
对于拥有个人 fork 的贡献者,设置脚本可以重新配置远程仓库 scripts/setup.sh:137-177:
# Prompts for GitCode username
# Sets: origin → user's fork
# upstream → original repository
git remote set-url origin git@gitcode.com:${USERNAME}/IB_Robot.git
git remote add upstream git@atomgit.com:openeuler/IB_Robot.git
# Also configures submodule fork
cd libs/lerobot
git remote set-url origin git@gitcode.com:${USERNAME}/lerobot_ros2.git
git remote add upstream <original-lerobot-url>
VS Code 配置
工作区设置架构
.vscode/settings.json:1-33 文件配置 Python IntelliSense 和 ROS 2 集成:
graph TB
subgraph "Python Configuration"
INTERP["defaultInterpreterPath<br/>workspaceFolder/venv/bin/python3"]
ANALYSIS_PATHS["python.analysis.extraPaths"]
AUTOCOMPLETE_PATHS["python.autoComplete.extraPaths"]
PATH_LEROBOT["libs/lerobot/src"]
PATH_SRC["src"]
PATH_ROS_LIB["/opt/ros/humble/lib/python3.10/site-packages"]
PATH_ROS_LOCAL["/opt/ros/humble/local/lib/python3.10/dist-packages"]
PATH_VENV["venv/lib/python3.10/site-packages"]
end
subgraph "Terminal Environment"
TERM_ENV["terminal.integrated.env.linux"]
PYTHONPATH["PYTHONPATH environment variable"]
end
subgraph "File Associations"
REPOS_YAML["*.repos files → YAML"]
end
subgraph "Search Exclusions"
EXCLUDE_BUILD["build/"]
EXCLUDE_INSTALL["install/"]
EXCLUDE_LOG["log/"]
EXCLUDE_VENV["venv/"]
end
subgraph "ROS Integration"
ROS_DISTRO["ros.distro: humble"]
ROS_SETUP["ros.setupSource<br/>/opt/ros/humble/setup.sh"]
end
INTERP --> ANALYSIS_PATHS
INTERP --> AUTOCOMPLETE_PATHS
ANALYSIS_PATHS --> PATH_LEROBOT
ANALYSIS_PATHS --> PATH_SRC
ANALYSIS_PATHS --> PATH_ROS_LIB
ANALYSIS_PATHS --> PATH_ROS_LOCAL
ANALYSIS_PATHS --> PATH_VENV
AUTOCOMPLETE_PATHS --> PATH_LEROBOT
AUTOCOMPLETE_PATHS --> PATH_SRC
AUTOCOMPLETE_PATHS --> PATH_ROS_LIB
关键配置值:
设置 |
值 |
用途 |
|---|---|---|
|
|
使用工作区 venv |
|
LeRobot, src, ROS 路径 |
启用导入解析 |
|
合并路径 |
确保终端使用正确的导入 |
|
|
RDE 扩展 ROS 版本 |
|
|
改善搜索性能 |
推荐扩展
.vscode/extensions.json:1-13 列出了必要的扩展:
扩展 ID |
用途 |
|---|---|
|
Python 语言支持和 调试 |
|
C++ IntelliSense(用于 ros2_control 插件) |
|
C++ LLDB 调试器 |
|
CMake 集成 |
|
YAML 模式验证 |
|
ROS 开发环境包 |
|
可选 AI 助手 |
C++ IntelliSense 配置
.vscode/c_cpp_properties.json:1-17 配置 C++ 语言功能:
{
"configurations": [
{
"name": "ROS2-Humble",
"includePath": [
"${workspaceFolder}/**",
"/opt/ros/humble/include/**",
"/usr/include/**"
],
"cppStandard": "c++17",
"intelliSenseMode": "linux-gcc-x64"
}
]
}
来源: .vscode/settings.json:1-33, .vscode/extensions.json:1-13, .vscode/c_cpp_properties.json:1-17
构建系统和 Mixin
Colcon 工作区默认设置
.colcon/defaults.yaml:1-23 设置工作区范围的构建行为:
build:
merge-install: true # Single install/ directory
event-handlers:
- console_cohesion+ # Grouped output per package
base-paths:
- src
为什么使用 ``merge-install``:所有包合并到单个 install/ 目录树中,而不是单独的 install/<package> 目录。这简化了环境加载(一个 setup.bash 而不是多个),并减少磁盘使用。
Mixin 系统架构
Mixin 系统通过 .colcon/mixin/build.mixin.yaml:1-19 提供可重用的构建配置:
graph TB
subgraph "Build Mode Mixins"
DEBUG["debug<br/>CMAKE_BUILD_TYPE=Debug<br/>COMPILE_COMMANDS=ON"]
RELEASE["release<br/>CMAKE_BUILD_TYPE=Release<br/>COMPILE_COMMANDS=ON"]
REL_DEB["rel-with-deb-info<br/>CMAKE_BUILD_TYPE=RelWithDebInfo"]
end
subgraph "Testing Mixins"
TEST["test<br/>BUILD_TESTING=ON"]
NO_TEST["no-test<br/>BUILD_TESTING=OFF"]
LINT["lint<br/>BUILD_TESTING=ON<br/>AMENT_LINT_AUTO=ON"]
end
subgraph "Workflow Mixins"
DEV["dev<br/>symlink-install: true<br/>Debug + no testing"]
PROD["prod<br/>Release + no testing<br/>TRACETOOLS_DISABLED=ON"]
end
USAGE["colcon build --mixin dev"]
USAGE -.->|applies| DEV
DEV -.->|combines| DEBUG
DEV -.->|combines| NO_TEST
常用构建命令
命令 |
用例 |
|---|---|
|
开发:调试符号、符号链接安装、快速迭代 |
|
性能测试:优化代码、构建较慢 |
|
生产部署:Release + 无测试 + 无追踪 |
|
带调试的测试:调试符号 + 测试目标 |
|
单个包:仅构建指定的包及其依赖 |
|
包及其依赖:构建目标包及所有上游依赖 |
VS Code 构建任务
.vscode/tasks.json:1-26 定义了两个构建任务:
{
"tasks": [
{
"label": "colcon build",
"command": "source /opt/ros/humble/setup.sh && source venv/bin/activate && colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release",
"group": {"kind": "build", "isDefault": true}
},
{
"label": "colcon build selected",
"command": "colcon build --packages-select ${relativeFileDirname}"
}
]
}
用法:
Ctrl+Shift+B触发默认的 “colcon build” 任务“colcon build selected” 仅构建包含当前文件的包
来源: .colcon/defaults.yaml:1-23, .colcon/mixin/build.mixin.yaml:1-19, .vscode/tasks.json:1-26
调试配置
Python 节点调试
.vscode/launch.json:1-28 提供两个 Python 调试配置:
配置 1:调试当前文件
{
"name": "ROS2: Debug Python Node (Current File)",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"env": {
"PYTHONPATH": "libs/lerobot_ros2:venv/lib/python3.10/site-packages:/opt/ros/humble/lib/python3.10/site-packages"
}
}
用法:打开任意 Python 节点文件,按 F5 直接调试。
配置 2:特定节点(action_dispatcher_node)
{
"name": "ROS2: Action Dispatcher Node",
"type": "python",
"request": "launch",
"program": "src/action_dispatch/action_dispatch/action_dispatcher_node.py",
"args": ["--ros-args", "-p", "robot_name:=test_single_arm_single_cam"],
"env": {
"PYTHONPATH": "libs/lerobot_ros2:venv/lib/python3.10/site-packages:/opt/ros/humble/lib/python3.10/site-packages"
}
}
用法:从调试下拉菜单中选择 “ROS2: Action Dispatcher Node”,按 F5。
调试工作流程
graph LR
OPEN["Open Python node file"]
SET_BP["Set breakpoints"]
SELECT["Select debug configuration"]
LAUNCH["Press F5"]
DEBUG["Debugger attaches"]
INTERACT["Inspect variables<br/>Step through code<br/>Evaluate expressions"]
OPEN --> SET_BP
SET_BP --> SELECT
SELECT --> LAUNCH
LAUNCH --> DEBUG
DEBUG --> INTERACT
C++ 调试
对于 C++ 节点(例如 robot_hardware 中的硬件插件):
使用调试符号构建:
colcon build --mixin debug生成编译命令:由 mixin 自动启用
使用
vadimcn.vscode-lldb扩展进行调试附加到运行中的进程或通过
launch.json启动
配置验证
validate_config.py 脚本
scripts/validate_config.py:1-351 强制执行机器人配置文件之间的一致性:
graph TB
START["validate_config.py"]
subgraph "Step 1: Load robot_config"
LOAD_ROBOT["Load YAML<br/>so101_single_arm.yaml"]
EXTRACT_JOINTS["Extract joints.arm<br/>joints.gripper<br/>joints.all"]
VALIDATE_UNION{"arm ∪ gripper<br/>== all?"}
end
subgraph "Step 2: Resolve Controllers"
RESOLVE_PATH["Resolve $(find package)<br/>from ros2_control.controllers_config"]
LOAD_CTRL["Load controllers YAML"]
end
subgraph "Step 3: Validate Controllers"
CHECK_ARM_POS["arm_position_controller<br/>joints == arm"]
CHECK_ARM_TRAJ["arm_trajectory_controller<br/>joints == arm"]
CHECK_GRIP_POS["gripper_position_controller<br/>joints == gripper"]
CHECK_GRIP_TRAJ["gripper_trajectory_controller<br/>joints == gripper"]
CHECK_JS_BROAD["joint_state_broadcaster<br/>joints == all"]
end
subgraph "Step 4: Validate MoveIt"
LOAD_MOVEIT["Load moveit_controllers.yaml"]
CHECK_MOVEIT_ARM["arm_trajectory_controller<br/>joints == arm"]
CHECK_MOVEIT_GRIP["gripper_trajectory_controller<br/>joints == gripper"]
end
SUMMARY["Print summary:<br/>Errors + Warnings"]
EXIT{"Errors?"}
START --> LOAD_ROBOT
LOAD_ROBOT --> EXTRACT_JOINTS
EXTRACT_JOINTS --> VALIDATE_UNION
VALIDATE_UNION -->|Warning if mismatch| RESOLVE_PATH
RESOLVE_PATH --> LOAD_CTRL
LOAD_CTRL --> CHECK_ARM_POS
CHECK_ARM_POS --> CHECK_ARM_TRAJ
CHECK_ARM_TRAJ --> CHECK_GRIP_POS
CHECK_GRIP_POS --> CHECK_GRIP_TRAJ
CHECK_GRIP_TRAJ --> CHECK_JS_BROAD
CHECK_JS_BROAD --> LOAD_MOVEIT
LOAD_MOVEIT --> CHECK_MOVEIT_ARM
CHECK_MOVEIT_ARM --> CHECK_MOVEIT_GRIP
CHECK_MOVEIT_GRIP --> SUMMARY
SUMMARY --> EXIT
EXIT -->|Yes| FAIL["Exit code 1"]
EXIT -->|No| SUCCESS["Exit code 0"]
执行的验证检查
配置文件 |
检查的控制器 |
预期关节 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
运行验证
# Default: validate src/robot_config/config/robots/so101_single_arm.yaml
python scripts/validate_config.py
# Verbose output
python scripts/validate_config.py --verbose
# Custom robot config
python scripts/validate_config.py --robot-config path/to/robot.yaml
# Specify MoveIt config explicitly
python scripts/validate_config.py --moveit-config path/to/moveit_controllers.yaml
CI/CD 集成
退出代码:- 0:所有验证通过 - 1:发现配置错误 - 2:文件未找到或解析错误
在 CI 中使用:
- name: Validate Configuration
run: python scripts/validate_config.py
# Fails build if exit code != 0
贡献工作流程
Git 提交规范
工作区使用 gitlint 进行提交消息验证,由 scripts/setup.sh:264-268 安装:
pip install gitlint
gitlint install-hook # Installs pre-commit hook
提交消息格式 (由 gitlint 强制执行):
<type>(<scope>): <subject>
<body>
<footer>
示例:
feat(inference): add distributed execution mode
Implement device-edge-cloud architecture for compute offloading.
TensorPreprocessor runs on robot CPU, PureInferenceEngine on GPU server.
Closes #42
开发周期
graph TB
FORK["Fork repository<br/>on GitCode"]
CLONE["Clone your fork"]
SETUP["Run setup.sh"]
BRANCH["Create feature branch<br/>git checkout -b feat/xyz"]
CODE["Make changes"]
TEST["Test locally"]
VALIDATE["Run validate_config.py"]
LINT["Lint checks (gitlint)"]
COMMIT["git commit -m 'feat: ...'"]
PUSH["git push origin feat/xyz"]
PR["Create Pull Request"]
FORK --> CLONE
CLONE --> SETUP
SETUP --> BRANCH
BRANCH --> CODE
CODE --> TEST
TEST --> VALIDATE
VALIDATE --> LINT
LINT --> COMMIT
COMMIT --> PUSH
PUSH --> PR
PR -.->|Review feedback| CODE
分支命名约定
前缀 |
用途 |
示例 |
|---|---|---|
|
新功能 |
|
|
错误修复 |
|
|
代码重构 |
|
|
文档 |
|
|
测试添加 |
|
提交前检查清单
推送前:
构建通过:
colcon build --mixin dev配置有效:
python scripts/validate_config.py测试通过:
colcon test --packages-select <modified-packages>代码格式化:遵循 ROS 2 Python 风格指南
提交消息:遵循 gitlint 约定
子模块更新:如果修改了子模块,单独提交子模块更新
快速参考
环境激活
# Source ROS 2
source /opt/ros/humble/setup.sh
# Activate venv
source venv/bin/activate
# Source workspace
source install/setup.bash
常用开发命令
任务 |
命令 |
|---|---|
完整构建 |
|
单个包 |
|
清理构建 |
|
运行验证 |
|
更新子模块 |
|
格式化 Python |
|
列出包 |
|
故障排除
问题 |
解决方案 |
|---|---|
rclpy 导入错误 |
确保使用 |
NumPy 版本冲突 |
在 venv 中执行 |
子模块未初始化 |
|
VS Code 无法找到导入 |
检查 |
构建失败并出现 mixin 错误 |
确保 |
配置验证失败 |
检查 YAML 文件中的关节定义是否一致 |
来源: scripts/setup.sh:1-307, .vscode/settings.json:1-33, .colcon/mixin/build.mixin.yaml:1-19