# lerobot_dagger **Repository Path**: cloud-robo/lerobot_dagger ## Basic Information - **Project Name**: lerobot_dagger - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-14 - **Last Updated**: 2026-07-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LeRobot DAgger 独立于 LeRobot 主仓的 DAgger 数据收集管线。 ## 安装与环境创建 ### 1. 创建环境 建议使用 conda 创建 Python 3.12 虚拟环境: ```bash conda create -n lerobot-dagger python=3.12 -y conda activate lerobot-dagger ``` ### 2. 安装 r2c_sdk_python 登录 [CloudRobo 平台](https://console.huaweicloud.com/robo/?region=cn-southwest-2#/dashboard) 下载 `r2c_sdk_python` 到本地,然后本地安装,安装步骤请仔细阅读平台的教程: ```bash cd /path/to/r2c_sdk_python pip install -e . ``` ### 3. 安装 lerobot 克隆 `lerobot` 到本地,切换到 `v0.5.1` tag(由于 lerobot 版本迭代较快,本文档适配该版本): ```bash export GIT_LFS_SKIP_SMUDGE=1 git clone https://gitee.com/mirrors/lerobot.git cd lerobot git checkout -b v051 v0.5.1 pip install -e ".[feetech]" ``` > ⚠️ `[feetech]` 为必选依赖,当前 SO101 机器人使用的是 feetech 舵机。 ### 4. 安装 lerobot_dagger ```bash cd /path/to/lerobot_dagger pip install -e . ``` ### 5. 验证 ```bash python -c "import lerobot; print('lerobot:', lerobot.__version__)" python -c "import lerobot_dagger; print('lerobot_dagger OK')" python -c "from r2c_sdk.client import R2CClient; print('r2c_sdk OK')" ``` ## DAgger 数据采集 ### 概述 `dagger_cloud.py` 是结合 CloudRobo 云端策略的 DAgger 数据采集脚本,核心流程: 1. **HUMAN 阶段**:人工通过遥操作控制机器人,数据标记为 `IS_INTERVENTION=1` 2. **MODEL 阶段**:将观测发送到 CloudRobo 云端,执行云端返回的动作序列,数据标记为 `IS_INTERVENTION=0` 3. **状态机流转**: `INIT → HUMAN → MODEL → WAIT_HUMAN → SUCCESS/FAILURE` 4. **运行模式**:`collect`(采集模式,不从臂复位)和 `evaluate`(评估模式,从臂复位到默认位置) 本地模式(`dagger.py`)与云端模式的差别仅在于策略来源:本地模式使用本地模型推理,云端模式使用 CloudRobo 平台策略。 ### 1. CloudRobo 平台准备 - 登录 [CloudRobo 平台](https://console.huaweicloud.com/robo/?region=cn-southwest-2#/dashboard) - 在"机器人接入"模块创建要接入的机器人,并下载证书文件(zip 格式),然后在 `config/dagger_cloud.yaml` 中配置路径: ```yaml cloud_bundle: "/path/to/cert_XXXX.zip" ``` - 此时机器人是**待激活**状态。 - 在"模型部署"模块点击**部署模型服务**: - 进入**空间资产 → 模型**,选择之前训练好的模型及对应版本 - **R2C 协议配置**:参考本项目根目录下的 `r2c.json` 文件进行配置 - **运行时长**:按照预计的轨迹采集时间选择 - 完成后点击**立即部署**,等待服务就绪, - 当状态变为**运行中**, 模型部署以就绪 ### 2. 机器人硬件连接 确保机械臂已连接电源线和 USB 线,然后根据实际环境调整 `config/dagger_cloud.yaml` 中的配置。 #### 2.1 配置文件的修改 编辑 `config/dagger_cloud.yaml`,按实际环境调整以下配置,实际模板中包含更多默认配置,无特殊情况不要修改: ```yaml cloud_bundle: "" #r2c证书文件压缩包路径,i.e. /home/dagger/config/cert_20260615171316.zip # Translator configuration (lerobot 和 R2C格式互相转化) translator: type: configurable device_to_r2c: task: pick the pen into the cup #任务名称,可自定义,translator的其余部分不要修改 # Robot configuration (Follower - 从臂) robot: type: so101_follower #这个type不要改,是lerobot内置好的 port: /dev/ttyACM1 #so101从臂串口,将从臂与上位机usb口连接,执行 `lerobot-find-port` 指令,然后拔掉从臂usb线,按回车,会显示对应的串口,一般为 `/dev/ttyACM1` 之类,查找到后填写到此处 id: my_follower_arm #so101从臂名称,可自定义,但需要与标定文件中的xxx.json保持一致,比如/.cache/huggingface/lerobot/calibration/robots/so_follower/my_follower_arm.json cameras: wrist: type: opencv index_or_path: /dev/video2 #相机设备路径(一般为 `/dev/video*`),可通过 `lerobot-find-cameras` 指令查找,该命令会在运行该指令的当前路径创建outputs文件夹,里面有保存的不同相机的图片,可以根据文件名进行判断,比如outputs/captured_images/opencv__dev_video0.png width: 640 #相机的分辨率,根据实际情况填写,通常和'lerobot-find-cameras'指令打印的信息保持一致即可 height: 480 fps: 30 #相机的帧率,根据实际情况填写,通常和'lerobot-find-cameras'指令打印的信息保持一致即可 front: #front相机的配置参考wrist的配置方法 type: opencv index_or_path: /dev/video0 width: 640 height: 480 fps: 30 # Teleoperator configuration (Leader - 主臂) teleop: type: so101_leader #这个type不要改,是lerobot内置好的 port: /dev/ttyACM0 #so101主臂串口,可通过 `lerobot-find-port` 指令查找对应端口(一般为 `/dev/ttyACM0` 之类),查找到后填写到此处 id: my_leader_arm #so101主臂名称,可自定义,但需要与标定文件中的xxx.json保持一致,比如/.cache/huggingface/lerobot/calibration/teleoperators/so_leader/my_leader_arm.json # Dataset configuration dataset: repo_id: test/dagger-cloud-dataset # 数据集repo id num_episodes: 30 # 本次测试/采集的数据集轨迹总数,达到该数目程序会自动结束 single_task: "Put the pen in the cup." # 任务名称 root: # 数据存储路径,根据实际情况调整 root_prefix: put_pen_ # 数据集的名称前缀,可自定义 push_to_hub: false min_steps_per_episode: 10 # 每条轨迹最少要有10步,可根绝任务长短自定义 max_steps_per_episode: 1000 # 每条轨迹最多有1000步,可根据任务长短自定义 fps: 30 # Control settings run_mode: evaluate # evaluate是dagger模式,该模式每次执行完一条轨迹从臂会自动复位;另外也可以填collect,遥操作采集模式,每次采集完一条数据从臂不复位 control_mode: web # 前端数采工具交互模式,不要修改 display_data: true # 是否显示实时的数采轨迹 display_compressed_images: true # 是否显示实时的数采画面 ``` ### 3. 启动数据采集 配置好 `config/dagger_cloud.yaml` 后,按以下步骤启动云端策略模式的数据采集: #### 3.1 启动后端服务 激活安装好的conda环境后,运行 `dagger_cloud.sh` 后端脚本: ```bash bash scripts/dagger_cloud.sh ``` 该脚本需要给机器人与上位机连接的串口赋予权限,会提示用户输入root账户密码 首次执行过程中,会提示用户标定文件不匹配: ''' Mismatch between calibration values in the motor and the calibration file or no calibration file found Press ENTER to use provided calibration file associated with the id leader, or type 'c' and press ENTER to run calibration: ''' 此时按'ENTER'即可使用内置的标定文件,关于so101的标定过程见cloudrobo平台机器人接入的指南。 脚本运行无报错,且在 CloudRobo 平台的**机器人列表页**看到机器人状态变为**在线**,即表示机器人已成功接入 CloudRobo 平台,同步地会拉起一个rerun的可视化窗口 #### 3.2 启动前端界面 新开一个终端,运行前端界面: ```bash bash scripts/start_frontend.sh ``` 终端会输出一个浏览器 URL(如 `http://localhost:3000/`),在浏览器中打开该 URL,会显示"**DAGGER 数据收集控制界面**"。 如果后端运行正常,此时前端界面是可交互状态,如果后端程序结束了,前端界面上的各个按钮不可交互 #### 3.3 连接模型服务 回到 CloudRobo 平台的**机器人**页面,选择接入的机器人,点击**智能体调试**,进入界面后,选择正在运行的模型服务(如抓笔技能),点击参数配置,默认配置直接点确定。 ### 4. 轨迹采集流程 #### 4.1 单条轨迹采集 1. 在 CloudRobo **智能体调试界面**中输入需要执行的任务描述,比如"put pen in the cup",点击对话框的蓝色箭头按钮发送,稍等一会儿,等界面上出现如下日志,说明推理准备就绪,等待端侧发送观测数据。 ```log 2026/06/17 11:27:32.134 GMT+08:00 Get content length. 216 2026/06/17 11:27:32.146 GMT+08:00 Connecting to inference service to get model metadata... 2026/06/17 11:27:32.167 GMT+08:00 Connected to inference service at ws://172.16.2.199/v2/infer/54dfe75a-f5c6-4120-a0d2-9ed38c8f8b3a/ 2026/06/17 11:27:32.167 GMT+08:00 Loaded skill config from JSON string 2026/06/17 11:27:32.167 GMT+08:00 Loaded configurations: skill=2 2026/06/17 11:27:32.167 GMT+08:00 All components initialized successfully 2026/06/17 11:27:32.167 GMT+08:00 Get content length. 11692 2026/06/17 11:27:32.319 GMT+08:00 Connect to gateway as d66c1b079eb54a059903ab2d59a85604 2026/06/17 11:27:32.319 GMT+08:00 Subscribed to d66c1b079eb54a059903ab2d59a85604/e1b75118d2894e38802df0723a74ac84/inference/observations 2026/06/17 11:27:32.320 GMT+08:00 Will stop after 5 minutes 2026/06/17 11:27:32.320 GMT+08:00 Will stop after 60 inferences ``` 2. 回到 **DAGGER 数据收集控制界面**,点击**开始策略控制** 3. 等待**智能体调试界面**打印运行数据,当看到有上传的图片后,机器人会开始运动 > ⚠️ 首次发送指令时,云端大模型需要编译,等待时间较久,属正常现象 4. **DAGGER 数据收集控制界面**会出现**标记成功**和**标记失败**两个按钮,根据结果选择: - **机器人成功完成任务**:点击**标记成功**,该轨迹保留,机器人自动重置, 在**智能体调试界面**对话框点击停止按钮,结束本次轨迹的推理 - **机器人无法完成任务**:需要人工接管,进入下一步 5. **人工接管流程**: - 点击**等待人类接管**,主臂会同步到从臂当前位置 - 点击**恢复遥操作**,此时可通过主臂进行人工干预 - ⚠️ **注意**:恢复遥操作后请务必扶好主臂,否则主臂可能因重力砸到桌面,从臂也会跟随 - 人工干预完成后,根据实际结果点击**任务完成**或**任务失败**,同样在**智能体调试界面**对话框点击停止按钮,结束本次轨迹的推理,不结束的话,下一条轨迹推理时会受到上一条轨迹观测的影响 - 从臂会自动重置,主臂需手动复位到初始状态 6. DAGGER 数据收集控制界面右侧会实时显示统计数据(采集条数、成功/失败轨迹数量等),注意失败轨迹当前不会保存,仅作统计 7. 若认为已采集足够数据,可点击**提前结束采集**按钮,后端程序会立即终止,无需等待达到预设轨迹条数,仅保存当前已采集的轨迹 #### 4.2 循环采集 重复上述操作采集第 N 条轨迹: > CloudRobo 调试界面发送任务 → DAGGER 采集界面点击开始策略控制 → 任务失败则人工接管 #### 4.3 自动终止 当采集到预设的轨迹条数(默认 30 条)后,程序会自动终止。该数量可通过修改 `config/dagger_cloud.yaml` 中的配置项调整,请按照实际可采集时间自行配置。 ### 5. 数据合并与上传 多轮采集的数据可通过运行 lerobot官方的命令进行合并: ```bash lerobot-edit-dataset --new_repo_id "{$new_merged_dataset}" --operation.type merge --operation.repo_ids "['{$dataset_1}','{$dataset_2}']" --push_to_hub false ``` `{$new_merged_dataset}`:合并后数据集的路径,比如/home/dagger_data/merged_dataset_20260618_0821 `{$dataset_1}`: 待合并的数据集1的路径 `{$dataset_2}`:待合并的数据集2的路径 完整示例: ```bash lerobot-edit-dataset --new_repo_id "/home/dagger_data/merged_20260611" --operation.type merge --operation.repo_ids "['/home/dagger_data/20260611_2024/','/home/dagger_data/20260612_1824/']" --push_to_hub false ``` 一般推荐通过人类干预方式采集的轨迹数量在 **100条**以上,以保证数据质量。 合并后的数据集通过obsutil工具上传至用户的obs桶中: obsutil使用指南:https://support.huaweicloud.com/utiltg-obs/obs_11_0003.html 上传命令: ```bash cd obsutil_linux_amd64_x.x.x #进入obsutil所在目录。“x.x.x”表示obsutil的版本号 chmod 755 obsutil #为obsutil增加可执行权限 ./obsutil cp home/dagger_data/merged_dataset_20260618_0821 obs://cloudrobo/dagger/data -r -f ``` 上传成功后会得到obs://cloudrobo/dagger/data/merged_dataset_20260618_0821,其中obs://cloudrobo/需要是cloudrobo平台授权的obs桶,用户可以在**工作空间管理界面**中查看已授权的obs桶地址: https://console.huaweicloud.com/robo/?region=cn-southwest-2#/workspace/list?workspaceId=3065a09c-a037-4c1f-9b05-8dc4c1740142 ## 本地模式(不需要 对接CloudRobo) 用于测试验证本地环境是否可用,用户可以根据2.1配置文件修改来修改scripts/dagger_web_only.sh中的配置 **本地模式仅支持遥操作测试验证**,点击web界面上的**开始策略控制**后台程序会自动退出 ```bash # Web 界面控制(真机 SO100) bash scripts/dagger_web_only.sh ``` 新开一个终端,运行前端界面 ```bash bash scripts/start_frontend.sh ``` ### 测试机械臂是否可用 ```bash bash test/test_so101.sh ``` ### 代码仓目录结构 ``` lerobot-dagger/ ├── pyproject.toml ├── src/lerobot_dagger/ │ ├── __init__.py # Monkey-patch 入口 │ ├── dagger.py # DAgger 状态机核心 │ ├── dagger_cloud.py # CloudRobo 云端策略数据采集 │ ├── cloud/ # 云端策略模块 │ ├── dagger_web/ # Web 控制界面 │ ├── robots/websocket_follower/ # 远程机器人 │ └── teleoperators/ ├── config/ # 配置文件 │ └── dagger_cloud.yaml ├── scripts/ # 启动脚本 ├── tools/ # 工具脚本 └── Dagger.md # 设计文档 ``` ### 注意事项 - **配置文件**: 启动前将 `config/dagger_cloud.yaml` 中的 `dataset.root` 改为实际的数据存储路径 - **硬件脚本**: `scripts/dagger_web_only.sh` 等脚本引用的配置需根据实际硬件调整