# 2026-Humanoid-IKEA-Assembly-Challenge: 35 Motors, Seven Cameras, in FiftyOne

> Source: <https://dev.to/harpreetsahota/2026-humanoid-ikea-assembly-challenge-35-motors-seven-cameras-in-fiftyone-39i4>
> Published: 2026-11-11 14:00:35+00:00

A humanoid assembling IKEA furniture logs 35 motors at once, and for each motor it records position, velocity, acceleration and torque. The 2026 Humanoid IKEA Assembly Challenge adds seven camera streams per episode, including infrared pairs from both wrists, and a human-annotated list of the subtasks the robot is working through. This FiftyOne version is a 6-episode, 30.7-minute subset, parsed so the torque plots sit on the same timeline as the wrist cameras.

The [2026 Humanoid IKEA Assembly Challenge subset](https://huggingface.co/datasets/Voxel51/2026-Humanoid-IKEA-Assembly-Challenge) comes from the [BitRobot release](https://huggingface.co/datasets/BitRobot/2026-humanoid-ikea-assembly-challenge). It keeps the shortest episode from each of six recording days spanning the collection window, and converts them to native multimodal MCAP episodes. Each of the 6 episodes runs 7,368 to 11,099 frames.

| Stream | What it holds | 
|---|---|
| `/head-camera` | Stereo head camera, 1280x480 side by side | 
| `/left-wrist-camera` ,`/right-wrist-camera` | RGB wrist views | 
| `/left-wrist-ir1` ,`/left-wrist-ir2` ,`/right-wrist-ir1` ,`/right-wrist-ir2` | Infrared pairs from the wrist depth cameras | 
| `/body-joint-state` ,`/body-joint-command` | All 35 motors: position, velocity, acceleration, torque, each with a timeline plot | 
| `/left-gripper-state` ,`/right-gripper-state` and command counterparts | State and commands for the Dex1-1 hands | 
| `/end-effector-state` ,`/end-effector-action` | End-effector state and action, plus `/pivot.plot` and`/gripper-controls.plot` | 
| `/ego-pose` ,`/odometry.plot` | Pose as `foxglove.PoseInFrame` ; body height, velocity and yaw rate | 
| `/body-imu.plot` ,`/secondary-imu.plot` | The two IMU plots | 
| `/instruction` | The annotated subtask sequence | 

Each episode also has the fields `episode_name`, `task`, `recording_day`, `subtasks`, `num_subtasks`, `num_frames` and `duration`.

The subtask sequence is the part that makes the telemetry readable. The labels run in this order: move to table, move table base, pick table leg, insert table leg to table base, rotate leg to tighten, rotate table base, flip table.

Load the dataset and launch the App:

``` python
import fiftyone as fo
import fiftyone.utils.huggingface as fouh

dataset = fouh.load_from_hub(
    "Voxel51/2026-Humanoid-IKEA-Assembly-Challenge",
    name="2026-Humanoid-IKEA-Assembly-Challenge",
    persistent=True,
)
fo.launch_app(dataset)
```

Open an episode and play it. The wrist RGB views, the infrared pairs and the motor plots share one timeline, so you can scrub to the instruction change for "rotate leg to tighten" and check what the wrist camera shows while the arm torques move.

To start with the longest recording, sort on a per-episode field:

```
view = dataset.sort_by("num_frames", reverse=True)
fo.launch_app(dataset, view=view)
```

The same pattern works on `duration`, `num_subtasks` or `recording_day`.

Six episodes is a small sample. Each one is the shortest episode from its recording day, so the subset leans toward short runs and says little about how long assemblies behave. Use it to check the stream layout, build a viewer or test a parser. For a policy-training claim you need the full BitRobot release.

The camera payloads are the source JPEGs passed through unchanged. The conversion from ROS 2 CDR to the FiftyOne MCAP flavor made one repair: the source recordings declare a `SportModeState` schema that omits its trailing `path_point` array, and the field is restored at decode so the odometry stream reads. If you decode the original files with a strict schema, expect that mismatch.

The source dataset is released under [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/), and this subset uses the same license. For more robot-learning datasets, from arms to humanoids, see [LeRobot v3.0 robot-learning datasets for VLA training, from Franka arms to humanoids](https://employabledatascientist.com/blog/lerobot-v3-datasets-vla-training-fiftyone/).

For more of my FiftyOne dataset notes, see my [Voxel51 author page](https://voxel51.com/author/harpreet), and to curate your own robot data in the same tool, [try Voxel51](https://link.voxel51.com/harpreet).

Six MCAP episodes of 7,368 to 11,099 frames each, 30.7 minutes in total. Each episode has seven camera streams, telemetry for 35 motors, gripper and end-effector streams, base odometry, two IMUs and the annotated subtask sequence.

The cameras are a stereo head camera, left and right wrist RGB cameras, and the infrared pairs from both wrist depth cameras. The body streams carry all 35 motors with position, velocity, acceleration and torque, and each has a timeline plot.

Call load_from_hub with Voxel51/2026-Humanoid-IKEA-Assembly-Challenge and persistent=True, then launch the App. Sort by num_frames to start with the longest episode.

The instruction stream holds a human-annotated sequence: move to table, move table base, pick table leg, insert table leg to table base, rotate leg to tighten, rotate table base, and flip table. Each episode also stores the sequence in a subtasks field and a num_subtasks count.

No. It is a six-episode subset of the BitRobot release, made of the shortest episode from each of six recording days. It is a sample for inspecting the format, not a training set.

*This post first appeared as [the original article](https://employabledatascientist.com/blog/2026-humanoid-ikea-assembly-challenge-fiftyone-analysis/). I'm Harpreet Sahota, Hacker-in-Residence at [The Employable Data Scientist](https://employabledatascientist.com), where we help AI and developer-tool teams ship prototypes, evaluations, and technical content. I also host the [Artists of Intelligence](https://employabledatascientist.com/podcast/) podcast. For new field notes by email, [subscribe on Substack](https://harpreetsahota.substack.com).*
