---
title: openarm-fruits
canonical_url: "https://www.modelscope.cn/datasets/LuckyPBJY/openarm-fruits"
md_url: "https://www.modelscope.cn/datasets/LuckyPBJY/openarm-fruits.md"
repository: LuckyPBJY/openarm-fruits
chinese_name: "OpenArm 水果抓取数据集"
last_updated: 2026-10-28
license: cc-by-4.0
storage_size: "9.0 GB"
downloads: 2
stars: 0
---

# openarm-fruits

> openarm-fruits - LuckyPBJY 在 ModelScope 开源的数据集。37 episodes of real-robot manipulation on a dual-arm OpenArm platform, 30 Hz, 3 RGB cameras + 2 tactile sensors, HDF5

LuckyPBJY/openarm-fruits 是 ModelScope 魔搭社区上的数据集，存储大小 9.0 GB，采用 cc-by-4.0 许可。

- **Repository**: LuckyPBJY/openarm-fruits
- **License**: cc-by-4.0
- **Storage size**: 9.0 GB
- **Downloads**: 2
- **Stars**: 0
- **Last updated**: 2026-10-28

Source: https://www.modelscope.cn/datasets/LuckyPBJY/openarm-fruits

---

# OpenArm Fruits Manipulation Dataset

Real-robot manipulation data collected on a dual-arm **OpenArm** platform with
teleoperation (VR controller). 37 episodes of one pick-and-place style task
involving fruits, recorded at 30 Hz with three RGB cameras and two tactile
sensors on the right gripper.

## Dataset summary

| Item | Value |
|---|---|
| Episodes | 37 (`episode_*.hdf5`) |
| Total frames | 23,952 |
| Total duration | 13.6 minutes |
| Control rate | 30 Hz (measured 29.3–30.0 Hz) |
| Size | ~9.1 GB |
| Schema | `rbm_openarm_data_collection` v1.7 (pipeline 1.10) |
| Arms | right arm active; left arm kept static |
| Cameras | `head` 1280×720, `left_wrist` 640×480, `right_wrist` 640×480 (JPEG) |
| Tactile | 2 sensors (right finger pair), 700×400 JPEG + 6-axis force resultant |
| Language annotations | none |

## File layout

```
data/demo_0/
  timestamp                  (N,)        frame timestamps (s)
  actions                    (N,16)      commands actually sent to the controllers
                                         (16 joint values; last dim of each arm = gripper, metres)
  actions_eef                (N,14)      FK(actions) -> hand TCP pose, world frame, quat xyzw
  actions_eef_intent         (N,14)      VR IK target TCP pose, NaN when stale
  actions_eef_intent_valid   (N,2)       freshness mask [left, right]
  observations/
    qpos, qvel               (N,16)
    eef                      (N,14)
    odom                     (N,13)      placeholder (constant)
    cmd_vel                  (N,6)       placeholder (constant)
    images/head              (N, bytes)  JPEG payloads
    images/left_wrist        (N, bytes)
    images/right_wrist       (N, bytes)
    images/*_lengths         (N,)        valid byte count per frame
    tactile/{right_finger,right_left_finger}/
      image                  (N, bytes)  700x400 JPEG
      image_lengths          (N,)
      force_resultant        (N,6)       force components
      valid                  (N,)        bool
meta/
  joint_names (16), config, action_sources, cmd_age, intent_age,
  pipeline_version, code_version, num_episodes, wall_clock_start,
  tactile/{...}/{sample_id, capture_timestamp, age, received, sdk_timestamp, is_new, available}
```

Joint order: left arm 1–7, left gripper, right arm 1–7, right gripper.

## Notes

- **Actions are real controller commands**, not copies of `qpos`. Tracking error
  between commanded and measured joint positions is ~0.036 rad (median) and the
  command leads the state by 1–2 frames.
- `odom` and `cmd_vel` are constant placeholders and carry no information.
- `actions_eef_intent` is only valid on frames where the VR target is fresh
  (`actions_eef_intent_valid`); the left side is invalid for the whole dataset
  because the left arm was not teleoperated.
- Episodes were trimmed to their useful segments; the leading placeholder-command
  prefix (~10–15 frames) is still present and may be trimmed by users.
- All per-frame streams are 1:1 aligned with `timestamp`; timestamps are strictly
  increasing. A handful of episodes contain short recording pauses (<0.2 s)
  with no significant jump in joint state.

## Loading

```python
import h5py
import numpy as np

with h5py.File("episode_0.hdf5", "r") as f:
    demo = f["data/demo_0"]
    ts   = demo["timestamp"][:]
    qpos = demo["observations/qpos"][:]
    act  = demo["actions"][:]
    img  = demo["observations/images"]
    jpeg = img["head"][i][: img["head_lengths"][i]]
```

## License

Released under CC BY 4.0. Please cite this dataset if you use it.
