robomimic 是一个用于机器人从演示学习的框架,该项目提供了一系列机器人操作的演示数据和离线学习算法,可以让人们对任务和算法进行标准化测试。

本文测试的版本为 robomimic v0.3

一、安装与环境搭建

在安装之前确保运行 Linux 系统,并安装有 conda。

1.1 安装 robomimic

(1)创建并激活虚拟环境

1
2
conda create -n robomimic python=3.8.0 -y
conda activate robomimic

(2)安装Pytorch

其中的 pytorch 版本和 torchvision 版本官方说可以修改,暂未测试。

1
conda install pytorch==2.0.0 torchvision==0.15.1 -c pytorch

(3)安装 robomimic

1
2
3
4
cd <你想保存robomimic代码的位置>
git clone https://github.com/ARISE-Initiative/robomimic.git
cd robomimic
pip install -e .

1.2 安装模拟器

(1)robosuite

运行大多数 robomimic 示例和发布的数据集需要使用 robosuite 模拟器,安装方式如下:

1
2
3
4
5
6
cd <你想保存robosuite代码的位置>
git clone https://github.com/ARISE-Initiative/robosuite.git
cd robosuite
git checkout v1.4.1
pip install -r requirements.txt
pip install -e .

(2)D4RL

D4RL也提供了标准化的训练环境和数据集,安装方式如下:

1
2
3
git clone https://github.com/Farama-Foundation/d4rl.git
cd d4rl
pip install -e .

1.3 安装测试

简单测试:

1
2
cd <robomimic代码安装位置>
python examples/train_bc_rnn.py --debug

[!question]- 问题:AttributeError: module 'mujoco_py' has no attribute 'builder'
目前我的解决方法如下:

  1. 安装 mujoco-210,可参考3(3) Prepare the mujoco environment
  2. 安装 mujoco-py:pip install mujoco-py
  3. 安装 Cython:pip install "cython<3"

[!question]- 问题:Error compiling Cython file
解决方法如下:

  1. pip install "cython<3"

[!question]- 问题:EGL_NOT_INITIALIZED
解决方法如下:

  1. 替换robosuite/robosuite/renderers/context/egl_context.py的155行self.free()pass
  2. 注释掉robosuite/robosuite/utils/binding_utils.py的199行self.gl_ctx.free()

全面测试:

运行一个调试环境,以确保robomimic安装正确:

1
2
cd <robomimic代码安装位置>/test
bash test.sh

运行过程可能持续几分钟,命令行会出现很多passed,说明没有问题,中间如果出现和EGL有关的问题,可以先不用管,EGL是用于没有显示器的server版服务器进行渲染的时候使用的。

二、实验复现

2.1 论文结果复现

(1)数据集下载

这里下载了 tool_hang 场景进行了测试,其它可用的场景参考官方文档

1
2
cd <robomimic代码安装位置>/robomimic/scripts
python download_datasets.py --tasks tool_hang

(2)生成配置文件

1
python generate_paper_configs.py --output_dir <想要保存试验结果的绝对路径>

生成的配置文件默认在robomimic/exps/paper路径下,可以在core.sh文件中复制命令进行训练测试。

(3)执行训练

core.sh中找到想要测试的命令,执行命令例如:

1
python /home/mahaofei/Programs/Imitation/RoboMimic/robomimic/robomimic/scripts/train.py --config /home/mahaofei/Programs/Imitation/RoboMimic/robomimic/robomimic/exps/paper/core/tool_hang/ph/low_dim/bc.json

训练生成的可视化视频默认在

1
/tmp/experiment_results/core/bc/tool_hang/ph/low_dim/trained_models/core_bc_tool_hang_ph_low_dim/20231227161534/videos/ToolHang_epoch_100.mp4

2.2 数据集分析

(1)官方数据 hdf5 内容说明

官方对每一项任务提供了两种类型的数据集:imagelow_dim,但两种数据结构基本相同:

  • data (group)
    • total (attribute): 数据集中的 state-action 样本数量
    • env_args (attribute): 一个 json 字符串,包含环境的 metadata 和用于收集数据的相关参数,包含三个keys
      • env_name: 要创建的环境或任务名称
      • env_type: robomimic 支持的环境类型之一
      • env_kwargs: 要传递到 env_name 的关键字参数的字典
    • demo_0 (group): 第一个轨迹的组
      • num_samples (attribute): 该轨迹中的 state-action 样本数
      • model_file (attribute): 对应 mujoco 模型的 xml 字符串,仅适用于 robosuite 数据集
      • states (dataset): 展开的 mujoco 状态,按时间排序,shape(N,D),其中 N 是轨迹的长度,D 是状态向量的维度,对于非 robosuite 数据集,应该为空。
      • actions (dataset): 环境动作,按时间排序,shape(N,A),其中 N 是轨迹的长度,A 是动作空间维度。
      • rewards (datasets): 完成信号,如果当前动作对应的状态代表 eposide 应该结束了,则为1
      • obs (group): 存储 observation 的键的组,每个键都是一个 dataset
        • obs_key_1 (dataset): 第一个 observation key,该数据集名称和形状可能会不同
      • next_obs (group): 下一个 observation 的组
        • obs_key_1 (dataset): 第一个 observation key
    • demo_1 (group): 第二个轨迹的组
  • mask (group): 存在于包含 filter keys 的数据集中
    • filter_key_1: 第一个 filter key,例如列表[“demo_0”, “demo_19”, “demo_35”]

(2)下载 raw、low_dim、image 三种格式的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
cd <你想保存数据集的位置>

# 下载原始数据和 low_dim 数据
wget http://downloads.cs.stanford.edu/downloads/rt_benchmark/tool_hang/ph/demo_v141.hdf5
wget http://downloads.cs.stanford.edu/downloads/rt_benchmark/tool_hang/ph/low_dim_v141.hdf5
#
cd robomimic/robomimic/scripts
python download_datasets.py --tasks <任务名称> --dataset_types all --hdf5_types all --download_dir <数据保存路径>

# 转换得到 image 数据
# 注意,如果训练image数据,需要修改对应json文件中crop_height和crop_width为76
# 注意,转换后数据文件可能在 10GB 左右,注意磁盘空间
python dataset_states_to_obs.py --dataset=<原始数据的路径> --output_name=image_v141.hdf5 --done_mode 2 --camera_names agentview robot0_eye_in_hand sideview --camera_height 84 --camera_width 84

下载 image 格式数据,使用 download_datasets.py 下载会提示无 url,从 raw 数据转换 image 在训练时会提示图片格式错误。经查找,在 v2.0 文档中提供了 image 格式数据,如有需要请从此处下载。

例如 robomimic 的 tool_hang 环境的 image 类型数据集的 demo_0 中内容如下:

  • actions: shape (n, 7),n 为轨迹长度,7为动作维度
  • dones: shape (n, ),n 为轨迹长度
  • obs
    • agentview_image: shape (n, 256, 256, 3),agent 视角图像,分别对应(n, H, W, C),n 为轨迹长度,H 为图像高,W 为宽,C 为图像通道数,所有图像需为 np.uint8 类型
    • object: shape (n, 44),n 为轨迹长度,三个物体 base, frame, tool 的位置,姿态,相对机械臂末端的位置姿态(pos3, quat4, to_eef_pos3, to_eef_quat4),共计 3x14 个值,以及 frame_is_assembled 与 tool_on_frame 两个布尔值
    • robot0_eef_pos: shape (n, 3),机器人末端位置
    • robot0_eef_quat: shape (n, 4),机器人末端姿态四元数
    • robot0_eef_vel_ang: shape (n, 3),机器人末端角速度
    • robot0_eef_vel_lin: shape (n, 3),机器人末端线速度
    • robot0_eye_in_hand_image: shape (n, 256, 256, 3),机器人末端相机图像
    • robot0_gripper_qpos: shape (n, 2),末端夹爪动作状态,左右两侧
    • robot0_gripper_qvel: shape (n, 2),末端夹爪动作速度,左右两侧
    • robot0_joint_pos: shape (n, 7),机器人各关节转角
    • robot0_joint_pos_cos: shape (n, 7),机器人各关节转角 cos 值
    • robot0_joint_pos_sin: shape (n, 7),机器人各关节转角 sin 值
    • robot0_joint_vel: shape (n, 7),机器人各关节速度
    • sideview_image: shape (n, 256, 256, 3),侧方位相机图像
  • next_obs
    • 同上
  • rewards: shape (n, ),n 为轨迹长度
  • states: shape (n, 58),n 为轨迹长度,58 是状态向量的维度,对于非 robosuite 数据集,应该为空

low_dim 类型的数据集的中内容与 image 基本相同,只是 obs 中少了所有的 image。

(3)数据集可视化

使用 playback_dataset.py 脚本查看数据集轨迹。

1
python playback_dataset.py --dataset <path/to/.hdf5> --video_path <path/to/.mp4> --n 5

三、自定义

3.1 生成自定义数据集

该项目中收集人类演示数据的脚本为 robosuite/robosuite/scripts/collect_human_demonstrations.py,其中可以指定环境,指定所使用的机器人,控制单臂还是双臂,用于收集演示数据的相机等等。

但是这些都是 robomimic 所提供的,如果我想要使用自己的机器人模型,在自定义环境中记录任务数据,则需要修改的较多,因此考虑在自己的 mujoco 环境中按照前文分析的 hdf5 数据格式直接生成数据。

参考链接:

  1. Robotmimic 官方文档 (robomimic documentation)