开发指南概述

相关源文件

以下文件用作生成此 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

关键依赖项

版本约束

原因

numpy

<2

ROS 2 Humble 组件需要 NumPy 1.x API

setuptools

>=71,<80

平衡 LeRobot 需求与 colcon 兼容性

lerobot

可编辑安装

开发修改 立即生效

pyserial

最新版本

Feetech 舵机 通信

feetech-servo-sdk

最新版本

SO-101 硬件 接口

scipy

最新版本

四元数/旋转 矩阵转换

gitlint

最新版本

提交消息 验证

设置流程

虚拟环境由 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 系统包,导致 rclpytf2_ros 的导入冲突。

来源: scripts/setup.sh:216-278, scripts/setup.sh:25-33


Git 子模块管理

工作区包含 .gitmodules:1-11 中定义的两个子模块:

子模块

路径

用途

lerobot_ros2

libs/lerobot

带有 ROS 2 集成的 LeRobot 库

pymoveit2

src/pymoveit2

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>

来源: .gitmodules:1-11, scripts/setup.sh:38-177


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
    

关键配置值

设置

用途

python.defaultInterpreterPath

${workspaceFolder}/venv/bin/python3

使用工作区 venv

python.analysis.extraPaths

LeRobot, src, ROS 路径

启用导入解析

terminal.integrated.env.linux.PYTHONPATH

合并路径

确保终端使用正确的导入

ros.distro

humble

RDE 扩展 ROS 版本

search.exclude

build/, install/, log/, venv/

改善搜索性能

推荐扩展

.vscode/extensions.json:1-13 列出了必要的扩展:

扩展 ID

用途

ms-python.python

Python 语言支持和 调试

ms-vscode.cpptools

C++ IntelliSense(用于 ros2_control 插件)

vadimcn.vscode-lldb

C++ LLDB 调试器

ms-vscode.cmake-tools

CMake 集成

redhat.vscode-yaml

YAML 模式验证

Ranch-Hand-Robotics.rde-pack

ROS 开发环境包

anthropic.claude-code

可选 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
    

常用构建命令

命令

用例

colcon build --mixin dev

开发:调试符号、符号链接安装、快速迭代

colcon build --mixin release

性能测试:优化代码、构建较慢

colcon build --mixin prod

生产部署:Release + 无测试 + 无追踪

colcon build --mixin debug test

带调试的测试:调试符号 + 测试目标

colcon build --packages-select <pkg>

单个包:仅构建指定的包及其依赖

colcon build --packages-up-to <pkg>

包及其依赖:构建目标包及所有上游依赖

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 中的硬件插件):

  1. 使用调试符号构建:colcon build --mixin debug

  2. 生成编译命令:由 mixin 自动启用

  3. 使用 vadimcn.vscode-lldb 扩展进行调试

  4. 附加到运行中的进程或通过 launch.json 启动

来源: .vscode/launch.json:1-28


配置验证

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"]
    

执行的验证检查

配置文件

检查的控制器

预期关节

controllers.yaml

arm_position_controller

joints.arm

controllers.yaml

arm_trajectory_controller

joints.arm

controllers.yaml

gripper_position_controller

joints.gripper

controllers.yaml

gripper_trajectory_controller

joints.gripper

controllers.yaml

joint_state_broadcaster

joints.all

moveit_controllers.yaml

arm_trajectory_controller

joints.arm

moveit_controllers.yaml

gripper_trajectory_controller

joints.gripper

运行验证

# 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

来源: scripts/validate_config.py:1-351


贡献工作流程

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
    

分支命名约定

前缀

用途

示例

feat/

新功能

feat/add-depth-camera-support

fix/

错误修复

fix/action-queue-overflow

refactor/

代码重构

refactor/split-preprocessor-module

docs/

文档

docs/update-inference-guide

test/

测试添加

test/add-temporal-smoother-tests

提交前检查清单

推送前:

  1. 构建通过colcon build --mixin dev

  2. 配置有效python scripts/validate_config.py

  3. 测试通过colcon test --packages-select <modified-packages>

  4. 代码格式化:遵循 ROS 2 Python 风格指南

  5. 提交消息:遵循 gitlint 约定

  6. 子模块更新:如果修改了子模块,单独提交子模块更新

来源: scripts/setup.sh:264-268


快速参考

环境激活

# Source ROS 2
source /opt/ros/humble/setup.sh

# Activate venv
source venv/bin/activate

# Source workspace
source install/setup.bash

常用开发命令

任务

命令

完整构建

colcon build --mixin dev

单个包

colcon build --packages-select robot_config

清理构建

rm -rf build/ install/ log/ && colcon build --mixin dev

运行验证

python scripts/validate_config.py --verbose

更新子模块

git submodule update --remote --merge

格式化 Python

black src/<package>/<package>/*.py (如已配置)

列出包

colcon list

故障排除

问题

解决方案

rclpy 导入错误

确保使用 --system-site-packages 创建 venv

NumPy 版本冲突

在 venv 中执行 pip install "numpy<2"

子模块未初始化

git submodule update --init --recursive

VS Code 无法找到导入

检查 .vscode/settings.json extraPaths

构建失败并出现 mixin 错误

确保 .colcon/mixin/ 文件存在

配置验证失败

检查 YAML 文件中的关节定义是否一致

来源: scripts/setup.sh:1-307, .vscode/settings.json:1-33, .colcon/mixin/build.mixin.yaml:1-19