Align Blocks


| Task ID | |
| SE3 language instruction | “Without picking up any cube, use the clear ruler to push the three purple cubes into one straight, aligned row.” |
| Official language instruction | Use the set square to push the three blocks into a straight, aligned row, then reset the robot arm. |
| RoboDojo category | Instruction-Conditioned |
| Materials | three purple cubes and a straight clear acrylic ruler. |
| Difference | a ruler replaces the set square, so the robot has one straight pushing edge rather than an L-shaped alignment tool. |
| RoboDojo task page | Align Blocks |
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.
| Progress | Condition |
|---|---|
| 0 | No milestone below is reached. |
| 10 | The ruler is grasped. |
| 25 | The ruler pushes a cube, and no cube was ever lifted above the no-lift height. |
| 50 | Two cubes rest flush against the same ruler edge with faces parallel within tolerance, and no cube was ever lifted above the no-lift height. |
| 100 | The three cube centers are collinear and their faces parallel within tolerance, and no cube was ever lifted above the no-lift height. 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 |
|---|---|---|
| Ruler regrasps | Times the ruler is released and grasped again. | 0 · 1 · 2 · 3+ |
| Cube lifts | Times a cube rises above the no-lift height. | 0 · 1 · 2 · 3+ |
| Cubes off the line | Cubes outside the collinearity or yaw tolerance at the end. | 0 · 1 · 2 · 3 |
Randomization
Each episode samples every variable below and records its values.
| Variable | Domain |
|---|---|
| Start layout | Cube positions and yaw and the ruler pose, anywhere clear of the arms. |
Python SDK
from se3labs.sdk.eval.tasks import TaskRegistry
definition = TaskRegistry.get_task("ROBODOJO-REAL-35")
# 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-35", 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.