With rapid advances in robotics, autonomous navigation has become essential for mobile robots. The ROS Navigation Stack is the de facto open-source framework for building reliable, real-world navigation systems. It integrates perception, mapping, localization, path planning, and motion control into a unified pipeline.
This article breaks down the core components, working principles, configuration best practices, and common pitfalls of the ROS Navigation Stack to help engineers build stable autonomous robots.
Overview
The ROS Navigation Stack is a collection of coordinated packages that enable a robot to:
Localize itself on a map
Plan global paths to a goal
Avoid dynamic obstacles locally
Control motion safely
It relies on sensor inputs (LiDAR, depth cameras, wheel odometry, IMU) and outputs velocity commands to the robot base.
Core Components
- move_base
The central coordinator of the entire navigation system.
Manages the navigation state machine
Runs global and local planners
Triggers recovery behaviors when the robot is stuck
Exposes an Action interface for goal commands
Key states: PLANNING, CONTROLLING, CLEARING, RECOVERY. - AMCL (Adaptive Monte Carlo Localization)
AMCL uses particle filter localization to estimate the robot’s pose on a pre-built map.
Particle filter steps:
Initialize particles over a pose distribution
Predict motion using odometry
Weight particles by sensor likelihood (LiDAR scan matching)
Resample to keep high-confidence particles
Output the weighted average pose
AMCL is highly tunable:
min_particles / max_particles
laser_model_type
odom_model_type
update_min_d / update_min_a - costmap_2d
Costmaps represent the environment as a grid of “cost” values, indicating collision risk.
Two costmaps:
Global costmap: large-scale, slow-update, for path planning
Local costmap: small-scale, fast-update, for obstacle avoidance
Cost values:
0: free space
253: lethal obstacle
254: inscribed obstacle
255: circumscribed or unknown
Inflation expands obstacles by the robot radius plus safety margin, creating a gradient that guides planners away from hazards.
Costmaps use a layered architecture:
Static layer (pre-built map)
Obstacle layer (real-time sensor data)
Inflation layer
Custom semantic layers (optional) - Global Planners
Compute a long-range, collision-free path from start to goal.
Common implementations:
navfn: Dijkstra or A* with smoothing
global_planner: lighter, configurable A*
Key parameters:
allow_unknown: whether to traverse unmapped areas
planner_window_x/y: limits search range
default_tolerance: goal acceptance radius - Local Planners
Follow the global path while avoiding dynamic obstacles.
DWA (Dynamic Window Approach)
Samples feasible (v, ω) velocity pairs
Simulates short trajectories
Scores by path alignment, goal distance, obstacle cost, smoothness
Selects the highest-scoring velocity command
TEB (Timed Elastic Band)
Optimizes a sequence of poses with time constraints
Considers kinodynamic limits
Produces smoother, more accurate trajectories
Preferred for omni robots, narrow corridors, and precise docking
Typical Navigation Flow
Load map via map_server
Initialize AMCL localization
Send a 2D goal to move_base
Global planner computes a path
Local planner tracks the path and avoids obstacles
AMCL continuously corrects pose
Costmaps update with real-time obstacles
Recovery behaviors activate if stuck
Recovery Behaviors
When the robot fails to move or plans invalid trajectories:
clear_costmap_recovery: clears nearby obstacle data
rotate_recovery: spins to scan the environment
Move back slowly to escape dead ends
Common Issues & Debugging
Lost Localization (AMCL particle divergence)
Causes: poor odometry, symmetric environments, low particle count
Fixes: increase min_particles, improve calibration, use richer features
Planning Failures
Causes: goal inside obstacle, invalid map, allow_unknown=false
Fixes: verify goal validity, check costmap layers, adjust planner window
Oscillation or No Motion
Causes: oversized inflation radius, unresponsive sensors, bad TF
Fixes: tune inflation_radius, verify LiDAR topics and frames
Poor Path Tracking
Causes: unbalanced planner weights, loose goal tolerance
Fixes: increase pdist_scale and gdist_scale, tighten xy_goal_tolerance
Advanced Practices
Multi-floor navigation: switch maps via map_server services and reinitialize AMCL
SLAM + navigation: alternate between mapping (GMapping, Cartographer) and navigation
Custom costmap layers: add semantic costs (no-go zones, slope penalties, regions of interest)
Performance optimization: reduce costmap resolution, downsample point clouds, limit planner window
Conclusion
The ROS Navigation Stack is a powerful, modular foundation for autonomous robots. Mastering move_base, AMCL, costmap_2d, and planner tuning is critical to building stable systems.
Modern trends include learning-based planners, 3D costmaps, multi-robot coordination, and tighter integration with advanced SLAM systems. With careful tuning and customization, the ROS Navigation Stack can reliably operate in dynamic, real-world environments.