Prerequisite: 01 — Nav2 System Architecture, 01 — Nodes Topics Actions Unlocks: Deterministic bringup, faster startup debugging, correct action usage from mission code, cleaner preemption and cancellation behavior
Many teams lose days debugging Nav2 behavior that is really just incomplete bringup.
Typical examples:
ACTIVENavigateToPose is a fire-and-forget request instead of a long-running contractNav2 is built on lifecycle nodes and ROS2 actions. If you do not understand both, every startup or execution problem looks nondeterministic.
Bringup is not merely starting processes. It means getting all required nodes to the correct lifecycle state with working dependencies.
process started != node configured != node active != system healthy
For Nav2, a healthy runtime usually means:
Until that chain finishes, startup is incomplete.
Nav2 servers are typically LifecycleNodes.
UNCONFIGURED -> INACTIVE -> ACTIVE
▲ │ │
└──── cleanup┘ └── deactivate / shutdown on error or operator request
UNCONFIGUREDThe node exists but has not allocated or initialized the runtime resources needed for work.
INACTIVEThe node has configured its resources but does not yet process the full runtime workload.
ACTIVEThe node is ready for normal operation.
Practical rule: a node listed in ros2 node list is not evidence that Nav2 is ready.
The startup chain usually has dependencies like:
map_server / localization
-> costmaps
-> planner + controller + behavior server
-> bt_navigator
If a downstream server activates before a required upstream dependency is usable, startup can fail hard or succeed in a misleading half-ready state.
Examples:
This is why the lifecycle manager exists.
lifecycle_manager Doeslifecycle_manager owns ordered transitions for a configured list of managed nodes.
Its responsibilities include:
configure requests in orderactivate requests in orderConceptually:
for node in managed_nodes:
configure(node)
for node in managed_nodes:
activate(node)
monitor bonds while running
configureTypical causes:
Typical causes:
This second case is more dangerous because the state machine can look green while runtime behavior is red.
The wrong debugging habit is jumping directly into BT XML or planner tuning before proving startup health.
Navigation is a long-running operation with feedback, cancellation, and final result semantics. That is exactly why Nav2 uses ROS2 actions rather than plain services.
An action gives you:
In production AMRs, this matters because navigation requests are frequently preempted by:
NavigateToPoseThis is the most common top-level contract.
Conceptually:
Goal: single target pose
Feedback: progress toward completion, remaining distance/time depending on setup
Result: succeeded, canceled, or failed/aborted
What the caller must get right:
mapAMR mistake: sending the geometric center of a workcell instead of the legal staging pose for the robot footprint and approach direction.
NavigateThroughPosesThis contract extends single-goal navigation into a sequence of poses.
Use it when the path semantics matter:
This is not a generic fleet workflow system. It is still a navigation contract. The caller must decide whether the sequence belongs in navigation or in a higher mission controller.
Depending on configuration and integration, you may also see or care about:
ComputePathToPoseFollowPathSpin or BackUpThese are useful both for runtime behavior and for diagnosis:
ComputePathToPose fails in isolation, the problem is upstream of path followingFollowPath fails on a known-good path, the problem is in local execution, local costmap, or controller policyThat isolation is valuable during incident triage.
When an action server accepts a goal, it means the request passed initial validity checks. It does not mean navigation will succeed.
The actual outcome still depends on:
Mission software should never interpret “goal accepted” as “job complete soon.”
Good action clients use feedback for more than UI niceness.
Examples:
If feedback is ignored, you lose one of the best real-time observability surfaces in Nav2.
These are different ideas.
The caller wants the current goal terminated.
Expected system behavior:
A new goal replaces the old one.
Expected system behavior:
Common bug pattern: the mission layer sends a new goal but the robot visibly keeps executing the old one for too long. That is usually action/preemption handling, not planner quality.
1. Start map server and localization support
2. Confirm TF tree is coherent enough for navigation
3. Start Nav2 managed servers
4. lifecycle_manager configures each node
5. lifecycle_manager activates each node
6. Verify costmaps are receiving expected data
7. Send a known-good navigation goal
8. Confirm plan, feedback, and /cmd_vel appear as expected
This is a healthier mental model than “run launch file and hope.”
A robot may be booted, networked, and localized enough to report alive, but not ready to accept mission goals.
Expose a readiness state that depends on Nav2 lifecycle health.
Do not allow a mission layer to flood goals into a system that is not ACTIVE.
Operators should be able to answer:
If startup debugging requires SSH plus guesswork, your bringup is under-instrumented.
Often means one of these changed:
Lifecycle and action semantics help because they turn these from vague anecdotes into concrete checks.
Likely areas:
Action acceptance alone did not prove the system was ready to complete the task.
Likely areas:
This is why lifecycle state and action introspection are first-class operational tools.
map -> odom -> base_link?You should now be able to explain:
lifecycle_manager actually controlsNavigateToPose and related actions behave operationallyContinue to 03 — Nav2 Bt Navigator And Bt Xml.
That lesson explains how bt_navigator turns these action contracts into real navigation policy through BehaviorTree XML.