8000 GitHub - CSCSX/LeRobotTutorial-CN: 这是一个帮助新手通过 LeRobot 项目入门具身智能的中文教程
[go: up one dir, main page]

Skip to content

这是一个帮助新手通过 LeRobot 项目入门具身智能的中文教程

Notifications You must be signed in to change notification settings

CSCSX/LeRobotTutorial-CN

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
< 7440 svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom">
 
 
 
 
 
 

Repository files navigation

LeRobot 入门实践教程

LeRobot 项目旨在为机器人端到端深度学习提供全栈的工具链。目前该项目支持了少数经典的具身智能端到端深度学习的简单案例,其中包含算法和模型实现、简单仿真环境实现、人类采集的简单数据集和预训练的模型权重。本教程以 ACTDiffusion Policy 为例,介绍 LeRobot 的使用全流程,更详细准确的信息应当参考项目源码和手册:https://github.com/huggingface/lerobot。

1. 环境配置

安装 conda

# 检查机器是否安装Conda,如果返回了版本号,说明Conda已经成功安装
conda --version

# 如果机器上未安装Conda, 请按照以下步骤安装:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
sh Miniconda3-latest-Linux-x86_64.sh

# 再次检查
conda --version

克隆项目源码

git clone https://github.com/huggingface/lerobot.git
cd lerobot

创建 conda 虚拟环境并指定 python 版本为 3.10

conda create -y -n lerobot python=3.10 
conda activate lerobot

安装 LeRobot 库

pip install -e ".[aloha, pusht]"

HuggingFace 镜像源

# 如果你使用的是其它 shell 请将 ~/.bashrc 替换为相应的运行配置文件,如 zsh 应当是 ~/.zshrc
echo "export HF_ENDPOINT=https://hf-mirror.com" >> ~/.bashrc
source ~/.bashrc

2. 项目结构

├── examples             # 包含演示示例,这里可以深入了解LeRobot的细节(建议仔细阅读)
|   └── advanced         # 包含更多示例,适合那些已经掌握LeRobot基础的人
├── lerobot
|   ├── configs          # 包含 Hydra YAML 文件,里面包含可以在命令行中覆盖的所有选项
|   |   ├── default.yaml   # 默认选中的配置,加载 pusht 环境和扩散策略
|   |   ├── env            # 各种仿真环境及其数据集:aloha.yaml, pusht.yaml, xarm.yaml
|   |   └── policy         # 各种策略:act.yaml, diffusion.yaml, tdmpc.yaml
|   ├── common           # 包含类和实用工具
|   |   ├── datasets       # 各种人类示范数据集:aloha, pusht, xarm
|   |   ├── envs           # 各种仿真环境:aloha, pusht, xarm
|   |   ├── policies       # 各种策略:act, diffusion, tdmpc
|   |   ├── robot_devices  # 各种真实设备:dynamixel 电机、opencv 摄像头、koch 机器人
|   |   └── utils          # 各种实用工具
|   └── scripts          # 包含通过命令行执行的功能
|       ├── eval.py                 # 加载策略并在环境中进行评估
|       ├── train.py                # 通过模仿学习和/或强化学习训练策略
|       ├── control_robot.py        # 遥控真实机器人、记录数据、运行策略
|       ├── push_dataset_to_hub.py  # 将数据集转换为 LeRobot 数据集格式并上传到 Hugging Face hub
|       └── visualize_dataset.py    # 加载数据集并渲染其示范数据
├── outputs               # 包含脚本执行结果:日志、视频、模型检查点
└── tests                 # 包含用于持续集成的 pytest 工具

3. 了解数据集

3.1 缓存路径更改(可选)

LeRobot 作为 HuggingFace 的子项目,延续了 HuggingFace 管理数据集仓库和模型仓库的接口和办法。对于任何一个 HuggingFace 的数据集仓库或者模型仓库,都可以用以下方式进行下载:1️⃣使用 huggingface 的 Python API 下载至缓存目录 2️⃣使用 git lfs 工具下载 3️⃣网页点击下载。

对于第一种下载方式,HuggingFace 默认的缓存路径是 ~/.cache/huggingface 而 LeRobot 默认的缓存路径是 ~/.cache/huggingface/lerobot,可以通过如下设置环境变量的方式修改默认的缓存路径。

export HF_HOME={your_cache_dir}/huggingface
export LEROBOT_HOME=$HF_HOME/lerobot

将上面的代码添加至你的 shell 配置文件中,如果你使用的是 bash,那么添加至 ~/.bashrc 中,如果你使用的是 zsh,那么添加至 ~/.zshrc 中。添加完成后,请重启开启一个终端,或者执行 source ~/.bashrcsouorce ~/.zshrc

3.2 LeRobot 数据集速览

请仔细阅读并执行:examples/1_load_lerobot_dataset.py

其中包含了以下内容的示例代码:

  1. 获取 LeRobot 所有数据集的名字列表
  2. 获取某个数据集的元数据(总轨迹数、平均每条轨迹的帧数、平均每秒帧数和机器人类型等等)
  3. 下载某个数据集
  4. 构造一个 LeRobot 数据集对象,并了解重要的参数
  5. 将一个 LeRobot 数据集封装为一个 PyTorch 的 DataLoader 对象

3.3 数据集可视化

Rerun 是一个用于机器学习、计算机视觉和机器人研究的可视化工具,专为在调试和分析过程中实时查看多模态数据和结果而设计。

LeRobot 提供了基于 ReRun 工具的数据集可视化脚本,详见 lerobot/scripts/visualize_dataset.py

# --repo-id 表示数据集的唯一标识
# --episode-index 表示轨迹编号
# 更多参数说明请参考脚本源码或者运行 python lerobot/scripts/visualize_dataset.py --help

# 可视化 lerobot/pusht 数据集
python lerobot/scripts/visualize_dataset.py \
    --repo-id lerobot/pusht \
    --episode-index 0

# 可视化 lerobot/aloha_sim_transfer_cube_human 数据集
python lerobot/scripts/visualize_dataset.py \
    --repo-id lerobot/aloha_sim_transfer_cube_human \
    --episode-index 0

pusht 数据集是 Diffusion Policy 官方测试使用的仿真任务,aloga_sim 是 ACT 官方测试使用的仿真任务,在 LeRobot 项目中,设计了统一的代码接口,允许用户方便地在其中任意的仿真任务上呀验证任意算法。

运行如上代码,应当看到如下窗口。

PushT AlohaSim
PushT AlohaSim

3.4 数据集属性

dataset attributes:
├── hf_dataset: Hugging Face 数据集(Arrow/parquet)
│   ├── observation.images.cam_high (VideoFrame)
│   │   └── VideoFrame = {'path': 视频文件的路径,'timestamp' (float32): 视频中的时间戳}
│   ├── observation.state (list of float32): 臂关节的位置
│   ├── ... (更多的观察数据)
│   ├── action (list of float32): 臂关节的目标位置
│   ├── episode_index (int64): 该样本所在的 episode 索引
│   ├── frame_index (int64): 该样本在 episode 中的帧索引;对于每个 episode 从 0 开始
│   ├── timestamp (float32): episode 中的时间戳
│   ├── next.done (bool): 指示 episode 是否结束;每个 episode 的最后一帧为 True
│   └── index (int64): 整个数据集中的通用索引
├── episode_data_index: 包含两个张量,表示每个 episode 的开始和结束索引
│   ├── from (1D int64 tensor): 每个 episode 的第一帧索引 — 形状为 (num episodes,) 从 0 开始
│   └── to (1D int64 tensor): 每个 episode 的最后一帧索引 — 形状为 (num episodes,)
├── stats: 字典,包含每个特征的统计数据(最大值、均值、最小值、标准差)
│   └── observation.images.cam_high: {'max': 与该特征维度相同的张量(例如,图像为 `(c, 1, 1)`,状态为 `(c,)` 等)}
├── info: 字典,包含数据集元数据
│   ├── codebase_version (str): 用于跟踪创建数据集时使用的代码库版本
│   ├── fps (float): 数据集的帧率(每秒帧数)
│   ├── video (bool): 指示帧是否被编码为 MP4 视频文件以节省空间,或以 PNG 文件存储
│   └── encoding (dict): 如果是视频,记录使用 ffmpeg 编码视频时的主要选项
├── videos_dir (Path): 存储/访问 MP4 视频或 PNG 图像的路径
└── camera_keys (list of string): 用于访问数据集返回项中的相机特征的键(例如 `["observation.images.cam_high", ...]`)

4 模型训练与测试

4.1 测试预训练好的模型

请仔细阅读并执行:examples/2_evaluate_pretrained_policy.py

其中包含了以下内容的示例代码:

  1. 加载一个预训练好的模型(本地或云端)
  2. 创建一个可互动的仿真环境
  3. 模型与仿真环境交互并保存测试视频

尝试将第 26 行代码替换为如下代码重新执行,观察模型未经训练时的表现,与预训练好的效果进行对比:

from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
from lerobot.common.policies.diffusion.modeling_diffusion import DiffusionConfig
cfg = DiffusionConfig()
delta_timestamps = {
    "observation.image": [-0.1, 0.0],
    "observation.state": [-0.1, 0.0],
    "action": [-0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4],
}
dataset = LeRobotDataset("lerobot/pusht", delta_timestamps=delta_timestamps)
policy = DiffusionPolicy(cfg, dataset_stats=dataset.meta.stats)

4.2 训练模型

请仔细阅读并执行:examples/3_train_policy.py

其中包含了端到端模仿学习训练一个模型的示例代码

训练完成后用 examples/2_evaluate_pretrained_policy.py 测试训练后保存的模型(需要修改模型加载路径),并观察效果

可以发现虽然运行了正确的代码,但是并没有得到理想的结果,接下来我们借助一些工具(监控工具 WandB脚本化参数工具 Hydra,帮助我们调整训练超参数,从而复现最优效果。

4.3 WandB 配置

WandB(Weights & Biases)是一个用于机器学习实验跟踪、可视化、和协作的工具,帮助研究人员和开发者更有效地记录、分析和优化他们的模型训练过程。

  1. 注册账号并登录:https://wandb.ai/
  2. 在用户设置中创建自己的 API keys
  3. 以下两种二选一,使得本地运行的实验能够登入 WandB 服务器的个人空间
    • 在命令行中执行 wandb login 并按照提示输入 API Key
    • 配置如下环境变量
    # WandB Config
    export WANDB_API_KEY=<你的 API Key>
    export WANDB_USER_EMAIL=<你的 WandB 注册邮箱>
    export WANDB_USERNAME=<你的 WandB 用户名>

4.4 训练自己的模型

以下脚本的参数能够保证复现出最优结果

请比较复现出最优结果的脚本基于原来的代码做出来哪些调整?

4.4.1 训练 ACT

# 在 Aloha Sim Insertion 仿真任务上训练 ACT
python lerobot/scripts/train.py \
    policy=act \
    env=aloha \
    env.task=AlohaInsertion-v0 \
    dataset_repo_id=lerobot/aloha_sim_insertion_human \
    wandb.enable=true \
    hydra.job.name=ACT-Aloha-Insertion
    
# 在 Push-T 仿真任务上训练 ACT
cp ./examples/advanced/1_train_act_pusht/act_pusht.yaml ./configs/policy/
python lerobot/scripts/train.py \
    policy=act_pusht \
    env=pusht \
    dataset_repo_id=lerobot/pusht \
    wandb.enable=true \
    hydra.job.name=ACT-PushT

4.4.2 训练 Diffusion Policy

# 在 Push-T 仿真任务上训练 Diffusion Policy
python lerobot/scripts/train.py \
    policy=diffusion \
    env=pusht \
    dataset_repo_id=lerobot/pusht \
    wandb.enable=true \
    hydra.job.name=DP-PushT

# 在 Aloha Sim Insertion 仿真任务上训练 Diffusion Policy
# 由于 Lerobot 未提供 diffusion_aloha.yaml,可以使用本仓库修改好的 ./yaml/diffusion_aloha.yaml
python lerobot/scripts/train.py \
    policy=diffusion_aloha \
    env=aloha \
    env.task=AlohaInsertion-v0 \
    dataset_repo_id=lerobot/aloha_sim_insertion_human \
    wandb.enable=true \
    hydra.job.name=DP-Aloha-Insertion

4.5 使用 WandB 监控过程

网页登录wandb,并进入对应的 Lerobot 项目,将会出现以下界面,观察模型的训练过程:

Wandb

4.6 测试自己训练的模型

# 与 4.1 类似,将预训练的 lerobot/diffusion_pusht 换成自己的模型路径
python lerobot/scripts/eval.py \
    -p {OUTPUT_DIR}/checkpoints/last/pretrained_model \
    eval.n_episodes=10 \
    eval.batch_size=10   

## e.g. OUTPUT_DIR 为 outputs/train/2025-01-06/01-12-47_pusht_diffusion_DP-PushT
python lerobot/scripts/eval.py \
    -p outputs/train/2025-01-06/01-12-47_pusht_diffusion_DP-PushT/checkpoints/last/pretrained_model \
    eval.n_episodes=10 \
    eval.batch_size=10   

5 真机实验(可选)

5.1 遥操作录制任务数据集

录制且上传到 Hub:

# HF_USER为Huggingface用户名,DATASET_NAME为定义的任务数据集名称
export HF_USER=xxx
export DATASET_NAME=xxx
python lerobot/scripts/control_robot.py \
    record \
    --repo-id $HF_USER/$DATASET_NAME \
    --single-task $DATASET_NAME \
    --fps 30 \
    --tags tutorial \
    --warmup-time-s 3 \
    --episode-time-s 30 \
    --reset-time-s 3 \
    --num-episodes 50

5.2 真机数据训练

# HF_USER为Huggingface用户名,DATASET_NAME为定义的任务数据集名称
export HF_USER=xxx
export DATASET_NAME=xxx
python lerobot/scripts/train.py \
    dataset_repo_id=$HF_USER/$DATASET_NAME \
    hydra.run.dir=outputs/train/$DATASET_NAME

5.3 真机模型推理

# HF_USER为Huggingface用户名,DATASET_NAME为定义的任务数据集名称, CHECK_POINT为对应保存子目录
export HF_USER=xxx
export DATASET_NAME=xxx
export CHECK_POINT=xxxxx
python lerobot/scripts/control_robot.py \
  record \
  -p outputs/train/$DATASET_NAME/checkpoints/$CHECK_POINT/pretrained_model \
  --repo-id $HF_USER/eval_$DATASET_NAME \
  --single-task eval_$DATASET_NAME \
  --fps 30 \
  --warmup-time-s 3 \
  --reset-time-s 3 \
  --episode-time-s 120 \
  --num-episodes 10 \
  --push-to-hub 0

About

这是一个帮助新手通过 LeRobot 项目入门具身智能的中文教程

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
0