CoolFace
Datasetpublic

RDLwicked/gim_arm_industrial_assembly_teleop_3cam_joint

gim_arm_industrial_assembly_teleop_3cam_joint Human teleoperation demonstrations of a single 6-DOF GIM XL arm with a parallel gripper, recorded at 30 Hz with three RGB cameras. Task prompt: assemble the industrial parts Episodes 272 Frames 147,066 Duration ~1.4 h Control / logging rate 30 Hz Episode length 301-1359 frames (median 484, mean 541) Cameras 3 x Intel RealSense D405, 720x1280 colour Format LeRobot v3.0 Robot GIM XL 6-DOF, right arm… See the full description on the dataset page: https://huggingface.co/datasets/RDLwicked/gim_arm_industrial_assembly_teleop_3cam_joint.

sourceHugging Faceapache-2.0updated 20d agoView on Hugging Face
0likes115downloads
Dataset Card

gimarmindustrialassemblyteleop3camjoint

Human teleoperation demonstrations of a single 6-DOF GIM XL arm with a parallel gripper, recorded at 30 Hz with three RGB cameras.

Task prompt: assemble the industrial parts
Episodes272
Frames147,066
Duration~1.4 h
Control / logging rate30 Hz
Episode length301-1359 frames (median 484, mean 541)
Cameras3 x Intel RealSense D405, 720x1280 colour
FormatLeRobot v3.0
RobotGIM XL 6-DOF, right arm, parallel gripper

Every episode is pure human teleoperation. No policy rollouts, no corrective takeovers, no synthetic or replayed trajectories.

Loading

python
from lerobot.datasets.lerobot_dataset import LeRobotDataset

ds = LeRobotDataset("RDLwicked/gim_arm_industrial_assembly_teleop_3cam_joint")
sample = ds[0]
sample["observation.state"]              # torch.float32, shape (7,)
sample["action"]                         # torch.float32, shape (7,)
sample["observation.images.top_left"]  # torch.float32, shape (3, 720, 1280)
sample["task"]                           # "assemble the industrial parts"

For action-chunking policies, request a temporal window with delta_timestamps rather than indexing repeatedly:

python
ds = LeRobotDataset(
    "RDLwicked/gim_arm_industrial_assembly_teleop_3cam_joint",
    delta_timestamps={"action": [i / 30 for i in range(50)]},
)

Observation and action space

Both are 7-D and joint-space:

indexnameunitmeaning
0-5arm6_joint1 .. arm6_joint6radiansarm joint angle
6grippermetresgripper jaw opening (0 closed, ~0.105 fully open)
  • —observation.state is the measured joint position (qpos) plus measured gripper opening.
  • —action is the commanded absolute joint position target (qpos_target) plus commanded gripper opening, as sent to the arm at that timestep.

`action` is absolute, not a delta. At 30 Hz consecutive commands are close together, so |action[t] - state[t]| is small relative to action.std(). Policies that regress absolute targets over a long open-loop chunk can therefore reach low training loss while barely conditioning on the proprioceptive state. If you train an action-chunking policy on this data, either predict state-relative targets (action[t] - state[t]) or verify state-sensitivity explicitly before trusting the loss curve.

Cameras

keyviewresolutioncodec
observation.images.top_leftthird-person720x1280x3h264
observation.images.wrist_leftwrist-mounted720x1280x3h264
observation.images.wrist_rightwrist-mounted720x1280x3h264

All three streams are hardware-synchronised RealSense D405 colour streams at 30 fps with fixed manual exposure (22000) and gain (16) -- no auto-exposure drift across an episode. top_left is the third-person scene view; wrist_left and wrist_right are the two wrist-mounted views.

What is not included

  • —observation.images.top_right -- a fourth camera stream present in the raw recordings, omitted here to keep the release to a standard 3-camera setup.
  • —observation.ee_wrench_latent -- a learned 16-D end-effector wrench/force embedding. Omitted because it is only interpretable together with the frozen encoder that produced it.
  • —No validation split: meta/info.json declares a single train split over all 272 episodes. Hold out episodes yourself via LeRobotDataset(..., episodes=[...]).

Robot description

robot/ bundles the URDF and STL meshes for the arm, so forward/inverse kinematics can be computed from the joint data without access to the original rig:

robot/gim_arm_xl_6dof.urdf        # single arm (this dataset)
robot/dual_gim_arm_xl_6dof.urdf   # dual-arm variant of the same description
robot/meshes/*.STL

The joint names in the URDF match the names field of observation.state and action exactly (arm6_joint1 .. arm6_joint6). These are manufacturer-supplied robot description files, redistributed here as-is for convenience.

Provenance

meta/source_manifest.json records, per episode, which raw teleoperation log and which collection session it came from. Episodes are ordered by collection timestamp.

Recordings were quality-screened before conversion: unreadable or truncated logs were dropped, and each episode was trimmed to the operator's engage/release window with leading and trailing joint-position jumps removed.

License

Released under apache-2.0.