dgrachev/robotwin_extrinsics
This dataset was created using LeRobot. Dataset Description RoboTwin 2.0 (aloha-agilex) with end-effector poses and extrinsics Generated from lerobot/robotwin_unified at commit 1287871839fae2296bc27b88a5457c3e1eba8e1f by benchmarks/robotwin/augment_robotwin_dataset.py. Original state and action columns are unchanged: 14 joint drive targets [left arm(6), left gripper, right arm(6), right gripper], grippers in [0, 1] with 1 = open, at 30 Hz; the action is the… See the full description on the dataset page: https://huggingface.co/datasets/dgrachev/robotwin_extrinsics.
This dataset was created using LeRobot.
<a class="flex" href="https://huggingface.co/spaces/lerobot/visualizedataset?path=dgrachev/robotwinextrinsics"> <img class="block dark:hidden" src="https://huggingface.co/datasets/huggingface/badges/resolve/main/visualize-this-dataset-xl.svg"/> <img class="hidden dark:block" src="https://huggingface.co/datasets/huggingface/badges/resolve/main/visualize-this-dataset-xl-dark.svg"/> </a>
Dataset Description
RoboTwin 2.0 (aloha-agilex) with end-effector poses and extrinsics
Generated from lerobot/robotwin_unified at commit 1287871839fae2296bc27b88a5457c3e1eba8e1f by benchmarks/robotwin/augment_robotwin_dataset.py. Original state and action columns are unchanged: 14 joint drive targets [left arm(6), left gripper, right arm(6), right gripper], grippers in [0, 1] with 1 = open, at 30 Hz; the action is the next frame's target. The three video columns are renamed observation.images.static1 (head), .wrist1 (left wrist) and .wrist2 (right wrist).
The layout is 50 tasks x 550 episodes in RoboTwin's alphabetical task order; the first 50 episodes of each block are the democlean demonstrations the leaderboard trains on, the remaining 500 are demorandomized. Verified against the raw recordings of beat_block_hammer: every raw demo_clean episode is one LeRobot episode of the block, state[t] its joint target t and action[t] its target t + 1.
Pose columns hold [position, rotation, gripper] per arm, left then right. Rotations are active, right-handed R_world_from_end_effector of the arm's link6, which is RoboTwin's endpose (get_obs()["endpose"], the pose take_action(action_type="ee") plans to), by forward kinematics over the URDF from the stored joint drive targets. Against the recorded physical links that is exact when an arm rests and off by the controller's tracking gap while it moves: millimetres in free motion, 27 mm / 2.8 deg at worst on the validation task, at the hammer strike. rot6d stores the first two columns; rot6d_rows stores the first two rows.
observation.state.ee_<rotation>: the pose at the frame's drive targets with the gripper state,2 x (4 + rotation width)wide.action.ee_absolute.<rotation>: the pose the action commands next with the gripper command.action.ee_delta.<rotation>: the same commands as per-step displacements from the state pose, in world axes and metric units (p_cmd - p_state,R_cmd @ R_state.T) with the gripper command.action.jointandobservation.state.joint: the original columns with flatnames, sorelative_exclude_jointscan find the grippers. Theaction.jointstatistics describe 50-step chunks minus the state at chunk start (grippers absolute), the values pi05 normalizes underuse_relative_actions; the originalactionkeeps absolute statistics.observation.intrinsics.<camera>: 3x3 matrices for the stored 640x480 frames, from the D435's 37 degree vertical field of view (the recordings are 320x240 renders of the same cameras).observation.extrinsics.<camera>: world-from-camera[xyz, quaternion xyzw]in the OpenCV convention at every timestamp; the head camera from the embodiment config (exactly the recorded pose), the wrist cameras by forward kinematics of their URDF links.observation.gripper.<arm>_time_to_closeand_time_to_open: seconds until the next command transition of that arm in the same episode;NaNmeans no remaining event.
meta/stats.json holds histogram quantiles over every frame for every numeric column (the source had none for action and observation.state). It additionally carries per-offset statistics for chunk-anchored actions under action.ee_absolute.<rotation>.anchored_horizon_50, frame-expressed ones under .expressed_<frame>_horizon_50 for base, static1, wrist1, wrist2 (one frame for both arms) and wrist (each arm in its own wrist camera) plus the pooled .expressed_horizon_50, and anchored-then-expressed ones pooled over the same frames under .anchored_expressed_horizon_50. These are stats keys, not dataset columns, so normalization ignores them unless a config asks for them by name. Every statistic is shaped (50, action_dim); row i describes offset i inside the chunk, so it broadcasts directly onto a (batch, chunk_size, action_dim) action tensor and a shorter chunk slices rows :chunk_size. Every 10-th chunk start whose whole horizon stays inside one episode contributes; count is that number of chunks, times frames when pooled.
Anchoring: positions are relative to the chunk's first state position in world axes, rotations are R_action @ R_anchor.T, and the gripper stays the absolute command. Expression in a frame frozen at chunk start: absolute poses become R.T (p - t) and R.T M, displacements the pure basis change R.T v and R.T M R.
Published to main and tagged v3.0, which is the revision LeRobot resolves when a config names no revision. Pin a resolved commit SHA in train and evaluation configs to keep a run reproducible against later updates.
- Homepage: [More Information Needed]
- Paper: [More Information Needed]
- License: apache-2.0
Dataset Structure
meta/info.json:
{
"codebase_version": "v3.0",
"fps": 30,
"features": {
"observation.state": {
"dtype": "float32",
"shape": [
14
],
"names": {
"motors": [
"left_waist",
"left_shoulder",
"left_elbow",
"left_forearm_roll",
"left_wrist_angle",
"left_wrist_rotate",
"left_gripper",
"right_waist",
"right_shoulder",
"right_elbow",
"right_forearm_roll",
"right_wrist_angle",
"right_wrist_rotate",
"right_gripper"
]
},
"fps": 30
},
"action": {
"dtype": "float32",
"shape": [
14
],
"names": {
"motors": [
"left_waist",
"left_shoulder",
"left_elbow",
"left_forearm_roll",
"left_wrist_angle",
"left_wrist_rotate",
"left_gripper",
"right_waist",
"right_shoulder",
"right_elbow",
"right_forearm_roll",
"right_wrist_angle",
"right_wrist_rotate",
"right_gripper"
]
},
"fps": 30
},
"timestamp": {
"dtype": "float32",
"shape": [
1
],
"names": null
},
"frame_index": {
"dtype": "int64",
"shape": [
1
],
"names": null
},
"episode_index": {
"dtype": "int64",
"shape": [
1
],
"names": null
},
"index": {
"dtype": "int64",
"shape": [
1
],
"names": null
},
"task_index": {
"dtype": "int64",
"shape": [
1
],
"names": null
},
"observation.state.ee_rotvec": {
"dtype": "float32",
"shape": [
14
],
"names": null
},
"observation.state.ee_quat_xyzw": {
"dtype": "float32",
"shape": [
16
],
"names": null
},
"observation.state.ee_rot6d": {
"dtype": "float32",
"shape": [
20
],
"names": null
},
"observation.state.ee_rot6d_rows": {
"dtype": "float32",
"shape": [
20
],
"names": null
},
"observation.state.ee_matrix": {
"dtype": "float32",
"shape": [
26
],
"names": null
},
"observation.state.ee_euler_xyz_fixed": {
"dtype": "float32",
"shape": [
14
],
"names": null
},
"action.ee_absolute.rotvec": {
"dtype": "float32",
"shape": [
14
],
"names": null
},
"action.ee_absolute.quat_xyzw": {
"dtype": "float32",
"shape": [
16
],
"names": null
},
"action.ee_absolute.rot6d": {
"dtype": "float32",
"shape": [
20
],
"names": null
},
"action.ee_absolute.rot6d_rows": {
"dtype": "float32",
"shape": [
20
],
"names": null
},
"action.ee_absolute.matrix": {
"dtype": "float32",
"shape": [
26
],
"names": null
},
"action.ee_absolute.euler_xyz_fixed": {
"dtype": "float32",
"shape": [
14
],
"names": null
},
"action.ee_delta.rotvec": {
"dtype": "float32",
"shape": [
14
],
"names": null
},
"action.ee_delta.quat_xyzw": {
"dtype": "float32",
"shape": [
16
],
"names": null
},
"action.ee_delta.rot6d": {
"dtype": "float32",
"shape": [
20
],
"names": null
},
"action.ee_delta.rot6d_rows": {
"dtype": "float32",
"shape": [
20
],
"names": null
},
"action.ee_delta.matrix": {
"dtype": "float32",
"shape": [
26
],
"names": null
},
"action.ee_delta.euler_xyz_fixed": {
"dtype": "float32",
"shape": [
14
],
"names": null
},
"observation.gripper.left_time_to_close": {
"dtype": "float32",
"shape": [
1
],
"names": null
},
"observation.gripper.left_time_to_open": {
"dtype": "float32",
"shape": [
1
],
"names": null
},
"observation.gripper.right_time_to_close": {
"dtype": "float32",
"shape": [
1
],
"names": null
},
"observation.gripper.right_time_to_open": {
"dtype": "float32",
"shape": [
1
],
"names": null
},
"observation.intrinsics.static1": {
"dtype": "float32",
"shape": [
3,
3
],
"names": null
},
"observation.extrinsics.static1": {
"dtype": "float32",
"shape": [
7
],
"names": null
},
"observation.intrinsics.wrist1": {
"dtype": "float32",
"shape": [
3,
3
],
"names": null
},
"observation.extrinsics.wrist1": {
"dtype": "float32",
"shape": [
7
],
"names": null
},
"observation.intrinsics.wrist2": {
"dtype": "float32",
"shape": [
3,
3
],
"names": null
},
"observation.extrinsics.wrist2": {
"dtype": "float32",
"shape": [
7
],
"names": null
},
"action.joint": {
"dtype": "float32",
"shape": [
14
],
"names": [
"left_waist",
"left_shoulder",
"left_elbow",
"left_forearm_roll",
"left_wrist_angle",
"left_wrist_rotate",
"left_gripper",
"right_waist",
"right_shoulder",
"right_elbow",
"right_forearm_roll",
"right_wrist_angle",
"right_wrist_rotate",
"right_gripper"
]
},
"observation.state.joint": {
"dtype": "float32",
"shape": [
14
],
"names": [
"left_waist",
"left_shoulder",
"left_elbow",
"left_forearm_roll",
"left_wrist_angle",
"left_wrist_rotate",
"left_gripper",
"right_waist",
"right_shoulder",
"right_elbow",
"right_forearm_roll",
"right_wrist_angle",
"right_wrist_rotate",
"right_gripper"
]
},
"observation.images.static1": {
"dtype": "video",
"shape": [
480,
640,
3
],
"names": [
"height",
"width",
"rgb"
],
"info": {
"video.fps": 30.0,
"video.height": 480,
"video.width": 640,
"video.channels": 3,
"video.codec": "av1",
"video.pix_fmt": "yuv420p",
"video.is_depth_map": false,
"has_audio": false
}
},
"observation.images.wrist1": {
"dtype": "video",
"shape": [
480,
640,
3
],
"names": [
"height",
"width",
"rgb"
],
"info": {
"video.fps": 30.0,
"video.height": 480,
"video.width": 640,
"video.channels": 3,
"video.codec": "av1",
"video.pix_fmt": "yuv420p",
"video.is_depth_map": false,
"has_audio": false
}
},
"observation.images.wrist2": {
"dtype": "video",
"shape": [
480,
640,
3
],
"names": [
"height",
"width",
"rgb"
],
"info": {
"video.fps": 30.0,
"video.height": 480,
"video.width": 640,
"video.channels": 3,
"video.codec": "av1",
"video.pix_fmt": "yuv420p",
"video.is_depth_map": false,
"has_audio": false
}
}
},
"total_episodes": 27500,
"total_frames": 6075103,
"total_tasks": 23559,
"chunks_size": 1000,
"data_files_size_in_mb": 100,
"video_files_size_in_mb": 200,
"data_path": "data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet",
"video_path": "videos/{video_key}/chunk-{chunk_index:03d}/file-{file_index:03d}.mp4",
"robot_type": "aloha",
"splits": {
"train": "0:27500"
}
}Citation
BibTeX:
[More Information Needed]