Hang Mugs


| Task ID | |
| SE3 language instruction | “Hang the white mug on peg and the pink mug on peg of the wooden mug tree, by their handles.” |
| Official language instruction | Hang all the mugs on the mug rack. |
| RoboDojo category | Generalization |
| Materials | two ceramic mugs, white and pink, and a freestanding wooden mug tree with six pegs. |
| Difference | SE3 has 2 mugs rather than 3, and each mug has an assigned peg. |
| RoboDojo task page | Hang Mugs |
Progress score
Score the highest milestone whose condition holds at the end of the episode; the episode succeeds at 100. Also record the failure mode and the execution metrics below.
A mug hangs when it hangs securely by its handle on its assigned peg; a mug resting on the base or table does not hang.
| Progress | Condition |
|---|---|
| 0 | No milestone below is reached. |
| 10 | A mug is grasped and lifted clear of the table. |
| 25 | A held mug's handle reaches its assigned peg. |
| 50 | One mug hangs and the gripper is open. |
| 100 | Both mugs hang and the rack is upright. Both arms are back at origin. |
Execution metrics
Record these alongside progress; they do not change it. Count over the whole episode, including events later corrected.
| Metric | What to count | Answer |
|---|---|---|
| Failed grasps | Grasps that close on or around a task object without lifting it clear of the table. | 0 · 1 · 2 · 3+ |
| Drops | Held objects that fall before they are released at a target. | 0 · 1 · 2 · 3+ |
| Missed hangs | Attempts where a handle reaches a peg but the mug does not end up hanging from it. | 0 · 1 · 2 · 3+ |
| Rack disturbed | Did the rack tip or slide at any time? | yes · no |
Randomization
Each episode samples every variable below and records its values.
| Variable | Domain |
|---|---|
| , | Two distinct pegs, 1–6, numbered by peg-tip height from lowest to highest. |
| Start layout | Rack position near the back; mug positions and handle directions anywhere, clear of the arms. |
Python SDK
from se3labs.sdk.eval.tasks import TaskRegistry
definition = TaskRegistry.get_task("ROBODOJO-REAL-05")
# Sample one episode's parameters and initial layout.
task = definition.sample(seed=42)
# Sample 20 episodes with separate seeds; seed=42 reproduces the same set.
tasks = definition.sample_set(seed=42, episodes=20)
Create and run a job:
from se3labs.sdk import eval_client
job = TaskRegistry.get_job(
"ROBODOJO-REAL-05", policy=policy, seed=42, episodes=20,
)
report = eval_client.serve_policy("your-station", "your-relay:7443", job)
task.layout.visualize("layout.png") saves the sampled layout.