LaValle, Chapter 14

Sampling Under Differential Constraints

Extending RRT and PRM to robots with real physics — systems where you can’t steer between two states with a straight line, you must integrate dynamics forward in time.

Prerequisites: Chapter 5 (RRT/PRM) + Chapter 13 (differential models, &ẋ; = f(x,u)). That’s it.
10
Chapters
5+
Simulations
10
Quizzes

Chapter 0: You Can’t Just Connect the Dots

In Chapter 5, the RRT extended toward a random sample by drawing a straight line in C-space and stepping along it. Clean. Elegant. But what does “a straight line in C-space” mean for a car?

A car at position (0, 0) heading north can’t move sideways to (1, 0). It has to arc there — turn right, drive forward, possibly reverse. The straight line between the two configurations passes through states the car cannot physically occupy during the transition. The car’s differential constraint — the no-slip condition that rules out sideways motion — makes straight-line interpolation in C-space physically meaningless.

This is the core problem of Chapter 14: RRT and PRM assumed we could connect any two nearby states with a feasible local path. Once differential constraints enter the picture, that assumption breaks. We need a fundamentally different way to extend our tree — one that respects the physics.

Straight Line vs. Feasible Arc: Why They Diverge

The teal point is a car at the origin facing up (θ = 90°). The orange point is a goal configuration. The red dashed line is the straight-line C-space interpolation — it passes through orientations the car can’t reach continuously. The green arc is a true feasible trajectory obtained by integrating &ẋ; = f(x,u). Click “New Goal” to see different examples.

The red path is geometrically shorter but physically impossible.
The fundamental gap. Chapter 5’s RRT works in any metric space where straight-line interpolation gives a feasible local path. The moment your system has differential constraints — a car, a drone with inertia, a robot arm with joint-velocity limits — straight-line interpolation is no longer feasible. Chapter 14 patches this gap by replacing “step toward sample along a line” with “apply a control and integrate the ODE forward.”

The two-sentence summary of Chapter 14

Everything in this chapter follows from one insight: instead of interpolating between states, simulate forward. Pick a random state, find the nearest tree node, apply a control input for a short duration Δt, integrate &ẋ; = f(x, u) to get a new state, add it to the tree. That’s kinodynamic planning in two sentences.

Why does straight-line interpolation in configuration space fail for a car-like robot?

Chapter 1: State Space — Phase Space Extends C-Space

Chapter 4 gave us C-space: every configuration q of the robot is a point, and Cfree is the navigable region. But for a dynamical system like a drone or a car with nonzero mass, knowing where the robot is isn’t enough. You also need to know how fast it’s going. Without velocity, you can’t predict the future.

The state space X is C-space extended with its derivatives. For a unicycle with configuration q = (px, py, θ), the state is still just x = q — configuration is enough because the controls directly set velocity (first-order system). But for a car with mass, the state is x = (px, py, θ, v) where v is the current speed — because the control (throttle) changes acceleration, not velocity directly. And for a robot arm, the state is x = (q, q̇) — joint angles and joint velocities — because torque changes acceleration.

X = C × Ċ     (second-order systems: position + velocity)
X = C              (first-order systems: position only)
Why velocity matters. Imagine a ball rolling toward a wall at 10 m/s versus 1 m/s. Their positions are identical but they are in very different states — the first will crash, the second can stop. Two states with the same configuration but different velocities have completely different reachable futures. The planner must track both.

State space obstacle region

When we extend to state space, the obstacle region Xobs grows. In C-space, we had Cobs — configurations where the robot collides. In state space, Xobs includes not only colliding configurations but also any state from which collision is unavoidable regardless of control input. A car heading at a wall at 100 m/s with only 10 m to stop is in Xobs even though it isn’t touching the wall yet.

ConceptC-space versionState-space version
Free spaceCfree: no collisionXfree: no collision AND stopping possible
ObstacleCobs: robot intersects obstacleXobs: collision unavoidable from this state
StateConfiguration q onlyx = (q, q̇) for second-order systems
Dimensionn (degrees of freedom)2n for second-order, n for first-order

This larger dimension is both the challenge and the reason we need sampling. Combinatorial planners that work in 3D C-space become intractable in 6D state space. Sampling-based methods scale gracefully — the fundamental RRT loop works the same whether the space is 3D or 12D.

First-order vs second-order systems. A first-order system has &ẋ; = f(x, u) where control directly sets velocity — the unicycle, a robot controlled by joint velocities. A second-order system has &ẍ; = f(x, ẋ, u) where control sets acceleration (force or torque) — an aircraft, a car with inertia. Second-order systems require the full phase-space state x = (q, q̇).
A quadrotor drone is described by position (x, y, z) and attitude (φ, θ, ψ). Its motors produce forces and torques (not velocities). What is the dimension of its state space for planning purposes?

Chapter 2: Reachability — Where Can You Go from Here?

From a state x, applying control u for duration Δt produces a new state. The set of all states reachable from x in exactly Δt is the reachable set R(x, Δt). It is the analog of “the disk of radius vΔt around x” from Chapter 5, but shaped by dynamics rather than geometry.

For a unicycle (first-order, unconstrained in v and ω), R(x, Δt) looks like a disk — similar to the unconstrained particle. But for a car with a maximum steering angle δmax and bounded speed [−vmax, vmax], the reachable set is a curved banana shape: it extends forward and backward, can arc left or right, but cannot point sideways.

Reachable Set: Car vs. Free Particle

Both start at the center heading right. Blue dots are the reachable set of a free particle (any direction). Orange dots are the reachable set of a car with max steering angle 35° and forward/backward speed ≤ 1. Use the slider to change Δt and watch the shapes evolve.

Δt 0.8s
The car’s reachable set is not a disk — it’s shaped by steering limits.

Forward and backward reachability

The forward reachable set from x at time t is the set of all states you can reach from x in time t. Planning asks: does the goal state lie in the forward reachable set of the start? Equivalently, we can ask about the backward reachable set of the goal: all states from which the goal can be reached. A feasible plan exists if and only if these two sets intersect.

Rforward(xinit, t) ∩ Rbackward(xgoal, t) ≠ ∅  ⇒  plan exists

Computing these sets exactly is intractable for most systems. Sampling-based planning avoids this: instead of computing R(x, Δt) analytically, the RRT samples from it by picking a random control u and integrating forward. The samples approximate the reachable set without needing its closed form.

Key fact from LaValle Section 14.1: For a system &ẋ; = f(x, u) where f is Lipschitz continuous in x and measurable in u, the reachable set from any state x is a compact, connected set in X. This guarantees that small control perturbations produce small state perturbations — the physics is well-behaved enough for sampling to work.
Why do sampling-based planners sample from the reachable set rather than computing it exactly?

Chapter 3: Kinodynamic Planning — RRT with Forward Simulation

Kinodynamic planning is the marriage of kinematics (where the robot is) and dynamics (how fast it’s moving) in a single planning problem. The term was coined by Donald, Xavier, Canny, and Reif in 1993. The goal: find a trajectory x(t) and control sequence u(t) that steers the robot from xinit to a neighborhood of xgoal while satisfying &ẋ; = f(x,u), staying in Xfree, and respecting control bounds U.

The critical algorithmic change from Chapter 5 RRT to kinodynamic RRT is the extend step. In Ch 5:

# Ch 5 RRT extend (C-space, no dynamics)
def extend(tree, x_rand):
    x_near = nearest(tree, x_rand)
    direction = x_rand - x_near
    x_new = x_near + step_size * direction / norm(direction)  # straight line
    if collision_free(x_near, x_new):
        tree.add(x_new, parent=x_near)

In kinodynamic RRT:

# Ch 14 Kinodynamic RRT extend (state space, dynamics)
def extend(tree, x_rand):
    x_near = nearest(tree, x_rand)       # find nearest in state space
    u = sample_control(U)                 # pick a random control
    x_new = simulate(x_near, u, dt)       # integrate ODE forward dt seconds
    if collision_free(x_near, x_new):       # check state-space path segment
        tree.add(x_new, parent=x_near, control=u, duration=dt)

The simulate(x, u, dt) call integrates &ẋ; = f(x, u) for duration Δt using Euler integration (or Runge-Kutta for accuracy). The result is a state that is physically reachable from xnear by applying control u. No straight-line extrapolation, no approximate interpolation — actual physics.

The nearest-neighbor problem in state space

Finding the nearest node in state space requires a metric. This is subtler than it sounds. State space mixes position (meters) with velocity (m/s) with angle (radians). Naively computing Euclidean distance in the combined space gives nonsensical results because the units don’t match.

d(x1, x2) = √(∑i wi(x1,i − x2,i)2)

The weights wi normalize dimensions: typically divide each component by its maximum range. For a car with position in [0, 10]m and speed in [−2, 2]m/s: wx = 1/10, wv = 1/4. Angle components need special handling for wraparound (θ and θ + 2π are the same configuration).

The select-and-simulate pattern. In kinodynamic RRT, the nearest-neighbor call serves a different purpose than in Ch 5. There, we needed the nearest node so we could walk toward xrand along a straight line. Here, we need the nearest node so we have a starting state for simulation — we don’t necessarily end up near xrand at all. The random sample biases which tree node we grow from, but where we grow to is determined by the control we sample.
Sample xrand in X
Uniform or biased toward goal
Find xnear
Nearest node in tree, using weighted state-space metric
Sample control u ∈ U
Random from control bounds (or try several, pick best)
Simulate xnew = φ(xnear, u, Δt)
Integrate ODE &ẋ; = f(x, u) for duration Δt
Check feasibility
Is segment from xnear to xnew in Xfree? If yes, add to tree
↻ repeat until goal reached or budget exceeded
In kinodynamic RRT, after finding xnear, what is the next step that replaces the Ch 5 “step along straight line” operation?

Chapter 4: Showcase — Car-Like RRT with Steering Limits

This is the payoff. Watch a kinodynamic RRT build a tree for a car-like robot with bounded steering angle. The car’s state is x = (px, py, θ) and its differential equation is the standard bicycle model:

x = v cosθ     ṗy = v sinθ     θ̇ = (v / L) tan(δ)

where v is speed (fixed at 1 m/s here), L is wheelbase (1 m), and δ ∈ [−35°, 35°] is the steering angle — the only control. The car can’t steer more sharply than 35°; this is the physical constraint that makes planning nontrivial.

Kinodynamic RRT — Car with Steering Limits

Teal circle = start (heading right). Orange circle = goal region. Blue arcs = tree edges (each a short simulated trajectory). Gray rectangles are obstacles. Press Step to add one node, Run to run continuously, Reset to start over. Notice how the tree grows in smooth curves — never straight sideways jumps.

Speed 5 steps/tick
0 nodes — press Step or Run
What to notice. The tree edges are smooth circular arcs — each is a 0.4 second simulation of the bicycle model with a randomly chosen steering angle. The tree fills state space by growing outward in all arc directions the car can take. It finds the goal region by chance, not by heuristic guidance. Once found, the path (highlighted in green) is a sequence of arcs that the physical car can actually execute.

The tree here is small for clarity. In real kinodynamic RRT, the planner runs 10,000–100,000 iterations. Even so, it typically solves car parking problems in under a second on modern hardware because each iteration is just an ODE integration step — no matrix inversions, no solvers, no optimization.

In the car RRT above, each tree edge is a smooth arc rather than a straight line because:

Chapter 5: Feedback Control Under Differential Constraints

Open-loop RRT outputs a sequence of controls (u1, u2, ..., uN). Execute them in order and, in simulation, you reach the goal. But real robots have noise, model errors, and disturbances. By the time you execute control u50, the accumulated error means you’re no longer on the planned trajectory — and the open-loop plan can’t recover.

Feedback control closes the loop: instead of pre-computing a fixed control sequence, the robot continuously measures its state x(t) and chooses the control u based on x(t). A feedback policy π: X → U maps current state to control. The trajectory is whatever x(t) the ODE &ẋ; = f(x, π(x)) produces under this policy.

Open-loop:   u(t) = uk   (pre-computed schedule)
Closed-loop: u(t) = π(x(t))   (state-dependent policy)

Lyapunov stability: will the robot converge?

For a feedback policy to be useful, the system must converge to the goal. A Lyapunov function V(x) proves convergence without solving the ODE explicitly. Think of V(x) as the “potential energy” of the system — if we can show V(x) decreases along every trajectory (V̇(x) < 0), then the system must eventually reach the minimum of V, which we place at the goal.

V(xgoal) = 0    V(x) > 0   ∀ x ≠ xgoal
V̇(x) = ∇V(x) · f(x, π(x)) < 0   ⇒   x → xgoal

For a car, finding such a V is hard because the car can’t move sideways: a simple quadratic V = |x − xgoal|2 won’t work (the gradient often points sideways). Designing stabilizing feedback for nonholonomic systems is an active research area — Brockett’s theorem shows that smooth time-invariant feedback controllers cannot stabilize some nonholonomic systems.

Brockett’s obstruction (1983). A smooth, time-invariant feedback policy π(x) cannot stabilize a system satisfying the Lie algebra rank condition if the image of f(x, ·) doesn’t span X near xgoal. The unicycle and car both satisfy this condition. This doesn’t mean stabilization is impossible — it means you need either time-varying feedback, discontinuous feedback, or hybrid strategies (like using a planner to reset). LaValle calls this the “feedback under differential constraints” problem.

RRT-based feedback: iterative replanning

One practical workaround: run kinodynamic RRT as a feedback policy. Measure the current state x(t), run RRT from x(t) to xgoal, execute the first few controls of the resulting plan, measure again, replan. This is receding-horizon planning or model-predictive control (MPC) applied to RRT. It provides implicit closed-loop behavior: each replan compensates for drift since the last plan.

Open-Loop vs Closed-Loop Under Noise

A unicycle robot must reach the orange goal. Blue trajectory: open-loop (follows pre-computed controls, no corrections). Green trajectory: closed-loop (replan every 0.5s). Use the noise slider to add Gaussian noise to the dynamics and watch the difference.

Noise σ 0.10
Higher noise = open-loop fails; closed-loop corrects
Brockett’s theorem implies that for a car-like robot (nonholonomic), a smooth time-invariant feedback policy π(x) cannot achieve what?

Chapter 6: Decoupled Approaches — Plan Path, Then Add Time

Kinodynamic planning in the full state space is powerful but expensive. A simpler strategy: decouple the problem into two stages. First, find a geometric path in C-space using a fast planner (Ch 5 RRT, ignoring dynamics). Second, find a time-scaling — a function s(t) that converts the geometric path into a time-parameterized trajectory that satisfies dynamics and control bounds.

Formally, if the geometric path is q(σ) for σ ∈ [0, 1], the time-scaled trajectory is q(s(t)). The velocity along the path at time t is q̇(t) = (dq/dσ) · ṡ(t). The acceleration is q̈(t) = (dq/dσ) · s̈(t) + (d2q/dσ2) · ṡ(t)2. Both must stay within joint velocity and torque limits.

q(t) = q(s(t))     ṡ(t) = path speed
|ṡ(t)| ≤ vmax     |s̈(t)| ≤ amax

Time-optimal time scaling

Given a fixed geometric path, the time-optimal time scaling finds s(t) that traverses the path as fast as possible subject to dynamics limits. Bobrow (1985) and Shin & McKay (1985) solved this with a phase-plane approach: plot (s, ṡ) and find the limiting velocity curve, then bang-bang control the acceleration to stay below it.

Phase-Plane Time Scaling for a Robot Path

Horizontal axis: path progress s ∈ [0,1]. Vertical axis: path speed ṡ. The orange curve is the maximum speed at each path location (velocity limit from joint constraints). The green curve is the time-optimal trajectory — bang-bang between max acceleration and max deceleration. Drag the “accel limit” slider to see how tighter limits slow the traverse.

Accel limit 1.5 m/s²
Green = time-optimal traverse. Area under green curve = total travel time.

When decoupling fails

Decoupling works well for robot arms where any path in C-space is geometrically feasible and only dynamics limits constrain the time-scaling. It fails for:

Failure modeExampleWhy it fails
Nonholonomic systemsCar, unicycleGeometric path in C-space may require sideways motion that violates differential constraints — no valid time-scaling exists
Underactuated systemsPendulum, brachiation robotSystem has fewer controls than DOF; can’t independently command each direction along the path
Dynamic obstaclesPassing pedestriansTime-scaling changes when along the path, which can create new collisions with moving obstacles
When to use decoupling. Decoupling is the right choice for fully-actuated robots (arms, grippers) operating in static environments. It’s fast, produces smooth trajectories, and time-optimal scaling is well-understood. For cars, drones, legged robots, or environments with moving obstacles, use kinodynamic planning directly in state space.
Why does the decoupled approach (plan path first, then time-scale) fail for a car-like robot?

Chapter 7: Trajectory Optimization — Gradient-Based Refinement

Sampling-based planning finds a feasible trajectory, not necessarily a good one. The kinodynamic RRT tree grows randomly — the solution path is whatever sequence of arcs happened to reach the goal. It may be jerky, unnecessarily long, and far from time-optimal. Trajectory optimization takes such an initial solution and improves it by minimizing a cost functional.

The canonical trajectory optimization problem: find a trajectory x(t) and controls u(t) over t ∈ [0, T] that minimizes:

J = ∫0T ℓ(x(t), u(t)) dt + φ(x(T))

subject to &ẋ; = f(x, u), x(0) = xinit, x(T) ∈ Xgoal, x(t) ∈ Xfree, u(t) ∈ U. Here ℓ is the running cost (energy, time, jerk), φ is the terminal cost (distance to goal), and the constraints couple everything together.

CHOMP: gradient descent on trajectory space

CHOMP (Covariant Hamiltonian Optimization for Motion Planning, Ratliff et al. 2009) treats the entire trajectory as a single high-dimensional parameter vector and does gradient descent. Each trajectory segment is a vertex in a discrete graph; CHOMP simultaneously pushes all vertices away from obstacles and toward smoothness.

The CHOMP objective has two terms:

U[ξ] = λ · Uobs[ξ] + Usmooth[ξ]

Uobs penalizes proximity to obstacles using a pre-computed signed distance field. Usmooth penalizes acceleration along the trajectory (∫ |q̈|2 dt). The gradient is taken in a Riemannian metric on trajectory space (the “covariant” in CHOMP), which ensures updates are in physically meaningful directions rather than arbitrary Euclidean gradient steps.

TrajOpt: sequential convex approximation

TrajOpt (Schulman et al. 2013) reformulates trajectory optimization as a sequence of convex programs. At each step, linearize the nonlinear constraints (collision, dynamics) around the current trajectory, solve the resulting quadratic program (QP) to get an update, repeat until convergence. TrajOpt handles hard collision avoidance constraints rather than soft penalties.

MethodApproachHandles hard constraints?Local minima?
CHOMPGradient descent on cost functionalOnly as soft penaltiesYes, can get stuck
TrajOptSequential convex programmingYes (collision as hard constraint)Yes, but less often
iLQRIterative LQR (second-order)Via barrier functionsYes, needs warm start
Kinodynamic RRT*Optimal sampling (asymptotic)Yes (tree only grows in Xfree)No (global optimum as n→∞)
The right role for trajectory optimization. Trajectory optimization is most powerful as a refinement step after a sampling planner finds a feasible solution. The sampling planner provides a warm start that avoids local minima from bad initialization; the optimizer then smooths and shortens the path. Using CHOMP or TrajOpt cold (from a straight-line initialization) often gets stuck in local minima in cluttered environments. This two-stage approach — sample then optimize — is the industry standard for robot arm planning.
Why is trajectory optimization typically used as a refinement step after a sampling planner, rather than from scratch?

Chapter 8: Practical Considerations

Textbook kinodynamic RRT works. Deployed kinodynamic planners that solve real problems require a handful of engineering decisions that the algorithm doesn’t specify. Here are the most critical ones.

ODE integration: Euler vs Runge-Kutta

The simplest integrator is Euler integration: x(t + Δt) ≈ x(t) + Δt · f(x(t), u). This accumulates error proportional to Δt. For a car at speed 1 m/s with Δt = 0.1 s, Euler error is O(0.01) per step — acceptable. For a quadrotor at high speed with fast attitude dynamics, Euler blows up unless Δt < 0.001 s, which makes each edge extremely short. Runge-Kutta 4 (RK4) gives fourth-order accuracy for only 4x more function evaluations:

def rk4_step(f, x, u, dt):
    k1 = f(x, u)
    k2 = f(x + dt/2 * k1, u)
    k3 = f(x + dt/2 * k2, u)
    k4 = f(x + dt * k3, u)
    return x + dt/6 * (k1 + 2*k2 + 2*k3 + k4)

RK4 allows 10x larger Δt than Euler for the same accuracy — far fewer, longer tree edges, which means faster coverage of state space.

Control sampling strategy

Uniform random sampling of u ∈ U is unbiased but inefficient. In practice, try multiple controls from xnear (say, 5 or 10 random samples) and keep the one that moves closest to xrand in state space. This is a greedy multi-sample extend — it doesn’t change the algorithm’s probabilistic completeness but dramatically improves growth speed.

Goal biasing

Pure uniform sampling grows a tree that fills all of X — which is thorough but slow. Standard RRT uses goal biasing: with probability pgoal (typically 5–10%), set xrand = xgoal directly. This biases tree growth toward the goal without abandoning exploration. Too high pgoal makes the planner greedy and poor at navigating around obstacles; too low makes it slow.

Bidirectional RRT

Grow two trees simultaneously: one from xinit and one from xgoal. On each iteration, grow one tree toward a random sample, then try to grow the other tree toward the newly added node. When the two trees get close enough to connect, the path is found. Bidirectional RRT typically solves problems 5–10x faster than single-tree RRT because both trees grow toward each other.

Performance rule of thumb (LaValle Section 14.5). For kinodynamic planning in ≤6D state space, kinodynamic RRT with RK4, 5 control samples per extend, 5% goal bias, and bidirectional growth typically finds solutions in under 1 second on modern hardware for workspaces with a few large obstacles. For 12D+ systems (quadrotors, dual arms), OMPL (Open Motion Planning Library) implementations routinely solve planning problems in 1–10 seconds using these strategies.

When to use which method

ScenarioBest approach
Holonomic robot arm, static environmentRRT or PRM in C-space + time-scaling
Car parking / steering with limitsKinodynamic RRT (bicycle model)
Drone with inertia, 12D stateKinodynamic RRT* or SSST in state space
Need smooth, high-quality trajectorySample first → CHOMP/TrajOpt refinement
Online replanning (MPC)Lightweight kinodynamic RRT in receding horizon
Known dynamics, small state spaceDynamic programming / HJB equation
Why does RK4 integration allow using a larger Δt than Euler integration?

Chapter 9: Connections — Where This Fits and What’s Next

Chapter 14 sits at the intersection of classical robotics and modern control theory. It takes the geometric planning tools from Chapters 4–7 and merges them with the differential systems of Chapter 13. Understanding this chapter is the bridge to everything in robot motion planning that involves real physics.

How Ch 14 builds on earlier chapters

Earlier chapterWhat Ch 14 inheritsHow Ch 14 extends it
Ch 5 (RRT/PRM)Tree growth loop, nearest-neighbor, sampling strategyReplaces straight-line extend with ODE simulation; planning in state space not C-space
Ch 13 (Differential Models)&ẋ; = f(x,u), unicycle model, phase spaceUses these models directly as the ODE to integrate in the extend step
Ch 8 (Feedback Planning)Stability, Lyapunov functions, feedback policiesIdentifies why smooth feedback fails for nonholonomic systems (Brockett)
Ch 10 (Sequential Decisions)Cost-to-go, Bellman principleTrajectory optimization (CHOMP, TrajOpt) minimizes similar cost functionals

Limitations of kinodynamic RRT

Where this connects to modern robotics

Motion planning for autonomous vehicles
Car manufacturers and research labs (Waymo, Apexx, MIT CSAIL) use kinodynamic planners for the low-level maneuver planning that respects steering limits, vehicle inertia, and jerk bounds. The bicycle model from Chapter 13 + kinodynamic RRT from Chapter 14 is literally in production code.

Drone and UAV planning
Quadrotors in cluttered environments (warehouses, disaster response) use kinodynamic planning in 12D state space. Research like RAPPIDS (Tordesillas et al.) uses sampling-based methods with receding-horizon replanning at 20 Hz, exactly the feedback-under-constraints architecture from Chapter 5 of this lesson.

Robot arm motion planning (MoveIt, OMPL)
ROS’s MoveIt planning framework uses OMPL, which implements kinodynamic RRT, RRT*, and KPIECE for robot arms. The decoupled approach (Chapter 6 of this lesson) is also available: plan path geometrically, then time-scale for joint velocity and torque limits.

Learned planners and neural RRT
Recent work replaces the random control sampling step with a learned policy that predicts which control to apply based on xnear and xrand. This is the connection between classical kinodynamic planning and deep reinforcement learning: the RL policy learns to be a better “steering function” than random sampling.

Related Parminces lessons

This chapter connects directly to:

“The difficulty is not in finding the right answer; it is in formulating the right question.”
— Steven M. LaValle, Planning Algorithms, 2006
What distinguishes RRT* from basic RRT in the context of kinodynamic planning?