| import argparse |
| import os |
| from pathlib import Path |
| import h5py |
| import numpy as np |
| import json |
| import robosuite |
| import robosuite.utils.transform_utils as T |
| import robosuite.macros as macros |
|
|
| import init_path |
| import libero.libero.utils.utils as libero_utils |
| import cv2 |
| from PIL import Image |
| from robosuite.utils import camera_utils |
|
|
| from libero.libero.envs import * |
| from libero.libero import get_libero_path |
|
|
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--demo-file", default="demo.hdf5") |
|
|
| parser.add_argument( |
| "--use-actions", |
| action="store_true", |
| ) |
| parser.add_argument("--use-camera-obs", action="store_true") |
| parser.add_argument( |
| "--dataset-path", |
| type=str, |
| default="datasets/", |
| ) |
|
|
| parser.add_argument( |
| "--dataset-name", |
| type=str, |
| default="training_set", |
| ) |
|
|
| parser.add_argument("--no-proprio", action="store_true") |
|
|
| parser.add_argument( |
| "--use-depth", |
| action="store_true", |
| ) |
|
|
| args = parser.parse_args() |
|
|
| hdf5_path = args.demo_file |
| f = h5py.File(hdf5_path, "r") |
| env_name = f["data"].attrs["env"] |
|
|
| env_args = f["data"].attrs["env_info"] |
| env_kwargs = json.loads(f["data"].attrs["env_info"]) |
|
|
| problem_info = json.loads(f["data"].attrs["problem_info"]) |
| problem_info["domain_name"] |
| problem_name = problem_info["problem_name"] |
| language_instruction = problem_info["language_instruction"] |
|
|
| |
| demos = list(f["data"].keys()) |
|
|
| bddl_file_name = f["data"].attrs["bddl_file_name"] |
|
|
| bddl_file_dir = os.path.dirname(bddl_file_name) |
| replace_bddl_prefix = "/".join(bddl_file_dir.split("bddl_files/")[:-1] + "bddl_files") |
|
|
| hdf5_path = os.path.join(get_libero_path("datasets"), bddl_file_dir.split("bddl_files/")[-1].replace(".bddl", "_demo.hdf5")) |
|
|
| output_parent_dir = Path(hdf5_path).parent |
| output_parent_dir.mkdir(parents=True, exist_ok=True) |
|
|
| h5py_f = h5py.File(hdf5_path, "w") |
|
|
| grp = h5py_f.create_group("data") |
|
|
| grp.attrs["env_name"] = env_name |
| grp.attrs["problem_info"] = f["data"].attrs["problem_info"] |
| grp.attrs["macros_image_convention"] = macros.IMAGE_CONVENTION |
|
|
| libero_utils.update_env_kwargs( |
| env_kwargs, |
| bddl_file_name=bddl_file_name, |
| has_renderer=not args.use_camera_obs, |
| has_offscreen_renderer=args.use_camera_obs, |
| ignore_done=True, |
| use_camera_obs=args.use_camera_obs, |
| camera_depths=args.use_depth, |
| camera_names=[ |
| "robot0_eye_in_hand", |
| "agentview", |
| ], |
| reward_shaping=True, |
| control_freq=20, |
| camera_heights=128, |
| camera_widths=128, |
| camera_segmentations=None, |
| ) |
|
|
| grp.attrs["bddl_file_name"] = bddl_file_name |
| grp.attrs["bddl_file_content"] = open(bddl_file_name, "r").read() |
| print(grp.attrs["bddl_file_content"]) |
|
|
| env = TASK_MAPPING[problem_name]( |
| **env_kwargs, |
| ) |
|
|
| env_args = { |
| "type": 1, |
| "env_name": env_name, |
| "problem_name": problem_name, |
| "bddl_file": f["data"].attrs["bddl_file_name"], |
| "env_kwargs": env_kwargs, |
| } |
|
|
| grp.attrs["env_args"] = json.dumps(env_args) |
| print(grp.attrs["env_args"]) |
| total_len = 0 |
| demos = demos |
|
|
| cap_index = 5 |
|
|
| for (i, ep) in enumerate(demos): |
| print("Playing back random episode... (press ESC to quit)") |
|
|
| |
| |
| model_xml = f["data/{}".format(ep)].attrs["model_file"] |
| reset_success = False |
| while not reset_success: |
| try: |
| env.reset() |
| reset_success = True |
| except: |
| continue |
|
|
| model_xml = libero_utils.postprocess_model_xml(model_xml, {}) |
|
|
| if not args.use_camera_obs: |
| env.viewer.set_camera(0) |
|
|
| |
| states = f["data/{}/states".format(ep)][()] |
| actions = np.array(f["data/{}/actions".format(ep)][()]) |
|
|
| num_actions = actions.shape[0] |
|
|
| init_idx = 0 |
| env.reset_from_xml_string(model_xml) |
| env.sim.reset() |
| env.sim.set_state_from_flattened(states[init_idx]) |
| env.sim.forward() |
| model_xml = env.sim.model.get_xml() |
|
|
| ee_states = [] |
| gripper_states = [] |
| joint_states = [] |
| robot_states = [] |
|
|
| agentview_images = [] |
| eye_in_hand_images = [] |
|
|
| agentview_depths = [] |
| eye_in_hand_depths = [] |
|
|
| agentview_seg = {0: [], 1: [], 2: [], 3: [], 4: []} |
|
|
| rewards = [] |
| dones = [] |
|
|
| valid_index = [] |
|
|
| for j, action in enumerate(actions): |
|
|
| obs, reward, done, info = env.step(action) |
|
|
| if j < num_actions - 1: |
| |
| state_playback = env.sim.get_state().flatten() |
| |
| err = np.linalg.norm(states[j + 1] - state_playback) |
|
|
| if err > 0.01: |
| print( |
| f"[warning] playback diverged by {err:.2f} for ep {ep} at step {j}" |
| ) |
|
|
| |
| |
| if j < cap_index: |
| continue |
|
|
| valid_index.append(j) |
|
|
| if not args.no_proprio: |
| if "robot0_gripper_qpos" in obs: |
| gripper_states.append(obs["robot0_gripper_qpos"]) |
|
|
| joint_states.append(obs["robot0_joint_pos"]) |
|
|
| ee_states.append( |
| np.hstack( |
| ( |
| obs["robot0_eef_pos"], |
| T.quat2axisangle(obs["robot0_eef_quat"]), |
| ) |
| ) |
| ) |
|
|
| robot_states.append(env.get_robot_state_vector(obs)) |
|
|
| if args.use_camera_obs: |
|
|
| if args.use_depth: |
| agentview_depths.append(obs["agentview_depth"]) |
| eye_in_hand_depths.append(obs["robot0_eye_in_hand_depth"]) |
|
|
| agentview_images.append(obs["agentview_image"]) |
| eye_in_hand_images.append(obs["robot0_eye_in_hand_image"]) |
| else: |
| env.render() |
|
|
| |
| states = states[valid_index] |
| actions = actions[valid_index] |
| dones = np.zeros(len(actions)).astype(np.uint8) |
| dones[-1] = 1 |
| rewards = np.zeros(len(actions)).astype(np.uint8) |
| rewards[-1] = 1 |
| print(len(actions), len(agentview_images)) |
| assert len(actions) == len(agentview_images) |
| print(len(actions)) |
|
|
| ep_data_grp = grp.create_group(f"demo_{i}") |
|
|
| obs_grp = ep_data_grp.create_group("obs") |
| if not args.no_proprio: |
| obs_grp.create_dataset( |
| "gripper_states", data=np.stack(gripper_states, axis=0) |
| ) |
| obs_grp.create_dataset("joint_states", data=np.stack(joint_states, axis=0)) |
| obs_grp.create_dataset("ee_states", data=np.stack(ee_states, axis=0)) |
| obs_grp.create_dataset("ee_pos", data=np.stack(ee_states, axis=0)[:, :3]) |
| obs_grp.create_dataset("ee_ori", data=np.stack(ee_states, axis=0)[:, 3:]) |
|
|
| obs_grp.create_dataset("agentview_rgb", data=np.stack(agentview_images, axis=0)) |
| obs_grp.create_dataset( |
| "eye_in_hand_rgb", data=np.stack(eye_in_hand_images, axis=0) |
| ) |
| if args.use_depth: |
| obs_grp.create_dataset( |
| "agentview_depth", data=np.stack(agentview_depths, axis=0) |
| ) |
| obs_grp.create_dataset( |
| "eye_in_hand_depth", data=np.stack(eye_in_hand_depths, axis=0) |
| ) |
|
|
| ep_data_grp.create_dataset("actions", data=actions) |
| ep_data_grp.create_dataset("states", data=states) |
| ep_data_grp.create_dataset("robot_states", data=np.stack(robot_states, axis=0)) |
| ep_data_grp.create_dataset("rewards", data=rewards) |
| ep_data_grp.create_dataset("dones", data=dones) |
| ep_data_grp.attrs["num_samples"] = len(agentview_images) |
| ep_data_grp.attrs["model_file"] = model_xml |
| ep_data_grp.attrs["init_state"] = states[init_idx] |
| total_len += len(agentview_images) |
|
|
| grp.attrs["num_demos"] = len(demos) |
| grp.attrs["total"] = total_len |
| env.close() |
|
|
| h5py_f.close() |
| f.close() |
|
|
| print("The created dataset is saved in the following path: ") |
| print(hdf5_path) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|