Skip to content

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.

Reacher10 obs · 2 act
Pusher23 obs · 7 act
Sawyer reachMetaworld-style
EnvironmentObsActFrame skip
Reacher1022
Pusher2375
Sawyer reach1045

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.

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.

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.

Terminal window
pixi run mojo run -I . examples/metaworld/sawyer_reach_render.mojo

Reacher and Pusher wrap into the batched GPU driver like any physics3d environment:

from noeira.envs.reacher import ReacherModel, ReacherConfig
from noeira.envs.phyics3d_batched_env import Phyics3dBatchedEnv
comptime BatchedEnvT = Phyics3dBatchedEnv[ReacherModel, ReacherConfig, N_ENVS]
WhereWhatPage
DeepMind Control manipulationthe Jaco arm and hand: reach, lift, place, stack and reassemble bricks — 13 tasks, 250 steps eachDeepMind Control
dm_control suitemanipulator (bring and insert a ball or peg) and stacker on a planar armDeepMind Control
Franka Panda + LIBEROrobosuite’s Panda under the OSC controller, in LIBERO’s kitchen, living-room and study scenesLIBERO
SO-101 task familiesthe arm on the desk, with bricks and a bowl: reach, settle, lift, gather, cube-in-bowlTasks, Sim twin
Robot portsSO-ARM100, SO-ARM101 reachRobots

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.

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.

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