CoolFace
Datasetpublic

Hannibal52Barca/demo-joint-space

demo_joint_space Derived from adityx23/icl-demo-dataset (lerobot v2.1 format, 285 episodes / 254,171 frames / 27 tasks). Every existing column, task, episode flag (success/valid/keep), and episode_uid is carried through unchanged. Sibling dataset: demo_action_space adds the same episodes' Cartesian end-effector poses instead of joint targets. Same source, same episode indices, same pipeline. What's added One new feature, action.q_target (float32, shape [14], names… See the full description on the dataset page: https://huggingface.co/datasets/Hannibal52Barca/demo-joint-space.

sourceHugging Faceapache-2.0updated 16d agoView on Hugging Face
0likes70downloads
Dataset Card

demojointspace

Derived from adityx23/icl-demo-dataset (lerobot v2.1 format, 285 episodes / 254,171 frames / 27 tasks). Every existing column, task, episode flag (success/valid/keep), and episode_uid is carried through unchanged.

Sibling dataset: demo_action_space adds the same episodes' Cartesian end-effector poses instead of joint targets. Same source, same episode indices, same pipeline.

What's added

One new feature, action.q_target (float32, shape [14], names lj0..lj6, rj0..rj6): the joint-space reconstruction of each frame's action.left_ee / action.right_ee cartesian targets, via a mink-based IK procedure — the live teleop stack's own solver config (FrameTask(position_cost=1.0, orientation_cost=0.1), PostureTask with lift weighted 100x the arm joints, ConfigurationLimit, daqp, sequential per-episode warm-starting).

Per-episode target anchoring. The recorded action.*_ee cartesian targets carry a real, per-episode/per-arm rigid offset relative to the reference kinematic model (confirmed empirically: near-zero in X/Y, tens of cm in Z, stable for an entire episode/session, different between arms and between recording sessions — consistent with a per-session tool/calibration difference baked into the live system's own clutch anchor). Left uncorrected, this pushes the redundant elbow/wrist joints to track a systematically displaced target, in the worst cases hard enough to hit a mechanical joint limit and stall convergence. Each episode's targets are anchored to that episode's own first frame (observation.state's FK is ground truth — the seed) before solving, removing this bias.

Orientation-glitch repair. The recorded action.{left,right}_ee orientation occasionally snaps by 90-180 degrees for a frame or two — a source-data artifact (observation.state stays smooth through the same frames), not a real robot event — which would otherwise derail the sequential warm-started solver for thousands of frames afterward. Flagged by frame-to-frame angular velocity against the last confirmed-good frame (handles held/duplicated glitch frames, not just single-frame spikes) and repaired by SLERPing between the nearest good frames. A hard re-seed from the real recorded joint state after 15 consecutive unsolved frames bounds any stall this misses.

What's NOT included

  • —Videos. This repo has no videos/ directory. The source dataset's videos still apply unchanged per episode_index — pair this repo's data/ with adityx23/icl-demo-dataset's videos/ if you need both.
  • —Per-frame IK convergence diagnostics (solved flag, pos/rot error) are not part of the schema — they were used to validate the reconstruction but aren't persisted here to keep the schema identical to the source plus one field. Across the full regeneration: 1,887 / 254,171 left-arm frames (0.74%) and 8,576 / 254,171 right-arm frames (3.37%) did not fully converge.

Fidelity note

The arm is 7-DOF/6-DOF-pose redundant, so action.q_target is a valid joint configuration reaching the recorded cartesian target, not necessarily bit-identical to the joint configuration the live system originally computed for that same target — solving frames out of order, in parallel, or from a different seed can converge to a different (still low pose-error) solution.