3D manipulation
BetaWorks, but under active development — APIs and results may shift. Reacher and Pusher are stable. The Sawyer port is an engine testbed, not a Metaworld reproduction.
Goal-directed arm tasks on the same physics3d engine as the
locomotion environments. Where locomotion rewards
forward velocity, these reward reducing a distance to a target — which makes them
useful for testing algorithms on sparse-ish, goal-conditioned reward.
This page covers the three single-task arms. Most manipulation in noeira now lives in larger families, listed below.
| Environment | Obs | Act | Frame skip |
|---|---|---|---|
| Reacher | 10 | 2 | 2 |
| Pusher | 23 | 7 | 5 |
| Sawyer reach | 10 | 4 | 5 |
Reacher
Section titled “Reacher”A two-link arm reaching for a randomly placed target. Ten observations:
[cos q₀, cos q₁, sin q₀, sin q₁, target xy, qvel[0:2], fingertip − target]Note the last term — the observation includes the vector to the goal, not just both positions. That is what makes it learnable quickly; the agent does not have to infer the relationship.
Two continuous torques. Reward is negative distance to target plus a control cost. The smallest task here and a good first check that a continuous-control agent works on goal-directed reward.
Pusher
Section titled “Pusher”A seven-DOF arm pushing a puck to a goal. Twenty-three observations:
[qpos[:7], qvel[:7], tip_arm_xyz(3), object_xyz(3), goal_xyz(3)]Harder than Reacher in a structural way: the arm must contact an object and move it, so reward depends on a contact interaction rather than just arm kinematics. There is a genuine exploration gap — until the arm touches the puck, the object-to-goal term never changes.
The goal is pinned at its XML position by a custom reset hook
(custom_reset_cpu in the config), matching Gymnasium’s Pusher-v5.
Sawyer
Section titled “Sawyer”A Metaworld-style Sawyer arm on the reach task. Its value to the project is less the task than the engine features it forced:
- Mocap bodies — a motion-captured target the arm tracks, which required a mocap body index in the model layout and skipping it in forward kinematics
- Weld constraints — rigidly attaching the end-effector to the mocap frame
- Collidable meshes under an elliptic friction cone
Those are general capabilities now, not Sawyer-specific. The port covers one Metaworld task, so treat it as an engine testbed rather than a Metaworld reproduction.
Running them
Section titled “Running them”pixi run mojo run -I . examples/metaworld/sawyer_reach_render.mojoReacher and Pusher wrap into the batched GPU driver like any physics3d environment:
from noeira.envs.reacher import ReacherModel, ReacherConfigfrom noeira.envs.phyics3d_batched_env import Phyics3dBatchedEnv
comptime BatchedEnvT = Phyics3dBatchedEnv[ReacherModel, ReacherConfig, N_ENVS]Beyond single-task arms
Section titled “Beyond single-task arms”| Where | What | Page |
|---|---|---|
| DeepMind Control manipulation | the Jaco arm and hand: reach, lift, place, stack and reassemble bricks — 13 tasks, 250 steps each | DeepMind Control |
| dm_control suite | manipulator (bring and insert a ball or peg) and stacker on a planar arm | DeepMind Control |
| Franka Panda + LIBERO | robosuite’s Panda under the OSC controller, in LIBERO’s kitchen, living-room and study scenes | LIBERO |
| SO-101 task families | the arm on the desk, with bricks and a bowl: reach, settle, lift, gather, cube-in-bowl | Tasks, Sim twin |
| Robot ports | SO-ARM100, SO-ARM101 reach | Robots |
The LIBERO and SO-101 scenes are built with the task layer: a scene is a family of slots, and a task is a goal over them, so a new task is a text file rather than a new environment.
What to use them for
Section titled “What to use them for”Goal-conditioned reward — all three reward reaching a target rather than sustaining a behaviour, which stresses different parts of an algorithm than locomotion does. Value estimates have to encode “how far from the goal”, not “how fast am I going”.
Contact-driven exploration — Pusher specifically. An algorithm that cannot discover the object–goal coupling will plateau at “arm hovers near puck”.
Short horizons — Reacher episodes are brief, so iteration is fast when debugging an actor-critic implementation.
Adding a task
Section titled “Adding a task”For a new manipulation task, write a family and a task file rather than a new
environment config: Writing a family walks through
it. A new robot or scene that the task layer cannot express is a
Phyics3dEnvConfig — see Writing your own environment.
- LIBERO — the Panda benchmark suite
- Tasks — families, goals, placement
- 3D locomotion — the larger physics3d family