Xarm-DataCollection/README_ZH.md
2026-08-07 14:57:29 +00:00

276 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# UFACTORY xArm7 · LeRobotGELLO / 手动拖拽)
> [English Version](README.md)
UFACTORY xArm 与 [LeRobot](https://github.com/huggingface/lerobot) 框架的集成项目,专注于两种数据采集方式:
- **GELLO** — 使用 Dynamixel 示教臂的关节空间遥操作
- **手动拖拽** — 在 xArm 示教模式下自由拖动机械臂录制演示
采集的数据以标准 LeRobot 数据集格式保存可用于模仿学习训练ACT / Diffusion Policy 等)和实时策略推理。
## 功能特性
- 🤖 UFACTORY xArm7 控制
- 🎮 GELLO 关节空间遥操作Dynamixel 示教臂)
- ✋ xArm 示教模式手动拖拽采集
- 📷 Intel RealSense 相机观测D435 / D435i
- 📊 兼容 LeRobot 格式的数据集录制与管理
- 🧠 模仿学习训练与策略推理
- ▶️ 手动演示数据的 episode 回放
## 环境要求
- Ubuntu 22.04 / 24.04
- Python >= 3.10
- CUDA >= 12.0GPU 训练推荐)
- UFACTORY xArm7 及控制器
- GELLO 示教臂FTDI USB 串口)
- Intel RealSense D435 / D435i需要相机观测时
## 安装
```bash
git clone https://git.weiyantech.cn/wangshuxun/Xarm-DataCollection.git lerobot_xarm7
cd lerobot_xarm7
uv venv --python 3.10
uv sync --extra gello
```
基础依赖包含 `lerobot==0.4.3`(带 Intel RealSense 支持)、`xarm-python-sdk`、`numpy`、`pyyaml` 和 `opencv-python`。`gello` 可选依赖会额外安装 GELLO 软件和 Dynamixel SDK。
### 串口权限
GELLO 示教臂通过串口连接,需要将当前用户加入 `dialout` 组(重新登录后生效):
```bash
sudo usermod -aG dialout $USER
```
查看 GELLO 串口路径(用于配置文件中的 `teleop.port`
```bash
ls /dev/serial/by-id/
```
## 配置
项目在 `config/` 下提供了预置配置文件:
| 采集方式 | 配置文件 |
|---|---|
| GELLO · xArm7 | `config/gello/xarm7_gello_record_config.yaml` |
| 手动拖拽 · xArm7 | `config/manual_mode/xarm7_manual_record_config.yaml` |
### GELLO 配置说明
- `robot.robot_ip` — xArm 控制器 IP`192.168.1.245`
- `robot.robot_dof``7`
- `robot.gripper_type``1` 表示 xArm 夹爪
- `teleop.port` — GELLO 串口路径(`/dev/serial/by-id/...`
- `teleop.joint_ids` / `teleop.joint_signs` — 各型号机械臂的舵机映射与方向
- `teleop.start_joints` — GELLO 校准参考值(角度),应与 xArm SDK 初始点一致
- `teleop.gripper_id` — GELLO 夹爪舵机 ID`8``-1` 表示无夹爪)
- `dataset.root` / `dataset.repo_id` — 数据集保存位置
- `dataset.single_task` — 随每一帧保存的任务描述
- `dataset.fps` / `episode_time_s` / `reset_time_s` — 录制时序参数
> xArm7 的配置已包含正确的关节映射一般只需要修改串口、IP 和数据集路径。
### 手动拖拽配置说明
- `robot.manual_mode: true` — 开启 xArm 示教模式(关节自由拖动)
- `robot.teach_sensitivity` — 示教灵敏度,有效范围 15
- `robot.manual_gripper_speed` — 夹爪速度(每秒归一化位置变化,默认 `0.5`
- `robot.observe_joint_vel` — 是否在观测中记录关节速度(默认 `false`
- `robot.cameras.camera` — Intel RealSense 相机配置(`serial_number_or_name`、分辨率、fps
- `dataset.root` / `dataset.repo_id` / `single_task` / `fps` / `episode_time_s` / `reset_time_s` / `num_episodes` — 数据集配置
### 相机配置说明
需要给机器人配置添加相机时,参考 `config/manual_mode/xarm7_manual_record_config.yaml` 中的模板:
```yaml
robot:
cameras:
camera:
type: intelrealsense # RealSense 类型,不是 opencv
serial_number_or_name: "148522072685"
width: 640
height: 480
fps: 30
```
- `type` 必须是 `intelrealsense`RealSense 类型),**不能**写成 `opencv`(普通 USB 相机类型)。
- `serial_number_or_name` 需要先获取 RealSense 相机序列号再填写,否则连接/录制会报错。获取序列号:
```bash
uv run uf-camera-view -l -T realsense # 列出每台相机的序列号
```
也可以使用 librealsense 自带的 `rs-enumerate-devices`
## 使用
### 1. GELLO 遥操作测试
不录制数据,仅测试 GELLO 与机械臂的联动:
```bash
uv run uf-robot-teleop --config_path config/gello/xarm7_gello_record_config.yaml
uv run uf-robot-teleop --config_path config/gello/xarm7_gello_record_config.yaml --fps 60 # 可选,指定循环频率
```
`Space` 复位并开始,`←` 复位,`Esc` 退出。
### 2. GELLO 数据采集
```bash
# 录制新数据集
uv run uf-lerobot-record --config_path config/gello/xarm7_gello_record_config.yaml
# 在已有数据集上续录
uv run uf-lerobot-record --config_path config/gello/xarm7_gello_record_config.yaml -r
# 可选:后台异步保存 episode
uv run uf-lerobot-record --config_path config/gello/xarm7_gello_record_config.yaml -a
```
按键控制:`Space` 开始当前 episode`→` 保存,`←` 放弃并重录,`Esc` 停止录制。每个 episode 之间机械臂会自动复位到初始点。
> 采集过程中**机械臂与相机D435 / D435i的相对位置必须保持不变**,推理时的相机位置必须与采集时一致。若机械臂或相机发生变化,此前采集的数据将失效。
### 3. 手动拖拽数据采集
```bash
./start_manual_record.sh
./start_manual_record.sh -r # 强制续录;数据集目录不存在时会报错
```
启动脚本会从 `config/manual_mode/xarm7_manual_record_config.yaml` 读取 `dataset.root`:首次运行创建数据集,之后运行会自动续录已有的有效数据集。如果目录存在但不是有效的 LeRobot 数据集,请更换 `dataset.root`,或确认没有数据后删除该目录。
录制时机械臂处于示教模式,实际关节状态会同时作为 observation 和 action 写入数据集。按住 `C` 缓慢闭合夹爪,按住 `O` 缓慢张开。按键控制:`Space` 开始,`→` 保存,`←` 放弃并重录,`Esc` 停止。episode 之间手动复位机械臂。
### 4. 策略训练
```bash
uv run lerobot-train --policy act --dataset ufactory/xarm7_gello_datas
```
带完整训练参数的示例(每 `save_freq` 步保存一次 checkpoint 到 `output_dir`
```bash
uv run lerobot-train \
--dataset.root=/home/<user>/lerobot_datas/record/ufactory/xarm7_gello_datas \
--dataset.repo_id=ufactory/xarm7_gello_datas \
--policy.type=act \
--policy.device=cuda \
--policy.repo_id=ufactory/xarm7_gello_datas \
--output_dir=/home/<user>/lerobot_datas/train/xarm7_gello_datas \
--job_name=xarm7_gello_datas \
--steps=800000 \
--batch_size=8 \
--save_freq=20000
```
### 5. 策略推理
```bash
uv run uf-lerobot-eval \
--config_path config/gello/xarm7_gello_record_config.yaml \
--policy.path /path/to/train/output/checkpoints/last/pretrained_model/
```
`←` / `→` 复位,`Esc` 停止。
### 6. 回放已录制 episode
将手动拖拽数据集的绝对关节状态(`observation.state`)回放到 xArm7。脚本按数据集 FPS默认 30将状态作为**绝对目标值**发送,不做差分或累加,因此运动轨迹与录制时一致:
```bash
uv run uf-lerobot-replay \
--dataset-root /path/to/xarm7_manual_datas \
--robot-ip 192.168.1.245
# 跳过交互确认(无人值守)
uv run uf-lerobot-replay --dataset-root /path/to/xarm7_manual_datas --robot-ip 192.168.1.245 --yes
# 回放其他 episode
uv run uf-lerobot-replay --dataset-root /path/to/xarm7_manual_datas --robot-ip 192.168.1.245 --episode-index 3
```
回放开始前机械臂会先移动到 xArm SDK 初始点,播放结束后保持最后一帧姿态并断开连接。执行前请确认工作空间无障碍物,且数据中的初始姿态与当前设备一致。
## 工具
### 摄像头查看器
```bash
uv run uf-camera-view -l # 列出所有摄像头
uv run uf-camera-view -T realsense # 查看 RealSense 摄像头
```
### LeRobot 数据集工具
```bash
# 查看索引为 17 的 episode
uv run lerobot-dataset-viz \
--root=/path/to/record/ufactory/xarm7_manual_datas \
--repo-id ufactory/xarm7_manual_datas \
--display-compressed-images true \
--episode-index 17
# 删除索引为 18 和 19 的 episode
uv run lerobot-edit-dataset \
--root=/path/to/record/ufactory/xarm7_manual_datas \
--repo_id ufactory/xarm7_manual_datas \
--new_repo_id ../xarm7_manual_datas_new \
--operation.type delete_episodes \
--operation.episode_indices "[18, 19]"
# 合并数据集
uv run lerobot-edit-dataset \
--root=/path/to/record \
--repo_id ufactory/xarm7_datas_merge \
--operation.type merge \
--operation.repo_ids "['ufactory/xarm7_datas_1', 'ufactory/xarm7_datas_2']"
```
## 项目结构
```
lerobot_xarm7/
├── config/
│ ├── gello/ # xArm7 GELLO 录制配置
│ └── manual_mode/ # xArm7 手动拖拽录制配置
├── src/lerobot_robot_ufactory/
│ ├── robots/
│ │ └── uf_robot/ # xArm 控制(关节/笛卡尔空间、示教模式)
│ ├── teleoperators/
│ │ ├── base_teleop/ # 遥操作基类
│ │ └── gello_teleop/ # GELLODynamixel 示教臂)
│ ├── scripts/
│ │ ├── uf_robot_teleop.py # 遥操作测试
│ │ ├── uf_lerobot_record.py # 数据采集(含手动模式)
│ │ ├── uf_lerobot_eval.py # 策略推理
│ │ ├── uf_lerobot_replay.py # episode 回放
│ │ └── uf_camera_view.py # 摄像头查看器
│ └── configs/parser.py # 配置加载 / CLI 覆盖
├── start_manual_record.sh # 手动拖拽启动脚本
├── pyproject.toml
├── README.md
└── README_ZH.md
```
## 重要提示
- 提供的配置都是**示例**:请根据实际硬件修改 IP、串口、相机序列号、数据集路径和任务描述。
- GELLO 数据采集与推理时,机械臂与相机的相对位姿必须保持一致。
- LeRobot 中扩散策略Diffusion Policy的默认参数主要面向仿真**未针对真实机器人优化**,需要根据任务自行调整。
- 回放或推理前,请确认工作空间无障碍物,并保证机械臂初始姿态与录制数据一致。
## 许可证
本项目基于 Apache License 2.0 发布,详见 [LICENSE](LICENSE) 文件。