How to Configure Navigation Strategies in DimOS: A* Planning and Frontier Exploration
DimOS provides two primary navigation strategies—Replanning A for goal-directed path planning and Wavefront Frontier Exploration for autonomous mapping—which you configure through GlobalConfig environment variables, module constructor parameters, and blueprint composition.*
DimOS (Dimensional OS) is an open-source robotics operating system that enables complex navigation behaviors for mobile robots. The framework ships with complementary navigation modules located in dimos/navigation/replanning_a_star/ and dimos/navigation/frontier_exploration/, allowing developers to switch between precise waypoint tracking and autonomous environment exploration. This guide demonstrates how to configure these navigation strategies using the three-layer configuration system found in dimos/core/global_config.py and the blueprint composition API.
Understanding the Two Navigation Strategies
DimOS implements navigation as modular components that expose LCM/RPC interfaces. You can enable either strategy individually or compose them together in a single blueprint.
Replanning A* Planner
The Replanning A* strategy, implemented in dimos/navigation/replanning_a_star/module.py, provides fast, width-aware path planning on a gradient costmap. It continuously replans whenever the robot deviates from the path, becomes stuck, or receives a new goal. This strategy is ideal for goal-directed navigation where you need the robot to travel to specific waypoints or follow predetermined paths.
Key implementation details reside in dimos/navigation/replanning_a_star/global_planner.py, which handles the low-level path generation, safe-goal search, and replanning logic.
Wavefront Frontier Exploration
The Wavefront Frontier Exploration strategy, found in dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py, enables autonomous mapping of unknown environments. It detects frontier cells—boundaries between known free space and unknown areas—in the 2-D costmap, ranks them using a multi-criteria scoring system, and publishes the best frontier as an exploration goal. This strategy is essential for applications requiring the robot to independently explore and map its surroundings.
Configuration Layers in DimOS
DimOS organizes navigation configuration into three distinct layers: GlobalConfig for environment-wide settings, module-level parameters for strategy-specific tuning, and blueprint composition for runtime behavior.
GlobalConfig Settings
The GlobalConfig class in dimos/core/global_config.py manages global flags and environment variables that affect all navigation modules. You can set these via CLI flags when launching a blueprint or through a .env file in the repository root.
Common navigation-related GlobalConfig settings include:
# CLI flags when running a blueprint
dimos run unitree-go2-agentic \
--robot-model=unitree_go2 \
--n-workers=6
# .env file settings
DIMOS_ROBOT_ROTATION_DIAMETER=0.4 # Used by A* safe-goal search
DIMOS_FRONTIER_MIN_PERIMETER=0.5 # Meters, used by frontier explorer
Module-Level Parameters
Each navigation strategy exposes constructor arguments that allow fine-grained control over behavior.
Replanning A* Parameters
While the ReplanningAStarPlanner class in dimos/navigation/replanning_a_star/module.py accepts no public constructor arguments, it reads tunable values from GlobalConfig and exposes private attributes that can be modified after instantiation:
| Attribute | Default | Description |
|---|---|---|
_safe_goal_tolerance |
4.0 m | Maximum distance to search for a safe spot near the requested goal |
_goal_tolerance |
0.2 m | Distance threshold for considering the robot arrived |
_rotation_tolerance |
15° (radians) | Angular tolerance for goal arrival |
_max_path_deviation |
0.9 m | Distance threshold that triggers replanning when deviated from path |
_max_replan_attempts |
10 | Maximum consecutive replans before aborting |
You can override these after creating the planner instance:
from dimos.navigation.replanning_a_star.module import replanning_a_star_planner
planner = replanning_a_star_planner()
planner._safe_goal_tolerance = 6.0 # Allow farther safe-goal search
planner._max_path_deviation = 1.2 # Be more tolerant to drift
planner.start()
Wavefront Frontier Explorer Parameters
The wavefront_frontier_explorer in dimos/navigation/frontier_exploration/wavefront_frontier_goal_selector.py accepts extensive constructor arguments:
from dimos.navigation.frontier_exploration import wavefront_frontier_explorer
explorer = wavefront_frontier_explorer(
min_frontier_perimeter=0.5, # Meters (default)
occupancy_threshold=99, # Costmap cell value threshold for "occupied"
safe_distance=3.0, # Meters for obstacle-distance scoring
lookahead_distance=5.0, # Desired distance from robot when selecting frontier
max_explored_distance=10.0, # Bonus for frontiers far from visited goals
info_gain_threshold=0.03, # Percentage of new map information required
num_no_gain_attempts=2, # Stop after consecutive low-gain attempts
goal_timeout=15.0, # Seconds to wait for frontier goal arrival
)
These parameters control three distinct phases:
- Frontier detection:
min_frontier_perimeterandoccupancy_thresholddetermine which cells qualify as frontiers - Goal ranking:
safe_distance,lookahead_distance, andmax_explored_distancescore candidate frontiers - Exploration termination:
info_gain_threshold,num_no_gain_attempts, andgoal_timeoutprevent infinite exploration
Blueprint Composition
Navigation strategies in DimOS are composed using the autoconnect function from dimos.core.blueprints. The order of modules matters because it determines which component supplies the cmd_vel and path streams.
Combining Both Strategies
The canonical Unitree Go2 blueprint demonstrates composing both A* and frontier exploration:
from dimos.core.blueprints import autoconnect
from dimos.robot.unitree.go2.blueprints.basic import unitree_go2_basic
from dimos.mapping.voxels import voxel_mapper
from dimos.mapping.costmapper import cost_mapper
from dimos.navigation.replanning_a_star.module import replanning_a_star_planner
from dimos.navigation.frontier_exploration import wavefront_frontier_explorer
unitree_go2 = autoconnect(
unitree_go2_basic, # Robot connection + visualization
voxel_mapper(voxel_size=0.05), # 3-D voxel map
cost_mapper(), # 2-D costmap
replanning_a_star_planner(), # A* path planner (goal-directed)
wavefront_frontier_explorer(), # Frontier explorer (exploration)
).global_config(n_workers=6, robot_model="unitree_go2")
In this composition, replanning_a_star_planner provides the cmd_vel stream that drives the robot, while wavefront_frontier_explorer publishes exploration goals to the planner's goal_request input.
Strategy-Specific Blueprints
To use only goal-directed navigation without exploration:
from dimos.core.blueprints import autoconnect
from dimos.robot.unitree.go2.blueprints.basic import unitree_go2_basic
from dimos.mapping.voxels import voxel_mapper
from dimos.mapping.costmapper import cost_mapper
from dimos.navigation.replanning_a_star.module import replanning_a_star_planner
pure_nav = autoconnect(
unitree_go2_basic,
voxel_mapper(),
cost_mapper(),
replanning_a_star_planner(), # Only A* planner
)
To create a pure exploration robot without waypoint navigation:
from dimos.core.blueprints import autoconnect
from dimos.robot.unitree.go2.blueprints.basic import unitree_go2_basic
from dimos.mapping.voxels import voxel_mapper
from dimos.mapping.costmapper import cost_mapper
from dimos.navigation.frontier_exploration import wavefront_frontier_explorer
explorer_only = autoconnect(
unitree_go2_basic,
voxel_mapper(),
cost_mapper(),
wavefront_frontier_explorer(min_frontier_perimeter=0.8),
)
Runtime Control via RPC and CLI
Both navigation modules expose RPC methods that allow runtime control through the DimOS CLI or MCP/LLM agent interface.
Sending Navigation Commands
Use the dimos agent-send CLI to interact with active navigation strategies:
# Send a waypoint to the A* planner
dimos agent-send "go to 2.5 meters forward and 1.0 meters left"
# Start autonomous frontier exploration
dimos agent-send "start exploration"
# Cancel current navigation goal
dimos agent-send "cancel goal"
Querying Navigation State
The navigation interface exposes get_state() which returns a NavigationState enum indicating whether the system is IDLE, PLANNING, NAVIGATING, or STOPPED.
# Query via agent
dimos agent-send "what is the navigation state?"
Summary
Configuring navigation strategies in DimOS involves three complementary approaches:
- GlobalConfig manages environment-wide settings like
DIMOS_ROBOT_ROTATION_DIAMETERandDIMOS_FRONTIER_MIN_PERIMETERthrough CLI flags or.envfiles - Module parameters allow fine-tuning of specific behaviors, such as setting
_max_path_deviationfor the A* planner orinfo_gain_thresholdfor frontier exploration - Blueprint composition determines which strategies are active and how they interact, using
autoconnectto wire together mappers, planners, and explorers
Both strategies expose unified RPC interfaces, enabling runtime control via the DimOS CLI or MCP agent for dynamic switching between goal-directed navigation and autonomous exploration.
Frequently Asked Questions
How do I switch between A* planning and frontier exploration at runtime?
You can toggle between strategies by sending commands through the DimOS agent interface. The wavefront_frontier_explorer publishes goals to the same goal_request stream that replanning_a_star_planner consumes, so sending "start exploration" activates frontier mode while "go to x, y" triggers A* waypoint navigation. For hard switching, create separate blueprints omitting the unused strategy.
What is the difference between _safe_goal_tolerance and _goal_tolerance in the A* planner?
_safe_goal_tolerance defines how far the planner will search for a collision-free cell near your requested goal (default 4.0 m), ensuring the robot doesn't attempt to navigate into occupied space. _goal_tolerance determines when the robot considers itself arrived at the target (default 0.2 m). The first handles goal feasibility, while the second handles goal completion.
How do I prevent the frontier explorer from running indefinitely?
Configure the termination parameters in wavefront_frontier_explorer. Set info_gain_threshold to require a minimum percentage of new map information per frontier (default 0.03), and num_no_gain_attempts to limit consecutive low-gain explorations (default 2). Additionally, set goal_timeout (default 15.0 s) to abort frontiers that take too long to reach.
Can I use both navigation strategies simultaneously in the same blueprint?
Yes. The canonical Unitree Go2 blueprint demonstrates this composition. When both replanning_a_star_planner() and wavefront_frontier_explorer() are included in the same autoconnect call, the explorer publishes frontier goals to the planner's goal_request input, while the planner provides the cmd_vel output that drives the robot. This allows seamless switching between autonomous exploration and directed waypoints without restarting the system.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →