⚡ Autonomous · Motion Timing
Before this: Complete First 30 Minutes and have a working autonomous. This guide is about making an auton faster — you need an auton first.

Exit Conditions & Chained Movements

A move can end three ways. Choosing the right one for each move is the single biggest speed gain in a 15-second autonomous — often 1–2 seconds recovered, with no new hardware and no faster motors.

// Section 01
Why Exit Conditions Change Everything
When an autonomous move finishes, the simplest behavior is to wait for it to settle — reach the target, slow to a near-stop, confirm it has arrived, then move on. Safe and accurate. It is also the slowest thing you can do between moves.
⏱️
Settle — slowest
Wait for a full stop on target. Use for the final move and any precision move.
⏭️
Threshold exit — faster
Stop waiting at a distance/angle you choose. Hand off to the next action early.
⚡
Chained exit — fastest
Exit the instant the robot is nearly stopped. Moves flow together.
💡
The core insight: a robot does not need to fully stop between moves. It only needs to reach a point where starting the next move still produces an accurate result. An exit condition is simply the rule that defines where that handoff happens — and it is almost always much earlier than a full settle.

The Cost of Full Settle

Settling isn't free. Each settle spends time decelerating and confirming the stop — call it roughly 0.3–0.6 s per move on a typical drive. A 15-second routine with 6–8 moves can therefore burn 2–4 seconds just standing still between actions. That's time you could have spent scoring.

ℹ️
You don't remove settling everywhere — you remove it where precision isn't required. The skill is deciding, move by move, whether this move needs to land exactly (settle) or just needs to get close so the next move can take over (exit early).
// Section 02
Act Mid-Move — Threshold Exits
The simplest exit condition is a position threshold: stop waiting on the move once the robot has travelled a set distance (or turned a set angle), even though the move itself hasn't finished. The drive is still correcting toward its target — you've just stopped waiting for it.

Why You'd Want To

Two common reasons: to trigger a mechanism partway through a move, or to begin the next action before the endpoint. The classic case is deploying an intake on the way to a game element so it's already running when the robot arrives.

❌
Without a threshold
Drive 36″. Wait for the full stop. Then deploy intake — but the robot already coasted past the best pickup point.
✅
With a threshold
Drive 36″. At 28″, deploy intake while still rolling forward — open exactly when it reaches the element. Saves ~0.3–0.5 s per pickup.

The Pattern

DRIVE forward 36" // the drive keeps correcting toward 36" while the move is running: if distance_travelled >= 28": deploy intake // act now — robot is still moving stop waiting; move on // don't sit through the last 8"
🧠
Design note. A blocking move — one call that returns only after settling — can't be interrupted like this. Two clean ways to get the same effect: (1) split the move (drive 28″, deploy, drive the last 8″), or (2) run the move on a background task and watch the distance from your main loop. Which one's right depends on how your own drive code is built — another reason to understand it rather than treat it as a black box.
// Section 03
Chain With Momentum — Velocity Exits
The most powerful chaining tool is a velocity threshold: exit the move the instant the robot's speed drops below a small value — it's slowing down, nearly stopped, but hasn't fully settled — and start the next move immediately. The robot never comes to a complete stop between actions.

What Chaining Actually Does

Instead of waiting for the controller to confirm a settled stop, you watch the robot's velocity. The moment it's low enough, you hand off — often while a little momentum from the previous move is still carrying the robot. Moves flow into each other rather than stop-and-restart. The result looks smoother, moves faster, and scores more in 15 seconds.

run the DRIVE / TURN move while the move is running: if |velocity| < small_threshold: // slowing, about to stop stop waiting; start next move // momentum carries into it
⚠️
Chaining trades end-position accuracy for speed. The robot won't be perfectly placed at the end of a chained move — it'll be close. Use a full settle for moves that must land exactly (final scoring, end-game commit, dropping into a tight zone). Use a chained exit for transition moves where the next move's controller will clean up the small leftover error.
💡
That last point is the whole reason chaining stays accurate enough: every move runs its own correction. A chained move only has to get close, because the move after it starts correcting from wherever it actually ended up.
// Section 04
Swing Movements
A swing turn locks (or slows) one side of the drive and drives the other — like a gate on a hinge. For many routing situations it's meaningfully faster than a point turn, because the robot covers ground during the turn.
🔄
Point turn
Both sides drive opposite directions. The robot spins in place — fastest rotation, but it stays in the same spot. You still have to drive afterward.
⤵
Swing turn
One side locks, the other drives. The robot arcs through a curve, gaining ground as it rotates. Often faster for getting from A to B.

When Swing Beats Point

If the action after the turn needs you in a different place (not just a different heading at the same spot), a swing usually gets you there faster because it folds rotation and travel into one motion. Good cases: approaching a wall at an angle, arcing around a game element, or leaving a scoring zone toward the next pickup.

SWING turn to 90°, locking the LEFT side while the move is running: drive the RIGHT side; keep the LEFT side braked when heading reaches 90°: stop // the robot pivots about its left wheels, arcing forward as it turns
⚠️
A swing ends at a heading and a new position, so it's harder to predict than a point turn. Settle it (or threshold-exit it) deliberately, and measure the arc on the real field — the radius depends on your track width and speed.
// Section 05
A Complete Chained Route
Putting it together — a four-action routine, shown two ways: every move settling, versus the same route chained. Same path, same robot. The difference is entirely in the exit conditions.

The Route

Drive 30″ to a game element (intaking on the way), turn 90° to face the goal, drive 14″ to score, then swing back 70° to reach the AWP position.

Slow version — every move settles

// ~6.2 s total — ~1.5 s of it is settling DRIVE 30" ; SETTLE // 0.6s settle intake ON // only starts after the stop TURN 90° ; SETTLE // 0.5s settle DRIVE 14" ; SETTLE // 0.4s settle intake OFF; score SWING 70° ; SETTLE // final move — settle is correct here

Fast version — chained

// ~4.7 s total — same path, ~1.5 s saved intake ON // start it BEFORE the drive DRIVE 30" ; exit at velocity-threshold // flow into the turn TURN 90° ; exit at velocity-threshold // flow into the drive DRIVE 14" ; SETTLE // precision: this one scores intake OFF; score SWING 70° ; SETTLE // final move — land it
🎯
The pattern to remember: settle the moves that need to land exactly — the scoring move and the final move. Exit everything else early. Two moves settled, two chained, ~1.5 seconds back. Then measure on the real field and adjust which moves you trust to chain.
💡
Related: PID Tuning (so each move lands predictably in the first place), PID Diagnostics, and Autonomous Routine Builder.