{
  "source": {
    "dataset": "enactic/openarm-2-cell-pick_up_cube_mujoco-lerobot",
    "url": "https://huggingface.co/datasets/enactic/openarm-2-cell-pick_up_cube_mujoco-lerobot",
    "commit": "c37b77992de5004bf0f6f582cbe2e369fc8f9fe4",
    "license": "Apache-2.0",
    "holder": "Enactic, Inc.",
    "note": "MuJoCo simulation, VR teleoperation"
  },
  "copyright": "Data © Enactic, Inc., licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0). Modified by Libertron Co., Ltd., 2026 — see changes. This file also carries the notice for motion.bin.",
  "modified_by": "Libertron Co., Ltd.",
  "notice": "https://openarm.co.kr/ko/licenses#twin-motion",
  "kinematics_source": {
    "urdf": {
      "repo": "enactic/openarm_description",
      "commit": "10ca9bf2f49ef93a2f0f83f97ed2c0fb42dd9a90",
      "file": "assets/robot/openarm_v2.0/urdf/example/v2.urdf",
      "license": "Apache-2.0"
    },
    "mjcf": {
      "repo": "enactic/openarm_mujoco",
      "commit": "06b4c8ad6d547c3faaa3bf780629ee3e1ac2b0d0",
      "files": [
        "v2/openarm_bimanual.xml",
        "v2/cell/cell.xml",
        "v2/cell/demo.xml"
      ],
      "license": "Apache-2.0"
    }
  },
  "field": "observation.state",
  "fps": 30,
  "binary": "motion.bin",
  "layout": {
    "endian": "little",
    "magic": "OATJ",
    "header": "u16 version, u16 channels, u16 fps, u16 episodes",
    "episode_table": {
      "offset": 12,
      "entry_bytes": 10,
      "entry": "u16 episode_index, u32 start_frame, u32 frame_count"
    },
    "quant_table": {
      "offset": 62,
      "entry_bytes": 8,
      "entry": "f32 scale, f32 offset (unaligned — read with DataView)"
    },
    "data": {
      "offset": 190,
      "type": "int16",
      "shape": [
        1041,
        16
      ],
      "order": "frame-major",
      "decode": "value = int16 * scale + offset"
    }
  },
  "channels": [
    {
      "name": "openarm_right_joint1",
      "unit": "rad",
      "lower": -1.3963,
      "upper": 3.4907,
      "source_column": "observation.state[0] right_joint1.pos"
    },
    {
      "name": "openarm_right_joint2",
      "unit": "rad",
      "lower": -0.17453,
      "upper": 3.3161,
      "source_column": "observation.state[1] right_joint2.pos"
    },
    {
      "name": "openarm_right_joint3",
      "unit": "rad",
      "lower": -1.5708,
      "upper": 1.5708,
      "source_column": "observation.state[2] right_joint3.pos"
    },
    {
      "name": "openarm_right_joint4",
      "unit": "rad",
      "lower": 0,
      "upper": 2.4435,
      "source_column": "observation.state[3] right_joint4.pos"
    },
    {
      "name": "openarm_right_joint5",
      "unit": "rad",
      "lower": -1.5708,
      "upper": 1.5708,
      "source_column": "observation.state[4] right_joint5.pos"
    },
    {
      "name": "openarm_right_joint6",
      "unit": "rad",
      "lower": -0.7854,
      "upper": 0.7854,
      "source_column": "observation.state[5] right_joint6.pos"
    },
    {
      "name": "openarm_right_joint7",
      "unit": "rad",
      "lower": -1.5708,
      "upper": 1.5708,
      "source_column": "observation.state[6] right_joint7.pos"
    },
    {
      "name": "openarm_right_finger_joint1",
      "unit": "rad",
      "lower": -0.7854,
      "upper": 0,
      "source_column": "observation.state[7] right_gripper.pos"
    },
    {
      "name": "openarm_left_joint1",
      "unit": "rad",
      "lower": -3.4907,
      "upper": 1.3963,
      "source_column": "observation.state[8] left_joint1.pos"
    },
    {
      "name": "openarm_left_joint2",
      "unit": "rad",
      "lower": -3.3161,
      "upper": 0.17453,
      "source_column": "observation.state[9] left_joint2.pos"
    },
    {
      "name": "openarm_left_joint3",
      "unit": "rad",
      "lower": -1.5708,
      "upper": 1.5708,
      "source_column": "observation.state[10] left_joint3.pos"
    },
    {
      "name": "openarm_left_joint4",
      "unit": "rad",
      "lower": 0,
      "upper": 2.4435,
      "source_column": "observation.state[11] left_joint4.pos"
    },
    {
      "name": "openarm_left_joint5",
      "unit": "rad",
      "lower": -1.5708,
      "upper": 1.5708,
      "source_column": "observation.state[12] left_joint5.pos"
    },
    {
      "name": "openarm_left_joint6",
      "unit": "rad",
      "lower": -0.7854,
      "upper": 0.7854,
      "source_column": "observation.state[13] left_joint6.pos"
    },
    {
      "name": "openarm_left_joint7",
      "unit": "rad",
      "lower": -1.5708,
      "upper": 1.5708,
      "source_column": "observation.state[14] left_joint7.pos"
    },
    {
      "name": "openarm_left_finger_joint1",
      "unit": "rad",
      "lower": 0,
      "upper": 0.7854,
      "source_column": "observation.state[15] left_gripper.pos"
    }
  ],
  "mimic": [
    {
      "name": "openarm_left_finger_joint2",
      "joint": "openarm_left_finger_joint1",
      "multiplier": 1,
      "offset": 0
    },
    {
      "name": "openarm_right_finger_joint2",
      "joint": "openarm_right_finger_joint1",
      "multiplier": 1,
      "offset": 0
    }
  ],
  "gripper_note": "openarm_*_finger_joint1 각도(rad). 오른손 -0.7854=완전 열림, 0=완전 닫힘(큐브를 쥔 값 약 -0.21). 왼손 0.7854=완전 열림(이 기록에서는 계속 열린 채). finger_joint2는 mimic(multiplier 1).",
  "episodes": [
    {
      "episode_index": 4,
      "start": 0,
      "frames": 234,
      "duration_s": 7.8,
      "grasp_frame": 97,
      "hold_frame": 104,
      "release_frame": 156,
      "cube_world": [
        0.2628,
        0.0072,
        0.382
      ],
      "cube_yaw": -0.0815,
      "cube_size_m": 0.04,
      "attach_offset": [
        0,
        0,
        -0.0007
      ],
      "attach_ee": {
        "frame": "openarm_right_ee_base_link (child of openarm_right_joint7)",
        "position": [
          -0.0017,
          0,
          -0.1618
        ],
        "quaternion": [
          -0.349465,
          0.32814,
          -0.614715,
          0.626358
        ]
      },
      "cube_release_world": [
        0.2795,
        0.145,
        0.392
      ],
      "release_into": "tray",
      "release_drop_m": 0.0472,
      "cube_release_yaw": 0.0239
    },
    {
      "episode_index": 11,
      "start": 234,
      "frames": 166,
      "duration_s": 5.533,
      "grasp_frame": 65,
      "hold_frame": 73,
      "release_frame": 109,
      "cube_world": [
        0.2568,
        -0.004,
        0.382
      ],
      "cube_yaw": -0.0779,
      "cube_size_m": 0.04,
      "attach_offset": [
        0,
        0,
        -0.0047
      ],
      "attach_ee": {
        "frame": "openarm_right_ee_base_link (child of openarm_right_joint7)",
        "position": [
          -0.0054,
          -0.0005,
          -0.1632
        ],
        "quaternion": [
          -0.407906,
          0.350089,
          -0.577592,
          0.61436
        ]
      },
      "cube_release_world": [
        0.2822,
        0.1393,
        0.392
      ],
      "release_into": "tray",
      "release_drop_m": 0.0375,
      "cube_release_yaw": -0.0511
    },
    {
      "episode_index": 10,
      "start": 400,
      "frames": 166,
      "duration_s": 5.533,
      "grasp_frame": 71,
      "hold_frame": 78,
      "release_frame": 118,
      "cube_world": [
        0.2462,
        -0.0012,
        0.382
      ],
      "cube_yaw": -0.0217,
      "cube_size_m": 0.04,
      "attach_offset": [
        0,
        0,
        -0.0214
      ],
      "attach_ee": {
        "frame": "openarm_right_ee_base_link (child of openarm_right_joint7)",
        "position": [
          -0.0192,
          -0.0002,
          -0.1731
        ],
        "quaternion": [
          -0.343172,
          0.33614,
          -0.61825,
          0.622101
        ]
      },
      "cube_release_world": [
        0.2594,
        0.1324,
        0.392
      ],
      "release_into": "tray",
      "release_drop_m": 0.0669,
      "cube_release_yaw": 0.0743
    },
    {
      "episode_index": 2,
      "start": 566,
      "frames": 317,
      "duration_s": 10.567,
      "grasp_frame": 121,
      "hold_frame": 129,
      "release_frame": 236,
      "cube_world": [
        0.2598,
        0.0017,
        0.382
      ],
      "cube_yaw": -0.0876,
      "cube_size_m": 0.04,
      "attach_offset": [
        0,
        0,
        -0.0121
      ],
      "attach_ee": {
        "frame": "openarm_right_ee_base_link (child of openarm_right_joint7)",
        "position": [
          -0.0112,
          0.001,
          -0.1676
        ],
        "quaternion": [
          -0.307376,
          0.358646,
          -0.636804,
          0.609404
        ]
      },
      "cube_release_world": [
        0.2753,
        0.1432,
        0.392
      ],
      "release_into": "tray",
      "release_drop_m": 0.0189,
      "cube_release_yaw": -0.0298
    },
    {
      "episode_index": 24,
      "start": 883,
      "frames": 158,
      "duration_s": 5.267,
      "grasp_frame": 54,
      "hold_frame": 61,
      "release_frame": 94,
      "cube_world": [
        0.2629,
        -0.001,
        0.382
      ],
      "cube_yaw": -0.047,
      "cube_size_m": 0.04,
      "attach_offset": [
        0,
        0,
        -0.0026
      ],
      "attach_ee": {
        "frame": "openarm_right_ee_base_link (child of openarm_right_joint7)",
        "position": [
          -0.0036,
          0,
          -0.1624
        ],
        "quaternion": [
          -0.387208,
          0.377572,
          -0.591667,
          0.597862
        ]
      },
      "cube_release_world": [
        0.2891,
        0.1543,
        0.392
      ],
      "release_into": "tray",
      "release_drop_m": 0.0506,
      "cube_release_yaw": -0.0099
    }
  ],
  "grasp_note": "grasp_frame = 오른손 그리퍼 닫힘 계단의 가운데(열림 -0.7854와 쥔 값의 중간을 지나는 프레임). 기록이 평활화돼 있어 손이 가장 낮은 순간과 이 프레임이 맞는다. hold_frame = 그리퍼 값이 쥔 값(약 -0.21)에 닿은 프레임(손가락이 큐브에 다 닫힌 모습). release_frame = 쥔 뒤 손가락이 쥔 값보다 0.05 rad 넘게 열린 첫 프레임 — 큐브는 이때 손에서 떨어져 release_drop_m만큼 아래 cube_release_world로 떨어진다(자유낙하 √(2h/g) ≈ 0.1~0.15 s).",
  "cube_note": "위치 값은 모두 URDF world(Z-up, m) — 큐브·테이블·틀 메시를 GLB 루트 openarm_v20(Rx -90°) 아래 자식으로 두면 값을 그대로 position에 넣으면 된다. 큐브 표시 순서: frame < grasp_frame → cube_world(yaw=cube_yaw)에 정지. grasp_frame ≤ frame < release_frame → 손에 붙어 이동(attach_ee: openarm_right_ee_base_link 프레임 기준 위치·자세, 또는 단순하게 오른손 핑거 중점 + attach_offset[URDF world]). frame ≥ release_frame → cube_release_world(yaw=cube_release_yaw)에 정지.",
  "finger_mid": {
    "definition": "오른손 두 핑거 패드 접촉면 중심의 중점(URDF collision STL에서 계산)",
    "pad_point": {
      "openarm_left_finger_joint1": {
        "link": "openarm_left_ee_link1",
        "node": "openarm_left_finger_joint1",
        "point": [
          0.00033,
          0.01801,
          -0.09591
        ]
      },
      "openarm_left_finger_joint2": {
        "link": "openarm_left_ee_link2",
        "node": "openarm_left_finger_joint2",
        "point": [
          0.00021,
          -0.018,
          -0.09591
        ]
      },
      "openarm_right_finger_joint1": {
        "link": "openarm_right_ee_link1",
        "node": "openarm_right_finger_joint1",
        "point": [
          0.00033,
          -0.01801,
          -0.09591
        ]
      },
      "openarm_right_finger_joint2": {
        "link": "openarm_right_ee_link2",
        "node": "openarm_right_finger_joint2",
        "point": [
          0.00021,
          0.018,
          -0.09591
        ]
      }
    },
    "node_note": "pad_point.point는 URDF 링크(link) 프레임 좌표다. 링크 프레임 = 관절 노드 node에 관절 회전(rest_quat × axisAngle)을 적용한 뒤의 로컬 프레임이고, GLB에 그 아래 링크 이름 노드(단위 변환)가 있으면 그 노드에서 localToWorld 해도 같다. attach_ee.frame도 같은 규칙(링크 openarm_right_ee_base_link = 관절 openarm_right_joint7 회전 뒤 프레임)."
  },
  "table": {
    "top_z": 0.362,
    "center": [
      0.225,
      0
    ],
    "size": [
      0.82,
      1.1
    ],
    "thickness": 0.01,
    "body_front_x": 0.095,
    "note": "MJCF cell.xml cell_table_col을 URDF world로 옮긴 값(리프터 0 m 가정). 실제 셀에는 URDF body_link0 몸통이 없어서 몸통(앞면 x=0.095)과 테이블 뒤쪽이 겹친다 — 무대에서는 x ≥ body_front_x 쪽만 그리거나 몸통을 숨길 것."
  },
  "tray": {
    "name": "black_frame",
    "center": [
      0.285,
      0.15
    ],
    "floor_top_z": 0.372,
    "inner_size": [
      0.12,
      0.12
    ],
    "boxes": [
      {
        "center": [
          0.285,
          0.15,
          0.367
        ],
        "size": [
          0.14,
          0.14,
          0.01
        ]
      },
      {
        "center": [
          0.35,
          0.15,
          0.382
        ],
        "size": [
          0.01,
          0.14,
          0.04
        ]
      },
      {
        "center": [
          0.22,
          0.15,
          0.382
        ],
        "size": [
          0.01,
          0.14,
          0.04
        ]
      },
      {
        "center": [
          0.285,
          0.215,
          0.382
        ],
        "size": [
          0.12,
          0.01,
          0.04
        ]
      },
      {
        "center": [
          0.285,
          0.085,
          0.382
        ],
        "size": [
          0.12,
          0.01,
          0.04
        ]
      }
    ],
    "color_rgb": [
      0.1,
      0.1,
      0.1
    ],
    "note": "demo.xml black_frame(검은 틀, 바닥판+벽 4개)을 URDF world로 옮긴 값. 기록에서 오른손이 큐브를 이 틀 안에 놓는다."
  },
  "frame_coordinates": "URDF world (Z-up, m)",
  "computed_note": "큐브·테이블 위치는 관절 기록에서 계산한 표시이며 데이터셋에 기록된 값이 아니다",
  "changes": "Selected 5 episodes, quantized to int16, gripper mapped to finger_joint1 angle (values clipped to URDF limits: 739)",
  "quantization_max_abs_error_rad": 0.000012,
  "bytes": 33502,
  "sha256": "8045423cddb26f8a7bac2631e3516b1027791f74568a43d1ef4da26c05d73408"
}
