【仿真实验】robomimic项目复现
robomimic 是一个用于机器人从演示学习的框架,该项目提供了一系列机器人操作的演示数据和离线学习算法,可以让人们对任务和算法进行标准化测试。
本文测试的版本为 robomimic v0.3
一、安装与环境搭建
在安装之前确保运行 Linux 系统,并安装有 conda。
1.1 安装 robomimic
(1)创建并激活虚拟环境
1 | conda create -n robomimic python=3.8.0 -y |
(2)安装Pytorch
其中的 pytorch 版本和 torchvision 版本官方说可以修改,暂未测试。
1 | conda install pytorch==2.0.0 torchvision==0.15.1 -c pytorch |
(3)安装 robomimic
1 | cd <你想保存robomimic代码的位置> |
1.2 安装模拟器
(1)robosuite
运行大多数 robomimic 示例和发布的数据集需要使用 robosuite 模拟器,安装方式如下:
1 | cd <你想保存robosuite代码的位置> |
(2)D4RL
D4RL也提供了标准化的训练环境和数据集,安装方式如下:
1 | git clone https://github.com/Farama-Foundation/d4rl.git |
1.3 安装测试
简单测试:
1 | cd <robomimic代码安装位置> |
[!question]- 问题:
AttributeError: module 'mujoco_py' has no attribute 'builder'
目前我的解决方法如下:
- 安装 mujoco-210,可参考3(3) Prepare the mujoco environment
- 安装 mujoco-py:
pip install mujoco-py
- 安装 Cython:
pip install "cython<3"
[!question]- 问题:
Error compiling Cython file
解决方法如下:
pip install "cython<3"
[!question]- 问题:
EGL_NOT_INITIALIZED
解决方法如下:
- 替换
robosuite/robosuite/renderers/context/egl_context.py
的155行self.free()
为pass
- 注释掉
robosuite/robosuite/utils/binding_utils.py
的199行self.gl_ctx.free()
全面测试:
运行一个调试环境,以确保robomimic安装正确:
1 | cd <robomimic代码安装位置>/test |
运行过程可能持续几分钟,命令行会出现很多passed,说明没有问题,中间如果出现和EGL有关的问题,可以先不用管,EGL是用于没有显示器的server版服务器进行渲染的时候使用的。
二、实验复现
2.1 论文结果复现
(1)数据集下载
这里下载了 tool_hang
场景进行了测试,其它可用的场景参考官方文档
1 | cd <robomimic代码安装位置>/robomimic/scripts |
(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 内容说明
官方对每一项任务提供了两种类型的数据集:image
和 low_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 | cd <你想保存数据集的位置> |
下载 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 数据格式直接生成数据。
参考链接: