Prediction is the part of the perception stack that most AMR developers underestimate until they're debugging why their robot keeps emergency-stopping in the middle of a busy aisle. The detection problem — knowing that an obstacle exists at a given 3D position — is mostly solved by a competent sensor fusion layer. The prediction problem — knowing where that obstacle will be in 0.5 seconds — is where AMR performance in populated environments actually breaks down.
This post covers what we observed building PathVynt's prediction module, specifically for the warehouse AMR context where you have two predominant agent classes: wheeled industrial vehicles (forklifts, pallet jacks, tuggers) and pedestrians. These two agent classes require different prediction models, and misapplying one to the other introduces systematic error that expresses itself as either unnecessary emergency stops or missed risk assessments.
CVTR for wheeled agents
Forklifts and pallet jacks are kinematically constrained. A loaded forklift turning through a warehouse aisle intersection follows a circular arc determined by its wheelbase, load weight, and current speed. The CVTR (Constant Velocity Turn Rate) model captures this: given the last N frames of tracked centroid positions, estimate the current angular rate and propagate forward assuming that rate and speed remain constant.
CVTR fails when the agent accelerates or decelerates significantly, or when it reverses. In a warehouse, forklift deceleration before a turn is the most common failure case. The model predicts the forklift continuing at approach speed through the turn, when the actual behavior is decelerate-stop-check-proceed. This causes the model to overestimate the forklift's future position range, inflating the risk score and causing the AMR to slow unnecessarily.
PathVynt's CVTR implementation mitigates this with a deceleration prior: we learned that forklifts in a warehouse setting decelerate at approximately 0.3–0.8 m/s² before turns, and we blend a deceleration branch into the prediction fan at the t+1.0s horizon. The blended model reduces false-positive risk events by roughly 35% on logged warehouse data compared to pure CVTR, without reducing sensitivity to actual collision-risk trajectories.
One limitation to document clearly: CVTR breaks down entirely when a forklift is reversing. Reversing is not uncommon — forklifts frequently back out of rack bays. The PathVynt predictor flags agents classified as "reversing" with a special REVERSING motion state and passes the risk computation to a simpler model: project the bounding box backward at the last measured velocity for 1.5 seconds with a wide lateral uncertainty band. This is conservative but correct — reversing forklifts have genuinely high positional uncertainty because they rely on mirrors and horns, not precise path execution.
Social force approximation for pedestrians
The full Helbing social force model is computationally expensive. At 20Hz update rate with 8–12 tracked pedestrians in a busy picking aisle, a full Helbing computation on a Jetson Orin NX 16GB consumes roughly 40% of a compute cycle on its own. That's not acceptable when the predictor is competing with the fusion engine and occupancy grid for SoC resources.
PathVynt uses a simplified pairwise repulsion model that preserves the social force model's most predictively useful insight — that pedestrians avoid walking into other pedestrians and walls — without the full multi-agent interaction tensor computation. Concretely:
- Each pedestrian's predicted trajectory is computed independently as a constant-velocity projection.
- A pairwise repulsion term is added for any pedestrian within 1.5m of the tracked agent, deflecting the predicted trajectory away from the collision vector.
- Wall-proximity terms are added for any mapped surface within 0.8m, which reproduces the wall-following behavior common near rack ends in narrow aisles.
In practice, this reduced model captures 80–85% of the variance in pedestrian trajectory over the 0.5s–1.0s prediction window — the safety-critical window for an AMR operating at 0.8–1.2 m/s. At the 2.0s horizon, accuracy drops significantly, which is expected: pedestrian intent over 2 seconds in an unstructured environment is genuinely hard to predict, and any model claiming high accuracy there is probably overfitted to a specific test environment.
How the models fail at narrow-corridor range
The most instructive failure mode in warehouse AMR deployments occurs in narrow corridors at close range — under 2m between the AMR and the tracked agent. At this range, both models degrade for different reasons:
CVTR degrades because the time horizon is too short relative to the tracked centroid history. With only 2–3 scan cycles at close range before potential contact, the turn rate estimate has high variance, and the resulting trajectory fan is very wide. The risk score becomes dominated by uncertainty rather than actual predicted position.
The social force approximation degrades because the repulsion terms are now operating in a regime where small position changes produce large direction changes. A pedestrian at 1.5m who steps slightly sideways is re-classified as "deflecting" in the next prediction cycle, causing the trajectory fan to oscillate rather than converge.
PathVynt addresses this by switching to a simpler model at ranges under 2m: instead of trajectory prediction, the system enters a proximity-alert mode where the agent's current velocity vector is projected forward 0.3 seconds and the risk score is computed directly from bounding box overlap probability. This is more conservative than the full prediction models but substantially more stable at close range. Your planner receives a clean signal — slow down — rather than a noisy risk score that could trigger alternating stop/go behavior.
Structuring your cost function for the output
PathVynt's predictor outputs a RiskScore struct with per-horizon values and the ID of the responsible obstacle. The common mistake in integrating this with a DWA or TEB planner is applying the risk scores additively — summing risk across all obstacles and all horizons into a single cost term. This creates a cost function that grows with crowd density rather than with actual collision proximity, causing the AMR to brake aggressively in any busy environment regardless of whether any individual agent is actually on a collision course.
The more effective approach: use the per-obstacle, per-horizon risk scores as separate cost terms applied to the predicted ego trajectory at that horizon. A trajectory that passes through a high-risk zone at t+0.5s is penalized heavily; one that passes through a moderate-risk zone at t+2.0s is penalized lightly. This lets the planner find trajectories that accept low-future-risk paths in exchange for near-term detours, which is exactly the navigation behavior warehouse operators want: "keep moving if you safely can, stop only if you actually need to."
Configuration for this integration is documented in the PathVynt ROS 2 integration guide, specifically the RiskScoreToNavCostTransform bridge node that translates PathVynt's output format into nav2-compatible costmap inflation.