---
title: Articulation
canonical_url: "https://www.modelscope.cn/datasets/RoboFlywheel/Articulation"
md_url: "https://www.modelscope.cn/datasets/RoboFlywheel/Articulation.md"
repository: RoboFlywheel/Articulation
chinese_name: RoboFlywheel-Articulation-Light
last_updated: 2026-10-16
license: "Apache License 2.0"
storage_size: "138 GB"
downloads: 1643340
stars: 2
---

# Articulation

> Articulation - RoboFlywheel 在 ModelScope 开源的数据集。RoboFlywheel-Articulation — Light Release

RoboFlywheel/Articulation 是 ModelScope 魔搭社区上的数据集，存储大小 138 GB，采用 Apache License 2.0 许可。

- **Repository**: RoboFlywheel/Articulation
- **License**: Apache License 2.0
- **Storage size**: 138 GB
- **Downloads**: 1643340
- **Stars**: 2
- **Last updated**: 2026-10-16

Source: https://www.modelscope.cn/datasets/RoboFlywheel/Articulation

---

# RoboFlywheel-Articulation — Light Release

**RoboFlywheel-Articulation (RFW-A)** is a simulation-ready articulated-object library
for robot learning — articulated manipulation, articulation estimation, and
physical-reasoning benchmarks. Every asset is one deterministic `generator(seed)` draw of
a category-level procedural generator, so it is reproducible from its category and seed.

This **light** release ships **10,000 articulated assets** across **531 categories**:
containers and packaging, doors and gates, furniture and seating, kitchenware and
appliances, hand and power tools, electronics and electrical parts, healthcare and
mobility devices, vehicles, astronomy and aerospace hardware, military, sports, music,
playground equipment, toys — plus a `pictureX_*` family built from reference imagery.
Categories are named `<Domain>_<Object>` (e.g. `Container_Bottle`, `Door_Double_Door`,
`Healthcare_Wheelchair`, `Kitchen_Air_fryer`).

## Layout

```
light_RFW_A/
├── assets/<Category_Name>/seed_XXXX/   # 10,000 self-contained asset directories
└── render/                             # Blender script (binds appearance.json PBR materials)
```

```
<Category>/seed_XXXX/
├── model.urdf                    # links (visual + collision + inertial) and joints (axis, limits)
├── part_physics.json             # physics of record: whole-body and per-part properties
├── appearance.json               # per-surface PBR material bindings and texture paths
├── affordance/affordance_annot.json
├── assets/meshes/*.obj           # part meshes (metric, Z-up)
├── assets/textures/mat_<hash>/   # base_color / normal / roughness / metallic / height maps
└── .physics_done                 # completion marker
```

Seed numbering inside a category is not contiguous (e.g. `seed_0001, seed_0002,
seed_0005, …`) — enumerate directories rather than guessing names. The asset key is
`<Category_Name>_<seed4>`. Root link names vary (`base`, `frame`, `door_frame`, …) —
never hardcode them.

## Loading it in a simulator

Physics values come from `part_physics.json`:

```python
import json
pp = json.load(open(f"{asset_dir}/part_physics.json"))
mu1, mu2 = pp["whole_mu1"], pp["whole_mu2"]   # lateral & torsional friction
# per-part values in pp["parts"][<id>]: material_category, density, mass_kg, mu1, mu2,
# centroid, inertia, young_modulus_gpa, poisson_ratio, restitution, ...
```

**PyBullet** — URDF + `changeDynamics`

```python
import pybullet as p
p.connect(p.DIRECT)
bid = p.loadURDF(f"{asset_dir}/model.urdf")     # root floats; useFixedBase=True to weld it
for l in range(-1, p.getNumJoints(bid)):
    p.changeDynamics(bid, l, lateralFriction=mu1, spinningFriction=mu2, rollingFriction=1e-4)
```

**MuJoCo** — URDF via `MjSpec`, free joint needed for a floating base

```python
import mujoco
spec = mujoco.MjSpec.from_file(f"{asset_dir}/model.urdf")
root = spec.worldbody.first_body()              # root link name varies — do not hardcode
root.add_freejoint()                            # omit to bolt the base down
m = spec.compile()
m.geom_friction[:, 0] = mu1                     # slide / lateral
m.geom_friction[:, 1] = mu2                     # spin / torsional
```

Loading the URDF directly with `from_xml_path` welds the root link into the worldbody and
drops its mass — always go through `MjSpec` when the object must float.

**Genesis** — URDF + explicit friction

```python
import genesis as gs
gs.init(backend=gs.cpu)                         # only once per process
sc = gs.Scene(show_viewer=False)
ent = sc.add_entity(gs.morphs.URDF(file=f"{asset_dir}/model.urdf", fixed=False),
                    material=gs.materials.Rigid(friction=mu1))   # friction must be passed explicitly
sc.build()
```

**SAPIEN 3** — URDF + `PhysxMaterial` per shape

```python
import sapien, sapien.physx as px
scene = sapien.Scene()
loader = scene.create_urdf_loader()
loader.fix_root_link = False                    # defaults to True: the base is bolted in place
articulations, actors = loader.load_multiple(f"{asset_dir}/model.urdf")
a = articulations[0]                            # multi-link URDF → lands in articulations
mat = px.PhysxMaterial(mu1, mu1, 0.0)           # static = dynamic = mu1; PhysX has no torsional field
for link in a.get_links():
    for sh in link.get_collision_shapes():
        sh.physical_material = mat              # without this the 0.5 default silently applies
```

**Isaac Sim** — URDF importer (no USD ships with this release)

Use the built-in **URDF Importer** extension on `model.urdf` (links, joints and inertials
are all in the file), then assign a physics material from the `part_physics.json` friction
values and bind the PBR textures from `appearance.json` onto the imported visuals.

## Notes

- **Friction does not come for free**: each `<collision>` carries
  `<gazebo><mu1/><mu2/></gazebo>`, but no mainstream engine reads those tags — apply
  `whole_mu1/whole_mu2` (or per-part values) at import time as shown above.
- **Fixed vs floating base is a per-engine decision**: PyBullet floats by default,
  Genesis floats with `fixed=False`, SAPIEN **fixes** by default
  (`loader.fix_root_link = False` to float), MuJoCo fixes unless you add a free joint.
- **Soft parts**: parts with `young_modulus_gpa < 0.1` (rubber seals, fabric pads) are
  exported as rigid links — use the physics record if your simulator supports deformables.
- **`.physics_done`** marks a completed asset directory; check for it before use.
