EasyNavigation Logo
0.5.0
  • Build & Install
    • Install with APT (recommended)
    • Install from source
    • Other options
      • Install from Binaries
        • Release status
        • Install from binaries (APT, recommended)
        • Install via Pixi
        • Package availability
      • Real-time System Setup
      • Troubleshooting
        • Common problems
        • Uninstall / clean
        • Running the tests
  • Getting Started
    • Overview
    • Setting up
      • Sourcing the workspace
    • First run: the Simple stack
      • Launching the simulator
      • Launching EasyNav
      • Visualizing in RViz2
      • Sending navigation goals
    • Navigating with the Costmap stack
      • All in one launch file
    • Visualizing internal process with the TUI
    • Troubleshooting
    • Next steps
  • PlayGrounds
    • Installation
    • Real robots
      • Kobuki PlayGround
        • Launching EasyNav
        • Multirobot
        • Simulation only
        • Launch files
        • Package layout
      • Summit PlayGround
        • Launching EasyNav
        • Simulation only
        • Launch files
        • Building maps of a world
        • Package layout
      • TIAGo PlayGround
        • Launching EasyNav
        • Simulation only
        • Packages
      • Omni PlayGround
        • Launching EasyNav
        • Simulation only
        • Launch files
  • EasyNav Plugins
    • Supported ROS 2 versions
    • Repository overview
    • 🧭 Planners
    • ⚙️ Controllers
    • 🗺️ Maps Managers
    • 📍 Localizers
    • 🛟 Recoveries
    • Other plugins
    • License
  • HowTos and Practical Guides
    • 📘 Overview
    • Costmap Stack
      • Mapping with the Costmap Stack
        • Overview
        • Setup
        • Step-by-Step Instructions
        • Saving the map
      • Navigating with the Costmap Stack
        • Setup
        • Running it
        • The Parameter File
        • Adapting it to your robot
      • Global Localization and Kidnapping Recovery with MH-AMCL
        • How it works
        • Setup
        • Configuring the Localizer
        • Running the Simulation
        • Testing Global Localization and Kidnapping
        • Tuning
        • Notes
      • Using the Routes Maps Manager with Costmaps
        • 1) Creating routes
        • 2) Using the routes for navigation
      • Deploying EasyNav on a Real iCreate3 Robot
        • Setup
        • Hardware Setup
        • ROS 2 Setup on the Raspberry Pi
        • EasyNav Setup on the Raspberry Pi
        • Mapping
        • Navigation
        • Notes
    • NavMap + Bonxai Stack
      • Navigating with the NavMap + Bonxai Stack
        • Setup
        • The two scenarios
        • The parameter file
        • Building the maps
      • Building Bonxai and NavMap Maps from a Recorded ROSBag
        • Setup
        • Overview
        • 1. Align the Frames (world → map)
        • 2. Play the ROSBag
        • 3. Launch EasyNav with Bonxai and NavMap Maps Managers
        • 4. NavMap Build Parameters
        • 5. Visualize in RViz2
        • 6. Save the Maps
        • 7. Summary
    • Simple Stack
      • Mapping with SLAM Toolbox and EasyNav
        • Overview
        • Setup
        • Step-by-Step Instructions
        • Saving and Reusing the Map
        • Notes
      • Navigating with SimpleStack and EasyNav
        • Overview
        • Setup
        • The Parameter File
        • Running the Simulation
        • Notes
    • Controllers
      • SeReST Controller Fine-Tuning
        • Overview
        • Quick-Start Defaults
        • Core Concepts
        • Parameter-by-Parameter Guidance
        • Troubleshooting by Symptom
        • Recommended Tuning Order
        • FAQ
    • Behaviors
      • Patrolling Behavior
        • Overview
        • Setup
        • Waypoint Configuration
        • Launching Navigation
        • Running the Patrolling Behavior
        • Code Explanation (C++ Version)
        • Code Explanation (Python Version)
        • Notes
    • General
      • Multi-Robot Navigation with EasyNav
        • Overview
        • Setup
        • 1. Topic Naming and TF Management
        • 2. Launching in Simulation
        • 3. Example Parameters
        • Tips & Gotchas
      • ros2 easynav — EasyNav CLI Extensions
        • NAME
        • SYNOPSIS
        • DESCRIPTION
        • COMMANDS
        • OPTIONS (Common)
        • EXIT STATUS
        • EXAMPLES
        • SEE ALSO
      • Docker Setup with Zenoh Bridge (Cross-Distro)
        • Overview
        • Step 1: Building the Docker Image (Rolling)
        • Step 2: Preparing the Robot (Host)
        • Step 3: Running the Container
        • Step 4: Visualization from a Remote PC
      • Writing a Custom Perception Plugin
        • When do you need a custom perception plugin?
        • Setup
        • The PerceptionHandler interface
        • Walking through AltIMUPerceptionHandler
        • Registering the plugin
        • Using the plugin
        • Writing a plugin for a genuinely new message type
        • Notes
    • Deprecated
      • GridMap Mapping with LidarSLAM and EasyNav
        • Setup
        • Overview
        • 1. Start the Simulator
        • 2. Launch LidarSLAM
        • 3. Build the Map with Teleoperation
        • 4. Run the GridMap Builder (PointCloud → GridMap)
        • 5. Run the Gridmap Maps Manager
        • 6. Save the GridMap to Disk
      • Outdoor Navigation with GridMaps (Summit)
        • Overview
        • Setup
        • 1. Launch the Simulator
        • 2. Launch EasyNav with GridMap and LidarSLAM
        • 3. Commanding Navigation Goals
        • Notes
  • Developers Guide
    • Core Design and Architecture
      • Coordinate Frames (TF)
      • Robot Geometry
      • Velocity Output: Robot Limits, Mux and Smoother
      • Reconfiguring EasyNav at Runtime
      • NavState: The Shared Blackboard
      • Real-Time Execution Model
        • Frequencies: system cycles and components
    • How to use the NavState BlackBoard
      • Overview
      • Basic API
      • Examples from Plugins
      • Advanced Features
      • Best Practices
      • Conclusion
    • Sensor Input and Perception Handling
      • Sensor Configuration
      • Grouping sensors: group: is optional and changes visibility
      • Processing Point Perceptions
      • Operation Summary
      • Lazy operations, frames and collapse
        • filter(min_bounds, max_bounds, lazy_post_fuse)
        • collapse(collapse_dims, lazy)
      • Example: Updating a Map
      • Fused Visualization
      • Other Perception Types
      • Extending to Other Modalities
    • Sending Navigation Commands to EasyNav
      • Primary Method: /easynav_control Topic
        • Protocol Description
        • Using GoalManagerClient
      • Secondary Method: /goal_pose Topic
      • Conclusion
    • Recovery System
      • The Recovery Node
      • The Base Class: RecoveryManagerBase
      • Moving the Robot
      • System Actions
        • Controlled shutdown
        • Reconfiguration as a mitigation
      • Available Recovery Systems
        • DummyRecoveryManager
        • SimpleRecoveryManager
        • DiagnosticRecoveryManager
      • Writing a Recovery System
    • Safety
      • Summary
      • Overview
      • Stale and invalid commands
      • Configuration checks
      • Safety parameters and safety mode
      • Real-time cycle monitoring and heartbeat
      • Safety channel status
      • Data age
      • Memory locking
      • Configuration fingerprint
      • Fault injection
    • Overview
    • Further Reading
  • Migration Guide
    • What stays the same
    • Nav2 and EasyNav, piece by piece
    • Step 1: Install EasyNav
    • Step 2: Your map
    • Step 3: The parameter file
    • Step 4: Run it
    • Step 5: Send goals from your applications
      • Option A: the Nav2 bridge
      • Option B: GoalManagerClient
      • Option C: just a pose
    • Differences to keep in mind
    • Troubleshooting
    • Next steps
  • About and Contact
    • About
    • Contact
EasyNavigation
Edit
  • HowTos and Practical Guides
  • Navigating with the Costmap Stack

Navigating with the Costmap Stack

This HowTo shows how to perform navigation with the Costmap Stack in EasyNavigation (EasyNav): a costmap with obstacles and inflation, AMCL, A* and the Regulated Pure Pursuit controller. It is EasyNav’s reference configuration for indoor robots with a 2D lidar.

On this page

  • Setup

  • Running it

  • The Parameter File

  • Adapting it to your robot

Setup

Build EasyNav and the Kobuki PlayGround as described in Getting Started.

The PlayGround ships a map of its world (maps/home2.yaml). To navigate in your own map, create it first following Mapping with the Costmap Stack, or use an existing Nav2 map.

Running it

ros2 launch easynav_playground_kobuki easynav_costmap_rpp.launch.yaml

It starts Gazebo, the Kobuki, EasyNav with params/costmap.rpp.params.yaml and RViz2. In RViz2, use the “2D Goal Pose” tool to send navigation goals. You can disable the Gazebo GUI with gui:=false, and use your own parameter file with params_file:=/path/to/my.params.yaml.

The Parameter File

This is params/costmap.rpp.params.yaml of the Kobuki PlayGround:

  • The Costmap Maps Manager loads the map, adds the obstacles the sensors see (ObstaclesFilter) and inflates them (InflationFilter).

  • The Costmap Localizer, an AMCL over the costmap.

  • The Costmap Planner, an A* over the costmap that keeps paths away from obstacles (cost_factor) and replans continuously.

  • The Regulated Pure Pursuit controller, a port of Nav2’s.

  • The Diagnostic recovery system: a collision safety reflex and recoveries (see below).

controller_node:
  ros__parameters:
    use_sim_time: true
    robot_limits:
      max_linear_vel: 0.6
      min_linear_vel: -0.3
      max_angular_vel: 1.2
      max_linear_acc: 1.0
      max_linear_decel: 1.0
      max_angular_acc: 2.0
      max_angular_decel: 2.0
    controller_types: [rpp]
    rpp:
      rt_freq: 30.0
      plugin: easynav_regulated_pp_controller/RegulatedPurePursuitController
      safety_margin: 0.05
      use_dynamic_window: false
      allow_reversing: false
      lookahead_dist: 0.4
      min_lookahead_dist: 0.2
      max_lookahead_dist: 0.6
      lookahead_time: 1.2
      use_velocity_scaled_lookahead_dist: true
      use_rotate_to_heading: true
      rotate_to_heading_angular_vel: 1.0
      rotate_to_heading_min_angle: 0.785
      use_regulated_linear_velocity_scaling: true
      regulated_linear_scaling_min_radius: 0.9
      regulated_linear_scaling_min_speed: 0.15
      use_fixed_curvature_lookahead: false
      curvature_lookahead_dist: 1.0
      interpolate_curvature_after_goal: false
      use_obstacle_regulated_linear_velocity_scaling: true
      obstacle_scaling_dist: 0.4
      obstacle_scaling_gain: 0.8
      min_approach_linear_velocity: 0.05
      approach_velocity_scaling_dist: 0.6
      xy_goal_tolerance: 0.1
      yaw_goal_tolerance: 0.105

localizer_node:
  ros__parameters:
    use_sim_time: true
    localizer_types: [costmap]
    costmap:
      rt_freq: 50.0
      freq: 5.0
      reseed_freq: 1.0
      plugin: easynav_costmap_localizer/AMCLLocalizer
      num_particles: 100
      noise_translation: 0.05
      noise_rotation: 0.1
      noise_translation_to_rotation: 0.1
      initial_pose:
        x: 0.0
        y: 0.1
        yaw: 0.0
        std_dev_xy: 0.1
        std_dev_yaw: 0.01

maps_manager_node:
  ros__parameters:
    use_sim_time: true
    map_types: [costmap]
    costmap:
      freq: 10.0
      plugin: easynav_costmap_maps_manager/CostmapMapsManager
      package: easynav_playground_kobuki
      map_path_file: maps/home2.yaml
      filters: [obstacles, inflation]
      obstacles:
        plugin: easynav_costmap_maps_manager/CostmapMapsManager/ObstaclesFilter
      inflation:
        plugin: easynav_costmap_maps_manager/CostmapMapsManager/InflationFilter
        inflation_radius: 1.0
        cost_scaling_factor: 5.0

planner_node:
  ros__parameters:
    use_sim_time: true
    planner_types: [simple]
    simple:
      freq: 0.5
      plugin: easynav_costmap_planner/CostmapPlanner
      cost_factor: 10.0
      continuous_replan: true

sensors_node:
  ros__parameters:
    use_sim_time: true
    forget_time: 0.5
    sensors: [laser1]
    laser1:
      topic: scan_raw
      type: sensor_msgs/msg/LaserScan

system_node:
  ros__parameters:
    robot_geometry:
      radius: 0.178
      inscribed_radius: 0.178
      height: 0.5
    use_sim_time: true
    use_real_time: true
    position_tolerance: 0.3
    angle_tolerance: 0.15

The file ends with the recovery_node section, the Diagnostic recovery system:

  • a collision safety reflex, checked every control cycle, that brakes if the command would hit an obstacle;

  • evaluators that diagnose problems: no path to the goal, an obstacle too close, a robot that does not progress, a lost AMCL localization, or a miswired ROS graph;

  • mitigations that fix them, in priority order: retreat from the obstacle, rotate to relocalize, advance a little; terminate EasyNav on a miswired graph; wait for a human; and, as the last resort, cancel the mission.

See Recovery System and the easynav_diagnostic_recovery README for its parameters.

Adapting it to your robot

  • Map: set package and map_path_file (both are needed: the map is looked up in the share directory of package). It must be a YAML + image pair, as Nav2’s, not the Simple stack’s .map file.

  • Robot: system_node.robot_geometry (radius, inscribed radius and height) is shared by every component; controller_node.robot_limits holds the velocity and acceleration limits, enforced on every command.

  • Sensors: list your lidar under sensors_node.sensors with its topic and type.

  • Distance to obstacles: tune inflation_radius and cost_scaling_factor under the inflation filter, and cost_factor in the planner.

  • Other controllers: the Kobuki PlayGround has the same stack with MPPI, MPC and SeReST (see Kobuki PlayGround). Every plugin’s parameters are in its README (see EasyNav Plugins).


© Copyright 2026, Various.

EasyNav v:
Versions