Shen, Kumar, et al. (MIT CSAIL + UPenn), 2026

TiPToP: A Planner That
Just Works on Pixels

A modular manipulation system that bolts pretrained vision foundation models onto a GPU-accelerated task-and-motion planner — matching a VLA trained on 350 hours of robot data, with zero robot data of its own.

Prerequisites: Basic 3D geometry + VLA intuition (helps)
11
Chapters
6+
Simulations

Chapter 0: The Problem

You walk up to a robot arm, point a camera at a cluttered table, and type: "serve the peanut butter crackers on each tray." Among the snacks are Goldfish, Cheez-Its, and nuts — and a reflective soda can is blocking the grasp on one of the cracker packs. You want the robot to just do it. No demonstrations. No retraining. No fiddling with the specific brand of cracker.

This is the dream of open-vocabulary manipulation: a robot that takes natural language + camera images in, and outputs correct motion out, on objects and in scenes it has never been trained on.

The core tension: Two paradigms exist, and each fails where the other succeeds. End-to-end learned policies (VLAs) are flexible but need mountains of robot data and fail silently. Classical planners (TAMP) reason precisely about geometry but historically needed hand-built object models and were welded to specific hardware. Can we get the best of both with neither's cost?

Two ways to build a manipulation robot

Approach 1 — VLA (Vision-Language-Action): train a giant transformer on hundreds of hours of teleoperated robot demonstrations. Input pixels + text, output joint commands directly. This is π0.5, OpenVLA, RT-2. It works, but the data is brutally expensive: π0.5-DROID was fine-tuned on 350 hours of embodiment-specific demos. And when it fails, you can't say why — it's one opaque blob.

Approach 2 — TAMP (Task and Motion Planning): explicitly reason about discrete action sequences (pick this, then place that) and continuous geometry (where exactly, along what collision-free path) at the same time. Precise and interpretable. But classical TAMP assumed you already had 3D models of every object — fine in a factory, useless on a random kitchen table.

The 350-hours-vs-zero comparison

The whole paper hangs on this table. Watch the data cost collapse:

SystemRobot training dataSetup timeFailures are...
π0.5-DROID (VLA)350 hours of demosweeks of data collectionopaque (one blob)
TiPToP0 hours< 1 hour install + camera calibrationtraceable to a module

And the punchline from 165 trials across 28 scenes: TiPToP matches or beats the 350-hour VLA — especially on tasks needing semantic reasoning, distractor rejection, and multi-step sequencing.

Why this is hard, precisely

To "just work" on pixels, a system must solve, in one shot from a single camera view:

TiPToP's bet is that each of these is now a solved-enough sub-problem thanks to foundation models — and the win comes from composing them, not training a monolith.

What is the central claim that makes TiPToP surprising?

Chapter 1: The Key Insight

The insight is almost embarrassingly simple, which is exactly why it's powerful: foundation models have quietly made every hard sub-problem of classical TAMP cheap — so stop training a giant policy, and instead glue the best off-the-shelf model into each slot of a planner.

The insight: A VLA tries to learn perception, grounding, planning, and control all at once, end-to-end, from robot data. TiPToP refuses to learn anything. It treats the robot as a pipeline of frozen, pretrained experts — a depth model, a grasp model, a VLM, a planner, a controller — each replaceable the moment a better one ships. The "intelligence" is in the composition.

The acronym is the architecture

TiPToP = TiPToP is a Planner That just works on Pixels. The emphasis on "planner" is the whole thesis: instead of a learned policy mapping pixels→actions, there is an explicit planner in the middle that reasons.

Why "frozen and modular" is the bet

Every component is pretrained and frozen — TiPToP never updates a single weight. This has three consequences that drive the entire paper:

PropertyConsequence
No robot data neededDeploy on a new arm in <1 hour — just calibrate the camera
Components are independentSwap FoundationStereo for a better depth model tomorrow; nothing else changes
Failures are localizedWhen it drops a banana, you trace it to one module (here: convex-hull meshing) and fix that

Contrast a VLA: improving it means collecting more data and retraining the whole blob. A modular system improves the way software improves — one library upgrade at a time.

The five frozen experts

Depth
FoundationStereo — stereo RGB → dense depth map
Grasp
M2T2 — point cloud → ranked 6-DoF grasp poses
VLM
Gemini Robotics-ER — image+language → labels, boxes, symbolic goal G
Segment
SAM-2 — bounding box → pixel-perfect object mask
Plan
cuTAMP + cuRobo — goal G + scene → collision-free timed trajectory
What does TiPToP train?

Chapter 2: TAMP vs VLA Background

Before we trace TiPToP's pipeline, we need to genuinely understand the two worldviews it bridges — because the experiments later show they fail in complementary ways, and that complementarity is the paper's deepest finding.

The VLA worldview: react, don't plan

A VLA like π0.5-DROID is a closed-loop reactive policy. At every timestep t it observes images ot and joint state qt, and emits an action: at = π(ot, qt | L). It runs at 15 Hz, outputting chunks of 15 actions: joint velocities plus a binary gripper g. Crucially, it keeps looking — if a grasp slips, the next frame sees the slip and corrects. Reactivity is its superpower.

Its weakness: it must implicitly discover multi-step structure ("move the can, then grab the cracker") from raw language and pixels, with no explicit notion of geometry or sequencing.

The TAMP worldview: plan once, then commit

TiPToP observes the scene once, at t=0, from a calibrated wrist camera. From that single stereo snapshot o0 = (I0left, I0right) it produces a complete timed trajectory a0 = {(qt, q̇t, gt)} for the entire task — then executes it open-loop, with no further looking. All the reasoning is up-front.

Think of it this way: A VLA is a driver constantly adjusting the wheel. TiPToP is a chess player who thinks for 10 seconds, then executes the whole sequence with eyes closed. Planning ahead lets it solve puzzles the reactive driver can't — but if the world shifts mid-move, it has no recovery.

What "jointly reasoning over discrete and continuous" means

This phrase is the heart of TAMP. The discrete part is the symbolic plan skeleton — which actions in what order: [MoveFree, Pick(cracker), MoveHolding, Place(cracker, tray)]. The continuous part is the geometry — exactly which grasp pose, exactly where to place, along what arm trajectory. The two are coupled: a discrete plan might be infeasible because no continuous grasp exists (the can blocks everything), forcing a different discrete plan that moves the can first.

The interactive contrast

Open-loop plan-once (TiPToP) vs closed-loop react (VLA)

Plan-once: the trajectory is locked at t=0. Try perturbing the object mid-execution.

Why might an open-loop planner fail where a reactive VLA succeeds?

Chapter 3: The Full Pipeline

TiPToP is three modules in series. Each consumes a typed input and emits a typed output — and tracing those types is understanding the system. Let's follow one stereo image pair all the way to joint torques.

Data flow with shapes

Click a module to inspect its data flow

Three modules: Perception → Planning → Execution. Click a box.

The end-to-end type signature

Here is the contract, written as data with shapes — read this once and the whole paper unlocks:

StageInputOutput
Perceptiono0: stereo pair (2 × H×W×3), intrinsics K, baseline b, instruction Lper-object meshes + grasps, symbolic goal G
Planningscene meshes, candidate grasps, goal Gtimed trajectory {(qt, q̇t, gt)}
Executiontrajectory waypointsjoint torques τ at each control step

The two parallel branches inside Perception

The perception module forks into two branches that run simultaneously and only merge at the end:

They are deliberately decoupled: geometry doesn't care what an object is, and semantics doesn't care where it is in 3D. The merge step (Chapter 4) stitches "this mask" to "this chunk of point cloud" to "these grasps."

Why split, then merge? Because the best geometry model (M2T2, trained on point clouds) and the best semantics model (Gemini, trained on internet images) speak totally different languages. Forcing one model to do both would be worse at each. Modularity lets each branch use the right tool, and the merge is a cheap geometric operation (a KD-tree lookup), not a learned fusion.
What is the purpose of the two parallel branches in the perception module?

Chapter 4: The 3D Vision Branch

This branch turns flat pixels into graspable 3D geometry. Three steps: estimate depth, unproject to a world-frame point cloud, and predict grasps. Then the merge: convex-hull meshing and grasp-to-object assignment.

Step 1 — Depth from stereo

FoundationStereo takes the stereo pair and predicts a dense depth map D, aligned to the left image. Why a foundation model instead of the ZED camera's built-in stereo matching? Because the camera's matcher falls apart on the surfaces robots care about most: transparent, specular, and textureless objects (that reflective soda can!). FoundationStereo gives sharp object boundaries where it counts.

Step 2 — Unproject to world frame

A depth map is per-pixel distance. To plan motion you need 3D points in the robot's world frame. Two transforms chained together do it:

pworld = Teeworld · Tcamee · pcam,   where Teeworld = FK(q0)

Every symbol, in plain terms:

Worked example. A pixel reads depth 0.8 m. Through K it becomes pcam = (0.05, −0.02, 0.80). Suppose the camera sits 0.6 m above the table and the arm hasn't rotated it, so Tcamee·Teeworld is just "shift up 0.6 m and flip the z-axis to point down." The world point lands at roughly (0.05, −0.02, −0.20) relative to the wrist, i.e. 0.20 m below it — on the table. Stack millions of these and you have a dense point cloud.

Step 3 — Grasps from M2T2

M2T2 looks at the full scene point cloud and predicts ranked 6-DoF grasp poses (position + orientation of the gripper). "Full scene" matters: because M2T2 sees surrounding geometry, its grasps are informed by clutter — though they are not guaranteed collision-free (that's the planner's job later). Some objects get no grasp; for those, the planner falls back to a heuristic top-down sampler.

Unproject pixels → point cloud, then grasp

Left: depth map. Right: unprojected world-frame point cloud. Tilt the camera and watch the cloud re-register.

The merge: convex-hull meshes + grasp assignment

Now the two branches meet. Using each object's SAM-2 mask (from Chapter 5), the corresponding points are pulled from the cloud, projected down to the object's lowest observed point, and a convex hull is computed — a watertight mesh. Each M2T2 grasp is assigned to its nearest object via a KD-tree lookup; grasps too far from any object point are discarded as noise.

The banana problem (a real failure mode). A convex hull over-approximates concave shapes. A banana's hull is a fat oval that swallows the curve. The planner then thinks the banana is bigger than it is, mis-places grasps, and fails. The paper traces 13 of 55 failures to exactly this "scene completion" error. The fix isn't more data — it's a better mesh model (SAM-3D), swapped in modularly.
Why compute a CONVEX HULL of each object instead of the true mesh?

Chapter 5: The Semantic Branch & Symbolic Goals

Geometry alone can't tell "peanut butter crackers" from "Cheez-Its." That requires a model that has read the internet. The semantic branch is one VLM call that does two jobs at once, plus a segmentation step.

One VLM query, two outputs

Gemini Robotics-ER 1.5 is queried once with the image and the instruction L. It jointly returns: (1) labels + 2D bounding boxes for every object, and (2) a symbolic goal G — a logical conjunction of predicates over those objects. The VLM's web-scale common sense is what grounds "peanut butter crackers" to the two Lance packages, and reasons that "each tray" means one package per tray.

What a symbolic goal actually is

TiPToP currently supports one predicate: On(a, b) — "object a should end up on object/surface b." The instruction "serve peanut butter crackers on each tray" compiles to:

G = On(pb_crackers_left, tray_left)  ∧  On(pb_crackers_right, tray_right)
This is the bridge that makes everything work. The VLM converts fuzzy human language into a precise, machine-checkable goal. Once the task is "achieve these On() relations," a classical planner can take over and reason about it perfectly. The hard, ambiguous part (language → logic) is done by the model that's best at it; the precise part (logic → motion) by the planner that's best at that.

Why this crushes VLAs on semantic tasks

A VLA has no explicit grounding step. To handle "pick up the largest toy," it must learn that relation implicitly from demonstrations. TiPToP's VLM just reasons about it and emits On(largest_toy, plate). In the experiments, π0.5-DROID scored 0/5 on four separate semantic scenes; TiPToP won seven of eight. The explicit symbolic layer is the difference.

Segmentation: from box to mask

The VLM gives a coarse bounding box. To extract clean per-object geometry you need a pixel-perfect mask. So each box is fed to SAM-2, which returns a tight segmentation mask from the left image. These masks are what Chapter 4's merge uses to carve the point cloud into per-object pieces.

Instruction → symbolic goal G (open-vocabulary grounding)

The VLM grounds language to specific objects and emits On() predicates.

What does the symbolic goal G accomplish?

Chapter 6: cuTAMP — Planning by Particle Optimization ⭐

This is the engine room. We have a symbolic goal G and a scene of meshes and grasps. cuTAMP must find a sequence of actions and the continuous parameters (which grasp, where to place, what trajectory) that satisfies G without collisions. It does this with a beautiful trick: thousands of guesses, optimized in parallel on a GPU.

Step 1 — Enumerate plan skeletons

A PDDL-style symbolic planner lists candidate skeletons: action sequences with unbound continuous parameters (written with ?):

[MoveFree(q0,?q1), Pick(cracker,?g,?q1), MoveHolding(cracker,?g,?q1,?q2), Place(cracker,?g,?p1,tray,?q2)]

Critically, the planner generates multiple skeletons. Short ones grab the cracker directly. Longer ones first move the obstructing soda can. The planner doesn't know yet which is feasible — that's decided by optimization.

Step 2 — Particles: many guesses at once

For each skeleton, cuTAMP samples a big batch of particles — each particle is one complete guess for all the unbound parameters: a specific grasp pose (from M2T2 or the heuristic sampler), a placement pose on the tray, and robot configurations via inverse kinematics. Most initial particles are infeasible — they collide, or the placement is unstable, or no IK solution exists.

Step 3 — Differentiable optimization

Here's the magic. Each constraint becomes a differentiable cost: collision penetration depth, placement instability, kinematic infeasibility. cuTAMP runs gradient descent on all particles simultaneously on the GPU, nudging each guess toward satisfying every constraint. The total cost for a particle is roughly:

C = wcol·Ccollision + wstab·Cstability + wkin·Ckinematics

where each C is ≥0 and equals 0 only when that constraint is satisfied. A particle is feasible when C→0. Skeletons are ranked by how easily their particles reach C=0; the first to get enough feasible particles wins. If the "grab cracker directly" skeleton can't drive C to zero (the can always collides), cuTAMP abandons it for the "move can first" skeleton.

Why thousands of particles instead of one clever search? Sampling-based TAMP (like PDDLStream) tries one configuration, checks it, backtracks. That's serial and slow. cuTAMP exploits the GPU: a thousand parallel particles is a thousand parallel hypotheses, and gradient descent refines them all at once. This is why TiPToP plans in ~7–20 seconds where classical TAMP could take minutes.

Step 4 — Motion planning fills the trajectories

For each feasible particle, cuTAMP calls cuRobo (a GPU motion planner) to solve the remaining trajectory parameters — collision-free, time-parameterized paths between configurations. Output: the final {(qt, q̇t, gt)}.

The SHOWCASE: watch particles converge

Below is cuTAMP's core loop made interactive. Each dot is a particle — a candidate placement pose for an object. Red = high cost (colliding or unstable), green = feasible (C→0). Press Optimize to run gradient descent; particles flow toward the valid region (the tray, away from the obstacle). Add the obstacle to see particles forced to a different valid zone. This is exactly how "move the can first" emerges from "grab directly" failing.

cuTAMP particle optimization (the paper's core method)

Click Optimize. Watch red (infeasible) particles flow to green (feasible) zones.

The cost function in code

# cuTAMP, in spirit: optimize a BATCH of particles in parallel
# Each particle = one candidate (grasp, placement, config).
import torch

def total_cost(place_xy, obstacle_xy, tray_center, tray_r):
    # place_xy: [N, 2] batch of candidate placement poses
    # 1) stay inside the tray (stability/goal)
    d_tray = (place_xy - tray_center).norm(dim=1)
    c_goal = torch.relu(d_tray - tray_r) ** 2
    # 2) avoid the obstacle (collision penetration)
    d_obs  = (place_xy - obstacle_xy).norm(dim=1)
    c_col  = torch.relu(0.12 - d_obs) ** 2   # penalize if too close
    return 1.0*c_goal + 3.0*c_col          # weighted sum, all ≥0

place = torch.rand(64, 2, requires_grad=True)  # 64 particles
opt = torch.optim.Adam([place], lr=0.02)
for step in range(100):
    cost = total_cost(place, obs, tray_c, tray_r).sum()
    opt.zero_grad(); cost.backward(); opt.step()  # all particles, one step
feasible = total_cost(place, obs, tray_c, tray_r) < 1e-4  # C → 0
How does cuTAMP decide that a plan skeleton requiring "move the can first" is needed?

Chapter 7: The Execution Module

The planner produced a perfect trajectory. But a plan is only as good as the controller that tracks it. TiPToP's planner assumes the robot's joints follow the plan exactly — and even sub-centimeter tracking error makes a grasp miss or a placement topple.

Why off-the-shelf controllers weren't enough

The authors found existing open-source controllers (including DROID's default Polymetis) couldn't track timed trajectories precisely enough. So they wrote their own joint impedance controller for the Franka arms. At every control timestep it computes joint torques:

τ = Kp ⊙ (qd − q) + Kd ⊙ (q̇d − q̇) + τcoriolis + τg + M·q̈d

Decoding every term — this is a PD controller plus physics feed-forward:

The intuition. The PD terms (first two) are reactive — they correct error after it appears. The feed-forward terms (last three) are predictive — they cancel known physics so the PD terms have almost nothing to do. Good feed-forward means tiny errors; the paper reports up to ~5 mm at high speed. Remove gravity comp and the arm droops centimeters — and the grasp misses.

Open-loop, by design

Once execution starts, TiPToP does not look again. No re-perception, no replanning. This works when the world is static and tracking is tight. It fails when an object moves unexpectedly or a grasp slips — there is no mechanism to notice and retry. This single design choice is the root of the dominant failure mode (Chapter 9).

Impedance tracking: feed-forward vs PD-only

Dashed = desired trajectory. Solid = actual. Watch tracking error with vs without feed-forward.

What is the role of the τg (gravity compensation) term?

Chapter 8: The Experiments

The claim is bold — zero-data TiPToP matches a 350-hour VLA — so the evidence has to be careful. The authors ran 165 trials across 28 scenes, in simulation, on their own DROID hardware, and (crucially) on an external team's DROID setup they'd never touched.

Four task categories

The headline numbers

Toggle the categories below and watch the gap open as tasks get harder. On simple tasks they're roughly tied. On everything requiring reasoning, TiPToP pulls ahead — and on semantic tasks π0.5-DROID often scores zero.

Success rate by category: TiPToP vs π0.5-DROID

Overall: TiPToP 98/165 (74.6% progress) vs π0.5-DROID 55/165 (52.4%).

Speed, too

TiPToP isn't just more accurate — it's usually faster. It plans one time-optimal trajectory and executes it; the VLA runs a reactive loop that idles and re-attempts. On can → mug: 18.6 s vs 41.0 s. On single-step real tasks, TiPToP finishes in ~15 s, roughly half the VLA's time. Of that, planning (perception + cuTAMP) is ~7–20 s.

Why the gap WIDENS with difficulty. Read this as the paper's thesis vindicated. Simple tasks don't need reasoning, so a reactive policy keeps up. But distractors need grounding (TiPToP's VLM), semantics need reasoning (the symbolic goal), and multi-step needs sequencing (TAMP's skeletons). Each is an explicit module in TiPToP and an implicit hope in a VLA. The harder the task, the more an explicit structure pays off.

Cross-embodiment: the modularity payoff

Because nothing is trained, moving to a new robot is config, not data. Deploying on a UR5e took "a few hours": provide the URDF, generate collision spheres, write a cuRobo config, implement camera/controller interfaces. It also ran on a Trossen WidowX AI. And extending to a new skill (whiteboard wiping) took under a day — two new predicates, one new TAMP operator, a small wiping controller — touching zero existing perception/execution code.

In which task category does TiPToP show the largest advantage over π0.5-DROID?

Chapter 9: Failure Analysis — Modularity's Real Payoff

Here's where modularity earns its keep. The authors ran 173 extra trials and traced every failure to a specific module. A VLA can't do this — failures are a single opaque blob. TiPToP turns "the robot failed" into "module X failed," which turns into "swap a better X."

Where 55 failures came from

Hover the bars: grasping dominates, and it traces straight back to the open-loop design choice from Chapter 7.

Failure breakdown across 55 failures (of 173 trials)

Grasping is the bottleneck — and most grasp failures are recoverable with a retry the open-loop system can't do.

The four failure modes, decoded

FailureCountRoot causeModular fix
Grasping31/55M2T2 grasp looks good, fails in execution; or heuristic fallback is weak; no retry (open-loop)Better grasp model; closed-loop re-perception
Scene completion13/55Convex hull over/under-approximates (the banana) → collisionsLearned shape completion (SAM-3D)
VLM errors6/55Gemini mis-detects or wrong bounding boxBetter VLM (drops in directly)
cuTAMP5/55No feasible plan within time budget (cluttered)More planning attempts; relax thresholds

The complementary failure finding

The paper's most important sentence. TiPToP and π0.5-DROID "fail in complementary ways." TiPToP excels at geometric reasoning, sequencing, and semantic grounding — but breaks when grasps slip or meshes are wrong, because it can't react. π0.5-DROID is the reverse: its closed-loop reactivity recovers slipped grasps (5/5 on red-cubes where TiPToP got 1/5), but it can't handle multi-step structure or distractors. The natural next step: use a VLA as a reactive skill primitive inside TiPToP — closed-loop grasping where it shines, explicit planning where the planner shines.

The single biggest limitation

Open-loop execution. Over half of all failures are grasps that a simple retry would fix — but the system commits to one trajectory and never looks again. The most direct improvement: re-run perception and planning after each pick-and-place step. The honest framing here is itself a lesson: a clean modular architecture lets you name your single biggest weakness with a number.

Why can TiPToP produce a module-level failure breakdown when a VLA cannot?

Chapter 10: Connections & Cheat Sheet

TiPToP sits at the seam of two research traditions. Its real contribution is less a new algorithm than a demonstration: foundation models have made modular, training-free manipulation competitive with end-to-end learning. That reframes the field.

Where it connects

The cheat sheet

Symbol / termMeans
o0 = (Ileft, Iright)The single stereo image pair captured at t=0
pworld = TeeworldTcameepcamUnprojection: camera 3D point → world frame via FK + calibration
G = On(a,b) ∧ ...Symbolic goal: conjunction of predicates from the VLM
Plan skeletonAction sequence with unbound continuous params (?g, ?p, ?q, ?τ)
ParticleOne complete guess for all continuous params; thousands optimized in parallel
C = Σ w·CconstraintDifferentiable cost; particle feasible when C→0
τ = KpΔq + KdΔq̇ + τg + τcor + Mq̈dImpedance control law: PD + physics feed-forward
Open-loopPlan once, execute without re-observing — TiPToP's defining choice (and weakness)

The one idea to keep

What I cannot trace, I cannot debug. The deepest lesson isn't about robots — it's about systems. A monolithic learned policy hides its reasoning; when it fails you can only collect more data and pray. A modular composition of frozen experts exposes every seam: you can measure which stage fails, swap the weakest part, and improve like software. TiPToP's competitiveness with a 350-hour VLA is the evidence that — for now — composability beats scale, when the composable parts are foundation models.

Try it yourself

Re-run the cuTAMP showcase (Chapter 6) with the obstacle toggled on and off. Notice: with the obstacle, some particles can never reach the tray without colliding — exactly the moment cuTAMP gives up on the direct skeleton and reaches for the "move the obstacle first" plan. You've just watched task-and-motion planning happen.

What is TiPToP's core contribution to the field?