IB-Robot (Intelligence Boom Robot): 融合 LeRobot 与 ROS 2 生态的智能具身机器人开发框架
我们非常激动地宣布,IB-Robot 现在已全面支持通过 OpenClaw AI Agent 进行远程社交控制!无论是在 Gazebo 仿真环境 还是 真实 SO-101 机械臂 上,你都可以通过 飞书、QQ、Discord 等软件,用最自然的语言与机器人对话并下达指令。
| 仿真演示 (Simulation) | 真实硬件 (Real Robot) |
|---|---|
![]() |
![]() |
用户指导文档:IB-Robot 使用指南
IB-Robot 是一个智能融合机器人开发框架,旨在打通 Hugging Face LeRobot 机器学习生态与 ROS 2 机器人中间件之间的壁垒,为具身智能研发提供从采集、训练到部署的完整工具链。
| 维度 | LeRobot 生态 | ROS 2 生态 | IB-Robot 方案 |
|---|---|---|---|
| 数据流 | Episode 回合 | Topic 话题 | 契约驱动的双向实时转换 |
| 时间观 | 离散时间步 (Steps) | 连续时间流 (RT) | 自动对齐与高频插值平滑 |
| 控制方式 | 端到端神经网络模型 | 分层规划控制架构 | 双模控制 (ACT vs MoveIt) |
| 部署形态 | Python 脚本 | ROS 2 节点 | 分布式端边协同部署 |
当前主干工作流已支持三类运行平台:
| 平台 | 角色定位 | 当前支持状态 | 典型场景 |
|---|---|---|---|
| Ubuntu 22.04 | 主机 / 开发机 | 完整支持 setup、build、仿真、录制、MoveIt、推理联调 | Gazebo 仿真、数据采集、单机推理、边云联调 |
| openEuler Embedded 24.03 | 端侧开发板 | 支持 setup、clean build 与板端运行 | NPU 推理、实机控制、录制客户端 |
| OpenHarmony 5.1 | 端侧开发板 | 支持板端运行工作流、HDC 调试、最小 inference workspace 构建辅助与 LeRobot patch profile | BQ3588HM 板端推理、HDC/SSH 调试 |
IB-Robot 构建了一个从感知、决策到执行的端到端闭环体系,实现了机器学习世界与机器人控制世界的无缝对接:
- 多模态感知与采集:
- 底层感知: 通过 ROS 2 Driver 统一接入多路相机 (USB/RealSense)、雷达及麦克风。
- 多样化采集: 支持 VR 手柄、Xbox 控制器及手机 IMU 等遥操作设备,为模仿学习提供专家示范数据。
- 协议转换枢纽 (tensormsg):
- 作为架构的枢纽,tensormsg 负责
ros_msg与tensor之间的双向转换,通过合约(Contract)机制保证数据流的类型安全与一致性。
- 作为架构的枢纽,tensormsg 负责
- 推理与研发服务 (Inference Service):
- 支持各类 VLA(视觉-语言-动作)大模型(如 SmolVLA, Pi0.5)以及端到端策略模型(如 ACT, Diffusion Policy)。系统支持 自动检测后端 并根据控制模式按需启动。
- 统一动作执行器 (Action Dispatch):
- 充当机器人的“小脑”。在 ACT 模式下负责 Action Chunking 调度与高频插值;在规划模式下对接 MoveIt 2 执行受限轨迹,并提供统一的
RobotStatus汇报。
- 充当机器人的“小脑”。在 ACT 模式下负责 Action Chunking 调度与高频插值;在规划模式下对接 MoveIt 2 执行受限轨迹,并提供统一的
- 配置驱动中心 (robot_config):
- 实现“规格驱动本体行为”。通过单一 YAML 定义关节、控制器模式及传感器外参,支持一键切换仿真与实机环境。
IB_Robot/ # 主工作空间 (本仓库)
├── .gitmodules # Git 子模块配置
├── README.md # 本文件
├── LICENSE # Apache 2.0 许可证
├── config.json # AI Agent 配置文件 (AtomGit API 令牌等)
│
├── .agents/ # AI Agent 配置目录
│ └── skills/ # AI Agent 技能库 (详见 .agents/skills/README.md)
│
├── libs/ # 外部依赖库
│ ├── lerobot/ # [子模块] LeRobot 训练框架
│ └── atomgit_sdk/ # AtomGit API SDK
│
├── src/ # 核心源码包集合
│ ├── robot_config/ # 系统总控、规格定义与启动入口
│ ├── action_dispatch/ # 统一动作执行器 (双模支持)
│ ├── tensormsg/ # LeRobot ↔ ROS 2 协议转换枢纽
│ ├── ibrobot_msgs/ # 系统统一接口定义 (Message/Action)
│ ├── dataset_tools/ # 数据集采集与转换工具 (Episode Recorder)
│ ├── robot_teleop/ # 遥操作控制 (Leader Arm/Xbox 手柄)
│ ├── robot_description/ # 统一机器人 URDF/SRDF/MJCF 模型描述
│ ├── robot_moveit/ # MoveIt 2 运动规划集成
│ ├── inference_service/ # 多模型推理与部署服务
│ ├── so101_hardware/ # SO-101 电机驱动接口
│ ├── pymoveit2/ # [子模块] MoveIt2 Python 接口
│ ├── rosclaw/ # [子模块] OpenClaw 社交控制集成
│ ├── sim_models/ # 仿真场景模型 (Gazebo/MuJoCo)
│ ├── model_utils/ # 模型工具库
│ ├── usb_cam/ # USB 摄像头驱动
│ ├── voice_asr_service/ # 语音识别服务
│ └── workflows/ # CI/CD 配置
│
├── docs/ # 深度架构文档与开发指南
│ ├── pictures/ # 架构图与演示 GIF
│ └── videos/ # 演示视频 (源文件)
├── scripts/ # 环境配置与验证工具脚本
└── build/ # 编译输出 (自动创建)
重要:本步骤仅需在初次克隆项目后运行一次。
- 操作系统: 当前支持三平台协同:Ubuntu 主机负责仿真、录制服务或云侧推理;端侧开发板支持 openEuler Embedded 与 OpenHarmony
- ROS 版本: ROS 2 Humble
- Python: 系统原生 Python 3.11。严禁在 Conda 激活的环境中执行,否则会导致动态库冲突。
- 加速器: 支持 NVIDIA GPU、Ascend 310B、Ascend 310P,若未检测到则按 CPU-only 路径运行。
运行 ./scripts/setup.sh。该脚本会自动完成以下重型操作:
- 子模块同步: 执行
git submodule update --init --recursive,下载核心源码。 - 平台与硬件检测: 自动识别 Ubuntu / openEuler Embedded / OpenHarmony,以及 NVIDIA GPU / Ascend 310B / 310P / CPU-only 环境。
- ROS 2 安装 (如未安装): 自动检测并安装 ROS 2 Humble 和 colcon 构建工具。
- 系统依赖安装: 通过系统包管理器安装 C++ 编译工具、
nlohmann-json等硬件驱动依赖。 - 虚拟环境 (venv) 构建: 在根目录创建
venv文件夹。这能确保 ML 相关依赖与系统 ROS 2 环境隔离,同时通过--system-site-packages复用系统rclpy。 - ML 栈安装: 自动在
venv中安装lerobot、硬件依赖以及适配 ROS 2 Humble 的 NumPy 1.26.x。 - 环境验证: 自动验证
rosdepc、colcon、rclpy、lerobot与 NumPy 兼容性。
脚本会询问是否设置个人 Fork 仓库。如果你是核心开发者,输入你的 AtomGit 用户名,脚本会自动建立 origin (你的仓库) 和 upstream (主仓库) 的关联。
每次开启新终端后,请在 IB_Robot 项目根目录下加载环境:
cd ~/IB_Robot
source .shrc_local注意:
.shrc_local会自动完成venv激活、ROS 2 环境加载和工作区install/setup.zsh的 source。每次另起新终端都必须重新执行上述命令,否则ros2命令和 Python 包将不可用。
完成首次构建后,再额外加载工作区环境:
source install/setup.sh为了避免与局域网内其他 ROS 2 用户冲突,建议设置唯一的 Domain ID。每次另起新终端都需要重新设置:
export ROS_DOMAIN_ID=<0-232之间的唯一数字>注意:跨机器运行时,参与的所有机器必须使用相同的
ROS_DOMAIN_ID。
代码修改后,运行统一构建脚本:
./scripts/build.sh注:build.sh 现在只负责加载环境并执行构建;Python 环境、lerobot 可编辑安装与 NumPy 兼容性由 setup.sh 统一负责。
IB-Robot 内置 AI 编程代理技能,帮助 Claude Code、Gemini CLI、OpenCode 等 AI Agent 更好地理解项目架构和开发流程。可用技能详见 .agents/skills/README.md。
config.json 用于存储 AI Agent 所需的配置信息,目前主要用于 AtomGit API 集成:
{
"atomgit": {
"token": "$ATOMGIT_TOKEN",
"owner": "openEuler",
"repo": "IB_Robot",
"baseUrl": "https://api.atomgit.com"
}
}获取 AtomGit Personal Access Token:
- 访问 https://atomgit.com 并登录
- 点击右上角头像 → 个人设置
- 找到「访问令牌」选项
- 点击「新建访问令牌」,勾选
repo和pull_request权限 - 立即复制保存 Token(只显示一次)
设置环境变量:
将以下内容添加到你本地的 ~/.zshrc 或 ~/.bashrc 中:
export ATOMGIT_TOKEN="your_token_here"所有符合 Agent Skills 标准的客户端都会自动扫描 .agents/skills/:
详见 agentskills.io。
所有运行入口都以 robot_config 包的统一入口 robot.launch.py 为主。下文中的“端侧开发板”统一指可运行 openEuler Embedded 或 OpenHarmony 的板端设备。
开始任一场景前,请先完成环境加载并设置唯一的 ROS_DOMAIN_ID。跨机器运行时,参与的所有机器必须使用相同的 ROS_DOMAIN_ID。
source .shrc_local
export ROS_DOMAIN_ID=<0-232之间的唯一数字>更详细的子模块说明可参考下表:
| 文档 | 简短说明 |
|---|---|
src/inference_service/README.md |
推理服务架构、单机/分布式部署与 NPU/GPU Cloud 节点启动方式 |
docs/OpenHarmony_thirdparty_pytorch_validation.md |
OpenHarmony 板端 thirdparty_pytorch / skh-run 获取、部署、运行流程,以及当前验证进度与已知限制 |
src/robot_moveit/README.md |
MoveIt Planning 控制、/cmd_pose 用法与 headless 启动方式 |
src/dataset_tools/README.md |
episodic 录制、record_cli 用法与 bag_to_lerobot 数据集转换流程 |
- 主机侧构建入口:使用
scripts/openharmony/build_ibrobot_oh_custom.sh。脚本会自动准备 OpenHarmony 交叉编译目录,并在打包板端 runtime 时对lerobot显式应用series.openharmony-5.1.0-musl.txt,确保 lazy-import 等 OpenHarmony 专用 patch 真正进入部署产物。 - 板端 PyTorch runtime:使用
thirdparty_pytorch提供的test/skh-run.tar.gz,部署到/data/local/skh-run;IB_Robot 的 OpenHarmony inference 节点会在节点进程级切到这套 runtime,而不会污染/data/out/bin/ros2。 - 离线权重注意事项:当前验证使用的 ACT policy 配置了
resnet18+ResNet18_Weights.IMAGENET1K_V1。如果板端无外网,请预置resnet18-f37072fd.pth到/root/.cache/torch/hub/checkpoints/。 - 当前验证结论:BQ3588HM 板端已完成 CPU 推理验证;NPU 推理链路正在继续打通中。
适合验证 Gazebo、相机、控制器和基础 ROS 2 拓扑,不启动模型推理。
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=model_inference \
use_sim:=true \
with_inference:=false显式切到 model_inference 模式,使用本机推理链路控制仿真机械臂。
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=model_inference \
use_sim:=true该场景默认会启动 MoveIt 与 RViz,并暴露 /cmd_pose 接口用于发送目标位姿。
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=moveit_planning \
use_sim:=true如需在板端或无图形界面的环境中运行,可关闭 RViz:
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=moveit_planning \
use_sim:=true \
moveit_display:=false发送位姿命令控制机械臂移动:
ros2 topic pub /cmd_pose geometry_msgs/Pose "{
position: {x: 0.15, y: 0.0, z: 0.25},
orientation: {x: 0.0, y: 0.0, z: 0.707, w: 0.707}
}" --once查看末端位姿反馈:
ros2 topic echo /robot_status/ee_pose这部分与 Ubuntu 上的 MoveIt 用法保持一致,只是 use_sim 不再开启,适合真实机械臂控制。
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=moveit_planning控制接口仍然是同一套话题:
ros2 topic pub /cmd_pose geometry_msgs/Pose "{
position: {x: 0.15, y: 0.0, z: 0.25},
orientation: {x: 0.0, y: 0.0, z: 0.707, w: 0.707}
}" --once以下说明采用当前分布式部署模式:机器人侧只启动 Edge 代理节点,算力侧单独启动 cloud_inference.launch.py。
适合开发和联调,在一台 Ubuntu 机器上同时运行分布式架构中的两侧节点。
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=model_inference \
execution_mode:=distributed \
use_sim:=true \
cloud_local:=trueUbuntu 主机负责仿真与 Edge 侧预处理/后处理;端侧开发板负责云侧纯推理。两台机器必须位于同一局域网,并设置相同的 ROS_DOMAIN_ID。
Ubuntu 主机(仿真 + Edge)
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=model_inference \
execution_mode:=distributed \
use_sim:=true端侧开发板(NPU Cloud 节点)
ros2 launch inference_service cloud_inference.launch.py \
policy_path:=/path/to/model \
device:=npu如需改为 GPU 服务器,只需将 device:=npu 替换为 device:=cuda。
快速验证分布式链路是否打通:
ros2 node list | grep -E 'act_inference|pure_inference'
ros2 topic list | grep -E 'preprocessed|inference/action'
ros2 topic hz /inference/actionepisodic 录制始终由两部分组成:
robot.launch.py启动episode_recorder录制服务端ros2 run dataset_tools record_cli启动交互式录制客户端
record_visualizer:=rerun 只会额外拉起 Rerun 可视化 sidecar,不会替代 record_cli。
不启用 Rerun
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=teleop \
record:=true \
record_mode:=episodic \
use_sim:=false启用 Rerun
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=teleop \
record:=true \
record_mode:=episodic \
record_visualizer:=rerun \
use_sim:=false客户端(同机另一个终端)
ros2 run dataset_tools record_cli启动 record_cli 后输入任务描述即可开始录制,按回车可提前结束当前 episode。
该模式适合把机器人控制与录制操作分离。Ubuntu 主机负责录制服务端,端侧开发板只负责运行 record_cli。两端仍需保持相同的 ROS_DOMAIN_ID。
Ubuntu 录制服务器(可选启用 Rerun)
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=teleop \
record:=true \
record_mode:=episodic \
use_sim:=false如需开启可视化,在服务端命令中增加:
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=teleop \
record:=true \
record_mode:=episodic \
record_visualizer:=rerun \
use_sim:=false端侧开发板录制客户端
ros2 run dataset_tools record_cli录制完成后,可将整个 episodic dataset 根目录转换为 LeRobot 数据集格式:
ros2 run dataset_tools bag_to_lerobot \
--bags-dir ~/rosbag/episodes/so101_single_arm \
--robot-config src/robot_config/config/robots/so101_single_arm.yaml \
--out /path/to/output_datasetbag 目录组织、dataset.yaml 元信息和更多转换参数,详见 src/dataset_tools/README.md。
| 参数名 | 说明 | 默认值 |
|---|---|---|
robot_config |
机器人配置名称(对应 config/robots/ 下的 YAML) |
so101_single_arm |
config_path |
配置文件绝对路径(可选,覆盖 robot_config) |
空 |
use_sim |
是否启用仿真模式 | false |
control_mode |
覆盖默认控制模式(model_inference / moveit_planning / teleop) |
从 YAML 读取 |
with_inference |
强制启用/禁用推理服务(空则自动检测) | 空 |
execution_mode |
推理执行模式(monolithic / distributed) |
monolithic |
cloud_local |
在分布式模式下是否同时在本机启动 Cloud 节点 | false |
with_moveit |
强制启用/禁用 MoveIt 核心(空则自动检测) | 空 |
moveit_display |
是否启动 MoveIt RViz 可视化界面 | true |
record |
是否启用录制流水线 | false |
record_mode |
录制模式(continuous / episodic) |
continuous |
record_visualizer |
录制可视化器(none / rerun) |
none |
auto_start_controllers |
是否在启动后自动激活控制器 | true |
如果遇到控制器无法启动或端口占用的问题,请运行清理脚本重置 ROS 2 后台进程:
./scripts/cleanup_ros.sh若出现 RTPS_TRANSPORT_SHM Error,请尝试清理缓存:
sudo rm -rf /dev/shm/fastrtps_*
export ROS_LOCALHOST_ONLY=1若启动仿真后没有出现可视化窗口(如 MuJoCo/Gazebo),请检查 DISPLAY 环境变量。在 Wayland 或某些远程桌面环境下,可能需要手动设置:
export DISPLAY=:1IB-Robot 深度集成 OpenClaw AI Agent 框架,配合 RosClaw 桥接器,实现通过 飞书、QQ、Discord 或 Slack 以自然语言对话的方式远程控制机器人。
致谢: 感谢 OpenClaw 团队提供的强大 AI 代理框架,以及 RosClaw 提供的 ROS 2 桥接方案。
机器人端需要安装 WebSocket 桥接驱动并启动发现服务。
- 拉取子模块:
确保已拉取最新的 RosClaw 子模块源码:
git submodule update --init --recursive
- 安装系统依赖:
# 必须安装 rosbridge_suite 以提供 WebSocket 通信能力 sudo apt-get update && sudo apt-get install -y ros-humble-rosbridge-suite
- 启动机器人本体:
首先启动机器人本体程序(支持仿真或实机):
# use_sim:=true 为仿真模式,false 为真实硬件模式 ros2 launch robot_config robot.launch.py robot_config:=so101_single_arm control_mode:=model_inference use_sim:=true with_inference:=false - 启动社交桥梁:
本项目已将 RosClaw 作为子模块引入
src/rosclaw。执行以下脚本一键启动:启动后,系统将在# 自动编译子模块并启动 rosbridge_websocket, rosapi 和 discovery 节点 ./scripts/start_rosclaw.sh9090端口开启 WebSocket 服务。
- OpenClaw 是机器人的“大脑”和“前端”,负责连接社交软件并调用 LLM 理解指令。
重要:在使用 OpenClaw 控制机器人之前,必须确保 OpenClaw 侧的
ROS_DOMAIN_ID与机器人端一致。否则 OpenClaw 将无法发现 ROS2 话题和服务,表现为"ros2 CLI 不可用"或无法发送控制指令。需要在会话时告知 OpenClaw 对应的ROS_DOMAIN_ID。
- 安装 OpenClaw:
推荐使用官方提供的快速安装脚本(需要 Node.js 22+):
# 安装 OpenClaw CLI npm install -g openclaw # 执行初始化向导,配置你的 LLM (如 GLM-4/5 或 GPT-4) openclaw onboard
- 集成 RosClaw 插件:
# 在 IB_Robot 根目录下执行,将插件安装到 OpenClaw openclaw plugins install ./src/rosclaw/extensions/openclaw-plugin - 配置机器人连接:
# 设置机器人 WebSocket 地址(替换为实际 IP) openclaw config set plugins.entries.rosclaw.config.rosbridge.url "ws://<机器人IP>:9090"
- 注入 IB-Robot 专用技能:
为了让 AI 准确理解单位(弧度)和视觉话题,请部署技能说明书:
mkdir -p ~/.openclaw/workspace/skills/ibrobot-control cp ./docs/ib_robot_social_skill.md ~/.openclaw/workspace/skills/ibrobot-control/SKILL.md
- 启动 Gateway:
openclaw gateway
连接成功后,你可以在网页端 (http://localhost:18789) 或绑定的飞书、QQ 或 Discord 中输入:
- “查看机器人当前的能力清单” —— 获取所有传感器话题。
- “把机械臂恢复到初始位置” —— AI 会根据技能文档自动将角度转换为弧度。
- “帮我看看桌子上有什么?” —— AI 会调用
/camera/top/image_raw抓拍并分析图像。 - "帮我抓取桌上的瓶子" —— AI 将触发 IB-Robot 的
DispatchInferAI 任务。
维护者: IB-Robot Team
使用指导: https://pages.openeuler.openatom.cn/embedded/docs/build/html/master/features/embodied_ai/index.html
项目地址: https://atomgit.com/openEuler/IB_Robot
反馈: https://atomgit.com/openEuler/IB_Robot/issues


