diff --git a/.circleci/config.yml b/.circleci/config.yml
index fb1d1ef6e0..549f3d3945 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -6,51 +6,32 @@ references:
path: .
setup_doc_dependencies: &setup_doc_dependencies
run:
- name: Install documentation dependencies
+ name: Install Doc Dependencies
command: |
export DEBIAN_FRONTEND=noninteractive
apt update
apt install -y \
+ doxygen \
git \
+ graphviz \
+ make \
+ openjdk-8-jre \
openssh-server \
python3-pip \
- python3-venv
- python3 -m venv /nav2_docs/venv
- . /nav2_docs/venv/bin/activate
+ ttf-dejavu
pip3 install -r requirements.txt
- build_docs: &build_docs
+ make_docs: &make_docs
run:
- name: Build documentation
command: |
- . /nav2_docs/venv/bin/activate
- mkdocs build
- store_built_docs: &store_built_docs
+ make html
+ store_docs: &store_docs
store_artifacts:
- path: ./site
- destination: build_site
+ path: _build/html
+ destination: html
publish_docs: &publish_docs
run:
- name: Deploy documentation
command: |
- # Set up git configuration
- git config user.name ci
- git config user.email ci@noreply.com
-
- . /nav2_docs/venv/bin/activate
-
- TITLE=${CIRCLE_BRANCH^}
- mike deploy $CIRCLE_BRANCH --title=$TITLE --push --allow-empty \
- --message "[skip ci] Deployed $CIRCLE_SHA1 to $CIRCLE_BRANCH"
-
- # Set default version only once
- if ! git cat-file -e origin/gh-pages:index.html; then
- mike set-default rolling --push
- echo "The default version is set to Rolling"
- fi
- store_published_docs: &store_published_docs
- store_artifacts:
- path: ./site
- destination: publish_site
+ make publish
install_deployment_key: &install_deployment_key
add_ssh_keys:
fingerprints:
@@ -61,21 +42,20 @@ commands:
description: "Install documentation dependencies"
steps:
- *setup_doc_dependencies
- build_and_store_docs:
- description: "Build and store docs"
+ build_docs:
+ description: "Build docs"
steps:
- - *build_docs
- - *store_built_docs
- publish_and_store_docs:
- description: "Commit newly built docs to gh-pages branch and store the build result"
+ - *make_docs
+ - *store_docs
+ publish_docs_to_gh_pages_branch:
+ description: "Commit newly built docs to gh-pages branch"
steps:
- *publish_docs
- - *store_published_docs
executors:
docs_exec:
docker:
- - image: ubuntu:noble
+ - image: ubuntu:focal
working_directory: /nav2_docs
jobs:
@@ -84,30 +64,29 @@ jobs:
steps:
- *on_checkout
- install_doc_dependencies
- - build_and_store_docs
+ - build_docs
+ - persist_to_workspace:
+ root: .
+ paths:
+ - _build
docs_publish:
executor: docs_exec
steps:
- *on_checkout
- install_doc_dependencies
- *install_deployment_key
- - publish_and_store_docs
+ - attach_workspace:
+ at: .
+ - publish_docs_to_gh_pages_branch
workflows:
- build_docs:
- jobs:
- - docs_build:
- filters:
- branches:
- ignore:
- - rolling
- publish_docs:
+ version: 2
+ build_and_publish_docs:
jobs:
+ - docs_build
- docs_publish:
- # 'serial-group' prevents gh-pages push conflicts when multiple branches deploy simultaneously.
- # Serial group ensures only one docs_publish job runs at a time across the org.
- serial-group: << pipeline.project.slug >>/gh-pages-deploy
+ requires:
+ - docs_build
filters:
branches:
- only:
- - rolling
+ only: master
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 22b9334947..d80daf3415 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -12,6 +12,7 @@
"extensions": [
"eamodio.gitlens",
"esbenp.prettier-vscode",
+ "GitHub.copilot",
"streetsidesoftware.code-spell-checker"
]
}
diff --git a/.dockerignore b/.dockerignore
index 3da882461e..111b0017b7 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -10,4 +10,4 @@
.vscode/
**.Dockerfile
**Dockerfile
-site
+_build/
diff --git a/.github/mergify.yml b/.github/mergify.yml
deleted file mode 100644
index 56c49aa7da..0000000000
--- a/.github/mergify.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-merge_queue:
- queue_controls_comment: false
-
-pull_request_rules:
- - name: backport to jazzy at reviewers discretion
- conditions:
- - base=rolling
- - "label=backport-jazzy"
- actions:
- backport:
- branches:
- - jazzy
-
- - name: backport to lyrical at reviewers discretion
- conditions:
- - base=rolling
- - "label=backport-lyrical"
- actions:
- backport:
- branches:
- - lyrical
-
- - name: ask to resolve conflict
- conditions:
- - conflict
- - author!=mergify
- actions:
- comment:
- message: This pull request is in conflict. Could you fix it @{{author}}?
-
- - name: circleci build failures
- conditions:
- - "check-failure=ci/circleci: docs_build"
- actions:
- comment:
- message: |
- @{{author}}, your PR has failed to build. Please check CI outputs and resolve issues.
diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml
new file mode 100644
index 0000000000..65669afcc6
--- /dev/null
+++ b/.github/workflows/claude.yml
@@ -0,0 +1,53 @@
+name: Claude PR Assistant
+
+on:
+ issue_comment:
+ types: [created]
+ pull_request_review_comment:
+ types: [created]
+ issues:
+ types: [opened, assigned]
+ pull_request_review:
+ types: [submitted]
+
+jobs:
+ claude-code-action:
+ if: |
+ (
+ (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
+ (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
+ (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
+ (github.event_name == 'issues' && contains(github.event.issue.body, '@claude'))
+ ) && (
+ github.actor == 'SteveMacenski' ||
+ github.actor == 'tonynajjar' ||
+ github.actor == 'ruffsl' ||
+ github.actor == 'doisyg' ||
+ github.actor == 'padhupradheep'
+ )
+
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ pull-requests: read
+ issues: read
+ id-token: write
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v7
+ with:
+ fetch-depth: 1
+
+ - name: Run Claude PR Action
+ uses: grll/claude-code-action@beta
+ with:
+ use_oauth: true
+ claude_access_token: ${{ secrets.CLAUDE_ACCESS_TOKEN }}
+ claude_refresh_token: ${{ secrets.CLAUDE_REFRESH_TOKEN }}
+ claude_expires_at: ${{ secrets.CLAUDE_EXPIRES_AT }}
+ secrets_admin_pat: ${{ secrets.SECRETS_ADMIN_PAT }}
+ allowed_tools: |
+ Bash
+ timeout_minutes: "60"
+ model: "claude-sonnet-4-20250514"
+ # direct_prompt: provide prompt information, probably more useful if this job is split into many. Reviewer, implementer, Q&A answerer, etc so that each have their own context
diff --git a/.github/workflows/claude_oath.yml b/.github/workflows/claude_oath.yml
new file mode 100644
index 0000000000..750676c947
--- /dev/null
+++ b/.github/workflows/claude_oath.yml
@@ -0,0 +1,21 @@
+name: Claude OAuth
+
+on:
+ workflow_dispatch:
+ inputs:
+ code:
+ description: 'Authorization code (leave empty for step 1)'
+ required: false
+
+permissions:
+ actions: write # Required for cache management
+ contents: read # Required for basic repository access
+
+jobs:
+ auth:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: grll/claude-code-login@v1
+ with:
+ code: ${{ inputs.code }}
+ secrets_admin_pat: ${{ secrets.SECRETS_ADMIN_PAT }}
diff --git a/.github/workflows/precommit.yaml b/.github/workflows/precommit.yaml
index c572f4388d..07313072e4 100644
--- a/.github/workflows/precommit.yaml
+++ b/.github/workflows/precommit.yaml
@@ -4,8 +4,7 @@ name: pre-commit
on:
pull_request:
push:
- branches:
- - rolling
+ branches: [main]
jobs:
pre-commit:
diff --git a/.gitignore b/.gitignore
index 9a01a1bca7..5936c36229 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,6 @@
-venv
-site
-__pycache__
-
-macros/cache/*
-!macros/cache/README.md
+_build
+lib/
+bin/
+pyvenv.cfg
+.DS_Store
+venv/
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 27b881831b..dcbbb5a891 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -16,14 +16,14 @@ repos:
# Spellcheck in comments and docs
# skipping of *.svg files is not working...
- repo: https://github.com/codespell-project/codespell
- rev: v2.4.2
+ rev: v2.3.0
hooks:
- id: codespell
args: ['--write-changes', '--ignore-words=.codespell_words']
- exclude: \.(svg|pyc|drawio|dcf|eds)$
+ exclude: CHANGELOG\.rst|\.(svg|pyc|drawio|dcf|eds)$
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v6.0.0
+ rev: v5.0.0
hooks:
- id: end-of-file-fixer
- id: mixed-line-ending
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 3312e0d2c7..d654a782f6 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -4,44 +4,32 @@
"version": "2.0.0",
"tasks": [
{
- "label": "Create venv",
- "type": "shell",
- "command": "python3",
- "args": ["-m", "venv", "venv"],
- "problemMatcher": []
- },
- {
- "label": "Install dependencies",
- "type": "shell",
- "command": "${workspaceFolder}/venv/bin/pip",
- "args": ["install", "-r", "requirements.txt"],
- "dependsOn": ["Create venv"],
- "problemMatcher": []
- },
- {
- "label": "Build Nav2 Docs",
+ "label": "Build",
+ "icon": {
+ "id": "gear"
+ },
"type": "shell",
- "command": "${workspaceFolder}/venv/bin/mkdocs",
- "args": ["build"],
- "dependsOn": ["Install dependencies"],
+ "command": "make html",
+ "isBackground": false,
"problemMatcher": [],
- "presentation": {
- "reveal": "always",
- "panel": "new"
- }
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
},
{
- "label": "Start Nav2 Docs live preview server",
+ "label": "Autobuild",
+ "icon": {
+ "id": "debug-start"
+ },
"type": "shell",
- "command": "${workspaceFolder}/venv/bin/mkdocs",
- "args": ["serve"],
- "dependsOn": ["Install dependencies"],
+ "command": "make autobuild",
+ "isBackground": true,
"problemMatcher": [],
- "presentation": {
- "reveal": "always",
- "panel": "new"
- },
- "isBackground": true
- },
+ "group": {
+ "kind": "build",
+ "isDefault": false
+ }
+ }
]
}
diff --git a/2021summerOfCode/Summer_2021_Student_Program.rst b/2021summerOfCode/Summer_2021_Student_Program.rst
new file mode 100644
index 0000000000..7e90bad695
--- /dev/null
+++ b/2021summerOfCode/Summer_2021_Student_Program.rst
@@ -0,0 +1,36 @@
+:orphan:
+
+.. _summer_2021_student_program:
+
+
+Projects for 2021 Summer Student Program
+########################################
+
+The `Summer 2021 Student Program `_ is upon us!
+See below for the list of project proposals for students to review and apply for.
+This is by no means the only list of potential projects, please check our issue tracker or propose another if there's something you think you're well suited for that would be useful for Nav2.
+
+If you have any questions, wish to ask questions, or generally reach out, you are encouraged to do so!
+We have a community Slack at `navigation2.slack.com `_.
+If you are unable to access it due to not being able to sign up, please send an email to the mentor in the details below and they can manually add you.
+
+Additionally, we have ROS community Discourse.
+If you post on `this discourse page `_ regarding Nav2, a maintainer will respond.
+We have the sub-topic Navigation Stack that may be used `here `_.
+It is preferred you post in this sub-topic.
+
+For general ROS questions, please use `ROS Answers `_.
+
+Have fun and we look forward to working with you this summer!
+
+.. toctree::
+ :maxdepth: 1
+
+ projects/dynamic.rst
+ projects/testing.rst
+ projects/assisted_teleop.rst
+ projects/multithreading.rst
+ projects/safety_node.rst
+ projects/semantics.rst
+ projects/spinners.rst
+ projects/twist_n_config.rst
diff --git a/2021summerOfCode/projects/assisted_teleop.rst b/2021summerOfCode/projects/assisted_teleop.rst
new file mode 100644
index 0000000000..1d034e512d
--- /dev/null
+++ b/2021summerOfCode/projects/assisted_teleop.rst
@@ -0,0 +1,43 @@
+
+.. _assisted_teleop:
+
+3. Assisted Teleop
+==================
+
+**Task description**
+
+In mobile robot and autonomous vehicle navigation, there are situations where a human driver is required to intervene to get the vehicle out of a sticky situation. This can be both as a backup in case of autonomy failure as well as the primary function of the robot (e.g. telepresence robots).
+
+This project's aim is to create an assisted teleop feature in Nav2 by means of a new behavior tree configuration file (the file that defines the flow of information for the navigation task) and potentially new plugins. This feature should make sure to use the local costmap and/or sensor data in order to avoid obstacles and take position and/or velocity commands to attempt to follow.
+
+An example application of this is a telepresence robot, where a human driver is driving the robot through a space to visit in an office building or hospital. Another example would be an autonomous delivery robot stuck requiring a human driver to navigate it back into an open space for the robot to continue its task.
+
+This will be an excellent chance to make a substantial new feature in the Nav2 system to be used by hundreds of robots in the future. This project could also be a good candidate for a ROSCon talk in future events.
+
+**Project difficulty: Medium**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+- Integrations of an assisted teleop feature in Nav2 as either a set of plugins and/or a behavior tree configuration
+- Robot can successfully navigate a space by a user teleop without collision
+- If time allots, work on tuning / adding new critics to the DWB local planner to improve safety of its performance for users out of the box
+
+**Skills required**
+
+- C++, XML, ROS
+- Mobile robot navigation experience
+- Recommended: Gazebo simulation, ROS navigation, Behavior trees
+
+**List of relevant open source software repositories and refs**
+
+- `ROS `_
+- `Gazebo Simulator `_
+- `Github ticket `_
+- `Navigation2 `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/create_configuration_assistant.rst b/2021summerOfCode/projects/create_configuration_assistant.rst
new file mode 100644
index 0000000000..3f019d7445
--- /dev/null
+++ b/2021summerOfCode/projects/create_configuration_assistant.rst
@@ -0,0 +1,54 @@
+:orphan:
+
+.. _create_moveit_analog:
+
+1. Create a Configuration Assistant (Analog to MoveIt)
+======================================================
+
+**Task description**
+
+`Moveit `_ has long has a QT `configuration assistant `_. This setup assistant helps the user configure their UDRF and needs to setup MoveIt configuration files.
+
+A configuration assistant could be extremely beneficial to Navigation2 users as a way to minimize friction. We should provide a gui tool to cover the following configurations:
+
+- the broad strokes with the costmap, with a visualizer to show the user what it will look like
+- Select configurable costmap layers
+- Select recovery behavior parameters
+- URDF, footprint, and frame selection to make sure the options comply with standards, planner, and controller
+- Set minimum and maximum speed and other kinematic parameters
+- Select from a dropdown of possible planners and controllers
+- Helpful notes throughout the prompts to aid in selecting appropriate parameters
+- Selecting at behavior tree
+- @steve please add more specific options
+
+After the items are configured, there should be a preview to see how the parameters effect the robot.
+
+**Project difficulty: High**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Contact information for the cooperating mentor (optional): juzhenatpku@gmail.com**
+
+**Project output requirements**
+
+- A QT based GUI configuration assistant that support the parameters listed above
+- A preview panel to display the parameters' effection on the robot
+
+**Skills required**
+
+- C++, Python3, QT framework
+- JSON/XML parsing
+- 3D programming (maybe needed in the preview)
+- Recommended: Gazebo simulation, ROS, and Navigation experience
+
+**List of relevant open source software repositories and refs**
+
+- `QT `_
+- `Gazebo Simulator `_
+- `Original github issue page `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/create_plugins.rst b/2021summerOfCode/projects/create_plugins.rst
new file mode 100644
index 0000000000..9f82f921c3
--- /dev/null
+++ b/2021summerOfCode/projects/create_plugins.rst
@@ -0,0 +1,48 @@
+:orphan:
+
+.. _create_plugins:
+
+
+
+2. Create New Planner and Controller Plugins
+============================================
+
+**Task description**
+
+The ROS 2 Navigation Stack has a number of plugin interfaces to help users create or select specific plugins for planning, control, and behaviors for their applications. Two specific areas that the Nav2 stack could use more algorithm plugins for is for path planning (referred to as a planner plugin) and local trajectory generation (referred to as controller plugins). A simple tutorial for creating a `planner plugin can be found here. `_ Currently, we have one planner, NavFn which implements an A* and Dijkstra's planner. It also has two controllers, DWB and TEB which implement a DWA and timed elastic-band optimization techniques. There is also a Hybrid-A* and OMPL planner in development.
+
+Your task will be to create a high-quality implementation of one of the following algorithms for the Nav2 plugin interfaces. Alternative algorithms may also be considered upon approval, please ask @steve in the application phase. Please select only one to discuss.
+
+- Planner Plugin Options: D* or variant, Vornoi planner, Navigation graph route planner, State Lattice planner, kinodynamic planner, and any planning method given a set of dynamic and static obstacles.
+- Controller Plugin Options: CiLQR, iLQR, MPC, Splines, path following or dynamic obstacle following controllers.
+- Additional options: helping in completing the OMPL or Hybrid-A* planner.
+
+**Project difficulty: High**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+
+- A functional planner or controller plugin for the Nav2 stack
+- Plugin should be optimized for run-time performance with 50% or greater test coverage
+
+**Skills required**
+
+- C++
+- Path planning or motion planning
+- Algorithm optimization
+- ROS / Pluginlib
+- Recommended: Gazebo simulation and Navigation experience
+
+**List of relevant open source software repositories and refs**
+
+- `ROS `_
+- `Gazebo Simulator `_
+- `Github issue page `_
+- `Nav2 `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/dynamic.rst b/2021summerOfCode/projects/dynamic.rst
new file mode 100644
index 0000000000..236d2bbda3
--- /dev/null
+++ b/2021summerOfCode/projects/dynamic.rst
@@ -0,0 +1,47 @@
+
+.. _dynamic:
+
+
+1. Navigation Dynamic Obstacle Integration
+==========================================
+
+**Task description**
+
+The Navigation Stack has long provided robust navigation in a wide range of environments. Controllers have been developed to operate effectively in the presence of dynamic obstacles without explicitly modeling the characteristics of dynamic obstacles. However, as the field has progressed and we see more and more robots using ROS deployed in human-filled spaces, more consideration must be taken with respect to dynamic obstacles such as people, carts, animals, and vehicles.
+
+Your task will be to create integrations with existing machine learning tools that create dynamic obstacle information (ComplexYolo, Yolo3D, etc) and tie them into the navigation stack for use. It is not in the scope for you to retrain or otherwise become an expert in 3D machine learning, but some basic knowledge will be helpful. We already have a starting point in the project links below that needs to be driven to completion. This includes completing the on-going work to integrate yolact edge into this work to replace detectron2 and benchmark these capabilities on GPUs to verify sufficient run-time performance, as well as other tangental feature development.
+
+This task will involve identifying a few techniques that produce position and velocity information about dynamic obstacles that can run on a mobile robot (using high-power Intel CPU, Nvidia Jetson SoC, external GPUs, etc) and get them running with ROS and Navigation. Next, you will help create a new costmap layer to use this information to mark the dynamic obstacle in the costmap to ensure a robot does not collide with a future trajectory of an obstacle.
+
+If time permits, you may also work to also integrate this dynamic information into a path planner and/or controller to help in direct motion consideration. This will likely be in collaboration with another community member.
+
+**Project difficulty: High**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+- Integrations of 1 method of dynamic obstacle detection in ROS 2, using machine learning
+- Test these capabilities on real data or a live robot to demonstrate functionality
+- 85% test coverage or higher
+
+**Skills required**
+
+- C++, Python, ROS
+- Mobile robot navigation experience
+- Geometry and statistics
+- Recommended: Gazebo simulation, machine learning, ROS navigation
+
+**List of relevant open source software repositories and refs**
+
+- `Starting project `_
+- `ROS `_
+- `Gazebo Simulator `_
+- `Github ticket `_
+- `Navigation2 `_
+- `Some related works `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/grid_maps.rst b/2021summerOfCode/projects/grid_maps.rst
new file mode 100644
index 0000000000..489716c729
--- /dev/null
+++ b/2021summerOfCode/projects/grid_maps.rst
@@ -0,0 +1,46 @@
+:orphan:
+
+.. _grid_maps:
+
+
+
+
+3. Port Grid Maps to ROS 2 and Environmental Model
+==================================================
+
+**Task description**
+Grid Maps was created by ETH Zurich and later transferred to ANYbotics. It is a universal grid map library for mobile robotic mapping that can be used as the basis of environmental models and various forms of grid maps available in ROS 1. This library is one of the top downloaded ROS packages. Your task will be to work with the community and the mentor to port grid_maps metapackage from ROS 1 to ROS 2 and help develop the next generation environment model in ROS 2 to replace costmap_2d.
+
+This will involve porting code from ROS 1 to ROS 2, analyzing uses of the environmental model to define an abstract interface to allow replacement of costmap_2d with grid_map, and building up the basic grid-operations for costmaps. It is not expected to complete the full new model with sensor processing over the course of the summer. If completed early, you may be able to help design a gradient model to complement your implemented costmap model using grid_maps. This will allow robots to select a gradient or a costmap model on startup.
+
+**Project difficulty: High**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+
+- Grid Maps ported to ROS 2 and merged into the main ROS 2 branch
+- Defined plugin interfaces to replace costmap 2D with grid maps
+- Implementing low-level operations on top of grid_maps to replace the base costmap_2d object.
+- You will not be expected to reimplement the full sensor processing mechanics of costmap_2d.
+
+**Skills required**
+
+- C++ and Git
+- ROS recommended ROS 2, but you can pick it up before starting
+- Coordinate transformations and basic geometry
+- Recommended: Gazebo simulation and Navigation experience
+
+**List of relevant open source software repositories and refs**
+
+- `ROS `_
+- `Gazebo Simulator `_
+- `Original github issue 1 `_
+- `Original github issue 2 `_
+- `Navigation2 `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/localization.rst b/2021summerOfCode/projects/localization.rst
new file mode 100644
index 0000000000..3b0a836df7
--- /dev/null
+++ b/2021summerOfCode/projects/localization.rst
@@ -0,0 +1,50 @@
+:orphan:
+
+.. _localization:
+
+
+6. 2D/3D Localization Improvements
+==================================
+
+**Task description**
+
+The Navigation2 stack uses AMCL as its primary localization engine. Over the last 10 years, essentially no updates to AMCL has been made. This is due to the code base for this implementation of an Adaptive Monte Carlo Localizer is written in embedded C, not well structured, and very sensitive to changes. A-MCL implementations have been a hallmark of localization for over a decade but this particular implementation should be deprecated.
+
+Your target involves designing and creating a new localization engine for the Nav2 stack. The requirements of this are:
+- Support 2D laser scanners
+- Support 3D laser scanners, where 2D case could potentially be a simplified case
+- Accurately track the localization of a robot in a given occupancy grid
+
+The reason that specific method is left open-ended is to allow for creativity, novelty, or reimplementation of a what you feel is best. We have, however, analyzed other MCL variants as being good options. This may include reimplementing an A-MCL that is designed to be modified with modular components and support sampling from a 3D lidar. Another option is a NDT-MCL using NDT 2D/3D scan matching. Other options may be proposed and discussed with mentors during the application phase. The task involves 3D as well since there is no standard 3D localizer in ROS 2 yet and more and more robust 3D SLAM libraries have emerged over the last 2 years.
+
+An optional but recommended feature of this work would be to also accept the inputs from multiple laser scanners. However it is not strictly required.
+
+**Project difficulty: High**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+- 2D and 3D localization system based on laser scanners
+- 65% or higher test coverage
+- Designed with modular components that can be reliably modified over time
+
+
+**Skills required**
+
+- C/C++
+- Localization, particle filter, or SLAM techniques
+- Ability to read and implement academic works
+- Recommended: Gazebo simulation and Navigation experience
+
+**List of relevant open source software repositories and refs**
+
+- `ROS `_
+- `Gazebo Simulator `_
+- `Original Github Issue `_
+- `Navigation2 `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/multithreading.rst b/2021summerOfCode/projects/multithreading.rst
new file mode 100644
index 0000000000..8cc7ff807f
--- /dev/null
+++ b/2021summerOfCode/projects/multithreading.rst
@@ -0,0 +1,51 @@
+
+.. _multhrreading:
+
+4. Navigation MultiThreading
+============================
+
+**Task description**
+
+The aim of this project is the significantly improve the run-time performance of Nav2 making sure to leverage the full capabilities of multi-processor core CPUs. We seek to identify areas in the Nav2 stack that could leverage multi-threading or parallel processing to speed up computations and improve overall user performance on a broad range of compute platforms.
+
+Some examples include:
+- AMCL particle cloud updates
+- Costmap layer updates
+- Costmap sensor data population
+- Controller critic evaluation
+- Collision checking
+- Voxel grid ray casting
+- and more.
+
+We are seeking a student interested in learning about multi-threading and parallel processing, ideally with some exposure to these concepts and libraries already, to analyze potential areas for parallel computing. Then, select the top candidates and implement them with parallel processing and benchmark the improvements to the Nav2 stack they provide.
+
+This will be an excellent chance to apply (or obtain) C++ parallel computing skills while also learning a great deal about how to build mobile robot navigation systems -- both very valuable skillsets.
+
+**Project difficulty: Medium**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+- Analysis of potential areas in the Nav2 stack that can benefit from parallel processing
+- Integrations of 3-5 areas in the Nav2 stack that non-trivially improves run-time performance of the stack using multithreading
+- Benchmark performance improvements
+
+**Skills required**
+
+- C++, ROS
+- Mobile robot navigation experience
+- Working knowledge (or ability to quickly obtain) on one or more of: TBB, OpenMP, OpenCL, Cuda, and similar
+- Recommended: Gazebo simulation, ROS navigation
+
+**List of relevant open source software repositories and refs**
+
+- `ROS `_
+- `Gazebo Simulator `_
+- `Github ticket `_
+- `Navigation2 `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/navigation_rebranding.rst b/2021summerOfCode/projects/navigation_rebranding.rst
new file mode 100644
index 0000000000..e2f41368da
--- /dev/null
+++ b/2021summerOfCode/projects/navigation_rebranding.rst
@@ -0,0 +1,40 @@
+:orphan:
+
+.. _rebranding:
+
+
+5. Navigation Branding and Website
+==================================
+
+**Task description**
+
+Navigation2 has made significant strides to be the best navigation system in the world. Over time, the original navigation stack in ROS has gained a reputation, fair or unfair, of being relatively limited in the types of tasks it can accomplish that are no longer true in ROS 2 Navigation2.
+
+As such, we would like to initiate a re-branding effort to help differentiate it from its foundings. `MoveIt `_ has a high-quality landing page with consistent graphics, color schemes, logos, and a catchy name. Your task will be to create a logo, color scheme, and work with maintainers to develop a new name to use in creating a new website for Navigation2. The `existing website `_ is a Read The Docs design with just the technical tutorials and details. We would like the new Navigation2 website to be analog to the MoveIt website and allow for future expansions such as a blog and pages highlighting demos and robots using the framework.
+
+**Project difficulty: Medium**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+- Work with maintainers to come up with a new name, logo, and color scheme
+- Develop a new landing package using these elements and developed graphics
+- Migrate the existing website to the new one
+- Add a blog feature and document the structure and editing process for future developers
+
+**Skills required**
+
+- Design and graphics packages
+- Web technologies
+- Creative thinking
+
+**List of relevant open source software repositories and refs**
+
+- `Github issue `_
+- `Navigation2 `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/safety_node.rst b/2021summerOfCode/projects/safety_node.rst
new file mode 100644
index 0000000000..d41125b82e
--- /dev/null
+++ b/2021summerOfCode/projects/safety_node.rst
@@ -0,0 +1,48 @@
+
+.. _safety_node:
+
+5. Navigation Safety Node
+=========================
+
+**Task description**
+
+The aim of this project is to create a safety watchdog node to ensure the robot is acting properly and not about to collide with an obstacle. Typical safety-rated lidars will contain "safety zones" whereas if any sensor points are located in a box around the lidar, then the lidar will send a signal to the robot to stop due to a potential collision. However, less and less people are using safety-rated lidars as consumer available lidars are dropping in cost and 3D lidars are seeing more use in mobile robotics.
+
+Your project will be to re-create this logic at the Navigation level. While this wouldn't be "safety certified", this is a significant functional improvement on safety that could potentially safe real people from real injuries in the real-world. The project will be to create a node that sits below the navigation stack but above the robot controller to do the following:
+
+- Take in the current command velocity from navigation and the most recent laser or RGBD scan
+- Projecting the velocity forward in time ``N`` seconds, check if that velocity will result in a collision with any sensor measurements
+- If not, allow the velocity command through to the base
+- If it does collide, scale back the velocity such that the robot will always be at minimum ``N`` seconds from a collision
+- Optionally if a flag is set, if ``M`` or more points are in defined bounding boxes around the robot, send only ``0`` commands to enact an emergency stop.
+
+This will be an excellent chance to make mobile robots and Nav2 users significantly safer and run at higher speeds in their production or research environments. It goes a long way for functional safety for those not using safety-rated lidars which contain similar features.
+
+**Project difficulty: Medium**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+- Creation of a ROS 2 node that will prevent robot collision based on lidar and/or RGBD data
+- Node should be able to run at lidar data speed (40hz+) and adjust velocity commands accordingly
+- If time allots, work on tuning / adding new critics to the DWB local planner to improve safety of its performance for users out of the box
+
+**Skills required**
+
+- C++, ROS
+- Mobile robot navigation experience
+- Geometry and statistics
+- Recommended: Gazebo simulation, ROS navigation
+
+**List of relevant open source software repositories and refs**
+
+- `ROS `_
+- `Gazebo Simulator `_
+- `Github ticket `_
+- `Navigation2 `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/semantics.rst b/2021summerOfCode/projects/semantics.rst
new file mode 100644
index 0000000000..5f6d29a463
--- /dev/null
+++ b/2021summerOfCode/projects/semantics.rst
@@ -0,0 +1,42 @@
+
+.. _semantics:
+
+6. Semantic Integration
+=======================
+
+**Task description**
+
+This project is to create a semantics library and integrate it into the Nav2 system. The major aim is to enable a generic semantic representation format that navigation (and potentially other ROS projects) may use for representing their environment, objects within it, or points of interest.
+
+After creating the generic representation, your project will be to create demonstrations within Nav2 using this capability including a route planning server to replace the planner server in situations where you have a pre-defined set of potential locales (non-free space planning) and another demonstration of your choice.
+
+**Project difficulty: Hard**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+- Generic semantics standard added to Nav2 documentation
+- Generic semantics ROS 2 library that implements the standard and makes it easy for applications to get, retrieve, or analyze semantic data for custom purposes
+- A route server to enable navigation-graph and/or route following capabilities
+- 1 more demonstration using the semantics library of your choice (could be costmap layer with different rules in different rooms or with different objects, a multi-story building demo using semantic info to allow a robot to plan and execute multi-story trajectories, etc)
+
+**Skills required**
+
+- C++, Python, ROS 2
+- Mobile robot navigation or manipulation experience
+- Perception, semantic information motivation, or similar.
+- Recommended: Gazebo simulation, ROS navigation
+
+**List of relevant open source software repositories and refs**
+
+- `ROS `_
+- `Gazebo Simulator `_
+- `Github ticket `_
+- `Github ticket2 `_
+- `Navigation2 `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/spinners.rst b/2021summerOfCode/projects/spinners.rst
new file mode 100644
index 0000000000..6ae9206423
--- /dev/null
+++ b/2021summerOfCode/projects/spinners.rst
@@ -0,0 +1,46 @@
+
+.. _spinners:
+
+
+7. Reduce ROS 2 Nodes and Determinism
+=====================================
+
+**Task description**
+
+This project is admittedly abstract to explain to someone unfamiliar with the inner-details of ROS 2 and its layers. If you're interested in working on this, you will become one of the few that truly understand the inner workings of it and be a very marketable skill. We do not expect anyone applying for this project to have that knowledge beforehand and we will help you learn the necessary items.
+
+ROS 2 architecturally was changed before Foxy in order to ensure that any single process containing multiple ROS 2 node objects will share the same DDS participant on the network. This is important due to the overhead that each additional DDS participant has on the system.
+
+In order for nav2 to leverage this the best, we need to adjust our usage of ROS 2 nodes and executors to further minimize the number of node objects in existence. In the early days of ROS 2 when Nav2 was being built, we were required to have many nodes in a single server in order to handle action requests and other callbacks. Now, we can make use of multi-threaded spinners, callback groups, and individual executors for specific tasks.
+
+This project will involve identifying all of the Node objects in the stack (control+F makes this easy) and work with mentors to ensure by the end of the summer each server contains only a single node. Additionally, the behavior tree plugins should be updated to leverage callback groups to ensure that any single BT node spinning to check if any new messages are on its callback will **only** trigger its own callback by the same mechanisms.
+
+More details about this project can be supplied if interested, but the tickets linked below also provide more context. Trust me to say this is a very achievable goal over the course of the summer and will also let you look under the hood of both Nav2 and rclcpp, giving you valuable insight future in your career (and put you in the top 10% of ROS 2 developers that know it to this degree).
+
+**Project difficulty: Medium**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+- Remove excess ROS 2 nodes from stack and replace with executors and multi-threaded executors
+- Replace Behavior Tree node spinners with local executors to ensure deterministic execution & processing only callback groups of the current BT node
+- If time allots, create a single ``main()`` function Nav2 executable composing all Nav2 processes and benchmarking improvements in performance
+
+**Skills required**
+
+- C++, ROS
+
+**List of relevant open source software repositories and refs**
+
+- `ROS `_
+- `Gazebo Simulator `_
+- `Github ticket `_
+- `Github ticket2 `_
+- `Navigation2 `_
+- `Some related works `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/testing.rst b/2021summerOfCode/projects/testing.rst
new file mode 100644
index 0000000000..bb42917b03
--- /dev/null
+++ b/2021summerOfCode/projects/testing.rst
@@ -0,0 +1,39 @@
+.. _testing:
+
+
+
+2. Advanced Navigation Testing Framework
+========================================
+
+**Task description**
+
+The ROS 2 Navigation Stack has had a focus on testing and reliability as a characteristic change from ROS 1 to ROS 2. We currently have a test coverage rate of 85% and do full system simulations in Continuous Integration (CI) to test the entire navigation system with a real robot completing real navigation tasks. Your task will be to increase the testing coverage rate to 90% (or +5% from your starting) and improve on the existing system tests to represent a more realistic environment. You will then work to make sure of that environment to actively block the robot from completing its task to simulate worst-case conditions.
+
+**Project difficulty: Medium**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+
+- Test line coverage of 90% or higher on the repository as reported by codecov (currently 85%)
+- An improved simulation environment for a more realistic mobile robotics application
+- Updated system tests to take advantage of that environment to fault or un-ideal cases of the stack
+
+**Skills required**
+
+- C++, Python3, gtest
+- Gazebo, recommended experience with Gazebo plugins
+- Recommended: Navigation experience
+
+**List of relevant open source software repositories and refs**
+
+- `ROS `_
+- `Gazebo Simulator `_
+- `Navigation2 `_
+- `Navigation2 Repo System Tests `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/2021summerOfCode/projects/twist_n_config.rst b/2021summerOfCode/projects/twist_n_config.rst
new file mode 100644
index 0000000000..106cd60781
--- /dev/null
+++ b/2021summerOfCode/projects/twist_n_config.rst
@@ -0,0 +1,51 @@
+
+.. _twist:
+
+
+8. Convert Twist to TwistStamped in Ecosystem and Run-Time Configuration
+========================================================================
+
+**Task description**
+
+This project is comprised of 2 smaller projects that can be easily worked on in parallel.
+
+Subproject A: Convert Twist to TwistStamped in Ecosystem
+
+The aim of this project is to identify places in the ROS 2 ecosystem that make use of ``Twist`` in the context of ``cmd_vel`` coming out of Navigation. This includes things like Nav2, ROS 2 Control, Gazebo ROS Plugins, Yuk's Velocity Filter, major robot drivers, etc. A set of previously identified places is shown in the ticket linked below.
+
+Once you've created a list of places in the ecosystem where it is used, your project will be to submit PRs on their ROS 2 branches to change the interface to make use of a ``TwistStamped`` instead of a ``Twist``.
+
+
+Subproject B: Run-time Reconfiguration of Parameters
+
+In the meantime while you're waiting for PRs to be merged or blocked by reviews on converting all of the ecosystems ``cmd_vel`` use of ``Twist`` to ``TwistStamped``, your project will be to enable run-time reconfiguration of the major parameters in Nav2. In ROS 2 this is done via the parameter change event callbacks. See tickets below for a list of plugins or servers needing dynamically reconfigurable parameter support added.
+
+
+**Project difficulty: Medium**
+
+**Project community mentor: Steve Macenski** `@SteveMacenski `_
+
+**Mentor contact details: [See link above, link in GitHub profile description]**
+
+**Project output requirements**
+- Convert all the major ecosystem projects into TwistStamped
+- Enable run-time reconfiguration of the remaining plugins and servers in Nav2 missing
+- Ensure that reconfiguration is thread-safe by using locks, atomic variables, or callback groups
+
+**Skills required**
+
+- C++, Python3
+- ROS 2
+
+**List of relevant open source software repositories and refs**
+
+- `ROS `_
+- `Gazebo Simulator `_
+- `Github ticket `_
+- `Github ticket2 `_
+- `Navigation2 `_
+- `Some related works `_
+
+**Licensing**
+- All contributions will be under the Apache 2.0 license.
+- No other CLA's are required.
diff --git a/Dockerfile b/Dockerfile
index dd412c8a6c..44e09f840e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,14 +4,14 @@
# $ docker build -f Dockerfile --build-arg user=$(id -un) --build-arg uid=$(id -u) -t nav2_docs .
#
# To use the image to build the docs:
-# $ docker run --rm -v .:/docs nav2_docs mkdocs build
+# $ docker run --rm -v $(pwd):/docs nav2_docs make html
#
# To run autobuild (watches for changes and rebuilds automatically):
-# $ docker run --init --rm -it -v .:/docs -p 127.0.0.1:8000:8000 nav2_docs mkdocs serve --dev-addr 0.0.0.0:8000
+# $ docker run --init --rm -it -v $(pwd):/docs -p 8000:8000 nav2_docs make autobuild
# Then browse to http://127.0.0.1:8000
# Use Ctrl+C to stop (--init flag enables proper signal handling)
#
-# The built documentation will be in site/
+# The built documentation will be in _build/html/
FROM ubuntu:noble
@@ -26,9 +26,14 @@ RUN if id -u $uid ; then userdel `id -un $uid` ; fi
RUN apt-get update && \
apt-get install --no-install-recommends -y \
+ doxygen \
git \
+ graphviz \
+ make \
+ openjdk-8-jre \
openssh-server \
- python3-pip && \
+ python3-pip \
+ fonts-dejavu && \
rm -rf /var/lib/apt/lists/*
RUN useradd -u $uid -m $user
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000..8c94c249da
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,70 @@
+# Minimal makefile for Sphinx documentation
+#
+
+ifeq ($(VERBOSE),1)
+ Q =
+else
+ Q = @
+endif
+
+# You can set these variables from the command line.
+SPHINXOPTS ?=
+SPHINXBUILD = sphinx-build
+SPHINXPROJ = "Nav2 Documentation"
+SOURCEDIR = .
+BUILDDIR = _build
+
+DOC_TAG ?= development
+RELEASE ?= latest
+PUBLISHDIR = /tmp/navigation2
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+ @echo ""
+ @echo "make publish"
+ @echo " publish generated html to thesofproject.github.io site:"
+ @echo " specify RELEASE=name to publish as a tagged release version"
+ @echo " and placed in a version subfolder. Requires repo merge permission."
+
+.PHONY: help Makefile
+
+# Generate the doxygen xml (for Sphinx) and copy the doxygen html to the
+# api folder for publishing along with the Sphinx-generated API docs.
+
+html:
+ $(Q)$(SPHINXBUILD) -t $(DOC_TAG) -b html -d $(BUILDDIR)/doctrees $(SOURCEDIR) $(BUILDDIR)/html $(SPHINXOPTS) $(O)
+
+# Autobuild the docs on changes
+
+autobuild:
+ sphinx-autobuild --host 0.0.0.0 --port 8000 -t $(DOC_TAG) -b html -d $(BUILDDIR)/doctrees $(SOURCEDIR) $(BUILDDIR)/html $(SPHINXOPTS)
+
+# Remove generated content (Sphinx and doxygen)
+
+clean:
+ rm -fr $(BUILDDIR)
+
+# Copy material over to the GitHub pages staging repo
+# along with a README
+
+publish:
+ git clone --reference . git@github.com:open-navigation/docs.nav2.org.git $(PUBLISHDIR)
+ cd $(PUBLISHDIR) && \
+ git checkout gh-pages && \
+ git config user.email "navigation2-ci@circleci.com" && \
+ git config user.name "navigation2-ci"
+ rm -fr $(PUBLISHDIR)/*
+ cp -r $(BUILDDIR)/html/* $(PUBLISHDIR)
+ cp scripts/.nojekyll $(PUBLISHDIR)/.nojekyll
+ cp scripts/CNAME $(PUBLISHDIR)/CNAME
+ cd $(PUBLISHDIR) && \
+ git add -A && \
+ git diff-index --quiet HEAD || \
+ (git commit -s -m "[skip ci] publish $(RELEASE)" && git push origin)
+
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile doxy
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) -W $(O)
diff --git a/README.md b/README.md
index f26e76757d..82dba5eb04 100644
--- a/README.md
+++ b/README.md
@@ -1,30 +1,36 @@
# docs.nav2.org
+https://docs.nav2.org/
-[](https://app.circleci.com/pipelines/github/ros-navigation/docs.nav2.org)
+This folder holds the source and configuration files used to generate the
+[Navigation2 documentation](https://docs.nav2.org) web site.
-
-## Installation
+### Native Installation
-### Virtual Environment
+Dependencies for Build:
+
+``` bash
+sudo apt install python3-pip
+pip3 install -r requirements.txt
+```
+
+### Installation in a Virtual Environment
Install `pip` and `venv` if not already installed:
-``` shell
+
+``` bash
sudo apt install python3-pip python3-venv
```
-Create a virtual environment and activate it:
-```shell
-python3 -m venv venv &&
-source venv/bin/activate
-```
+Create a virtual environment and install the dependencies:
-Install all required dependencies:
-```shell
+``` bash
+python3 -m venv venv
+source venv/bin/activate
pip3 install -r requirements.txt
```
-### Docker Container
+### Using Docker
Build the Docker image (from this directory):
@@ -35,13 +41,13 @@ docker build -f Dockerfile --build-arg user=$(id -un) --build-arg uid=$(id -u) -
To build the documentation:
```bash
-docker run --rm -v .:/docs nav2_docs mkdocs build
+docker run --rm -v $(pwd):/docs nav2_docs make html
```
To run autobuild (watches for changes and rebuilds automatically):
```bash
-docker run --init --rm -it -v .:/docs -p 127.0.0.1:8000:8000 nav2_docs mkdocs serve --dev-addr 0.0.0.0:8000
+docker run --init --rm -it -v $(pwd):/docs -p 8000:8000 nav2_docs make autobuild
```
Then browse to http://127.0.0.1:8000. Use Ctrl+C to stop (the `--init` flag enables proper signal handling).
@@ -52,99 +58,28 @@ If you're using Visual Studio Code, you can use the dev container for an easy se
1. Install the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
2. Open this folder in VS Code
-3. When prompted, click "Reopen in Container" (or use Command Palette: `Dev Containers: Reopen in Container`)
+3. When prompted, click "Reopen in Container" (or use Command Palette: "Dev Containers: Reopen in Container")
4. Once the container is built and running, use the integrated terminal to build the docs
-The dev container automatically sets up all dependencies. You can then use the build commands described below.
-
-## Build
-
-### Single distribution
-
-Use the following command from the required distribution branch to build the documentation:
-```shell
-mkdocs build
-```
-
-The build result can be found in the `site` directory, and the entry point in `site/index.html` file.
-[Other options][mkdocs-build-url] for the build command.
-
-Instead of the usual build process, MkDocs provides a live preview server that can be started with:
-```shell
-mkdocs serve
-```
-
-It allows to preview new changes during documentation update. The server will automatically rebuild the entire documentation after each file saving and display result at http://127.0.0.1:8000/. See [more options][mkdocs-serve-url] for the command.
-
-> [!WARNING]
-> The command `mkdocs serve` will display documentation for only one distribution without the ability to switch between them. \
-> To preview multiple distributions, follow the instructions below.
+The dev container automatically sets up all dependencies. You can then use the build tasks or run commands directly:
+- Build once: `make html` or use the "Build" task (Ctrl+Shift+B)
+- Auto-rebuild: `make autobuild` or use the "Autobuild" task
+### Build the Docs
-### Multiple distributions
+Build the docs locally with `make html` and you'll find the built docs entry point in `_build/html/index.html`.
-The current documentation relies on the [mike][mike-url] utility to support multiple versions.
-To build the documentation, execute the following command from the corresponding `` branch for each version that needs to be displayed:
-```shell
-mike deploy
-```
-
-After execution, a new directory with the selected `` name will be created on the local `gh-pages` branch. This directory will also contain the build result with the corresponding entry point `/index.html`.
-In addition, it creates the same `site` directory as before using `mkdocs build` in the current branch.
-
-You can set the `--title` option to change the version name displayed on the website. See [more options][mike-build-url] for this command.
-
-Example for two branches:
-- Execute from `rolling` branch:
- ```shell
- mike deploy rolling --title=Rolling
- ```
-
-- Execute from `jazzy` branch:
- ```shell
- mike deploy jazzy --title=Jazzy
- ```
+To automate the build process, you can use a [sphinx-autobuild](https://github.com/sphinx-doc/sphinx-autobuild) package. \
+Run this command from the virtual environment to build the documentation and start a server:
-Before viewing, you need to set the default version:
-```shell
-mike set-default
-```
-
-Similar to `mkdocs serve`, mike provides a server that can be started with:
-```shell
-mike serve
+```bash
+sphinx-autobuild . ./_build/html
```
+For more options for the command, see the documentation linked above.
-The documentation will be available at the same address http://127.0.0.1:8000/, and each version at the corresponding address `http://127.0.0.1:8000//`. \
-See [more options][mike-serve-url] for this command.
-
-> [!NOTE]
-> This server does not provide a live preview after changes are made locally. \
-> To display the new changes, use the `mike deploy` command for the corresponding branch, as was shown before.
+Now you can access the page using the local address: http://127.0.0.1:8000. \
+After saving any changes, the documentation will be automatically rebuilt and displayed.
-This command is useful for local testing and viewing differences between versions without the need to use a real web server.
-If you need to make changes for only one version, it will be more convenient to use `mkdocs serve` for this purpose, due to its live preview ability.
-
-After completing all changes, use these commands to exit the working environment:
-
-- If using the virtual environment (venv):
-
- ```shell
- deactivate
- ```
-
-- If using the VS Code Dev Container:
-
- Select in the Command Palette: `Dev Containers: Reopen Folder Locally`
-
-## License
-
-This project is licensed under the terms of the [Apache-2.0](./LICENSE) license. \
Any images, diagrams, or videos are subject to their own copyrights, trademarks, and licenses.
-
-[mkdocs-build-url]: https://www.mkdocs.org/user-guide/cli/#mkdocs-build
-[mkdocs-serve-url]: https://www.mkdocs.org/user-guide/cli/#mkdocs-serve
-[mike-url]: https://github.com/jimporter/mike
-[mike-build-url]: https://github.com/jimporter/mike#building-your-docs
-[mike-serve-url]: https://github.com/jimporter/mike#viewing-your-docs
+Want a local PDF version? Follow the [instructions here](https://gist.github.com/alfredodeza/7fb5c667addb1c6963b9).
diff --git a/_themes/otc_tcs_sphinx_theme/.gitignore b/_themes/otc_tcs_sphinx_theme/.gitignore
new file mode 100644
index 0000000000..6c014f9811
--- /dev/null
+++ b/_themes/otc_tcs_sphinx_theme/.gitignore
@@ -0,0 +1,2 @@
+__pycache__
+_build
diff --git a/_themes/otc_tcs_sphinx_theme/layout.html b/_themes/otc_tcs_sphinx_theme/layout.html
new file mode 100644
index 0000000000..06bc2d6c48
--- /dev/null
+++ b/_themes/otc_tcs_sphinx_theme/layout.html
@@ -0,0 +1,34 @@
+{% extends "sphinx_rtd_theme/layout.html" %}
+
+{% block extrahead %}
+
+
+
+{% endblock %}
+
+{% block content %}
+
+
+ Edit
+
+
+{{ super() }}
+
+{% endblock %}
+
+{% block footer %}
+
+
+
+
+
+
+{% endblock %}
diff --git a/_themes/otc_tcs_sphinx_theme/readme.rst b/_themes/otc_tcs_sphinx_theme/readme.rst
new file mode 100644
index 0000000000..7f5f284f28
--- /dev/null
+++ b/_themes/otc_tcs_sphinx_theme/readme.rst
@@ -0,0 +1,23 @@
+OTC-TCS Sphinx Theme
+####################
+
+Built on top of the popular Read the Docs Sphinx theme, this theme
+has a few small formatting/color improvements and implements collapsible
+sections. It is in active development in order to support OTC and other
+Intel organizations to publish high quality, consistent documentation
+for open source projects.
+
+How to use it
+*************
+
+#. Download or clone the repository
+#. Create a ``_themes`` directory in main directory of your sphinx
+ documentation
+#. Install sphinx_rtd_theme using pip: ``pip3 install sphinx_rtd_theme``
+#. copy ``otc_tcs_sphinx_theme`` directory into the new ``_themes`` directory
+#. Add the following to your ``conf.py``:
+
+ .. code-block:: python
+
+ html_theme = 'otc_tcs_sphinx_theme'
+ html_theme_path = ['_themes']
diff --git a/_themes/otc_tcs_sphinx_theme/static/tcs_theme.css b/_themes/otc_tcs_sphinx_theme/static/tcs_theme.css
new file mode 100644
index 0000000000..07df4e7264
--- /dev/null
+++ b/_themes/otc_tcs_sphinx_theme/static/tcs_theme.css
@@ -0,0 +1,217 @@
+/* -- Extra CSS styles for content (RTD theme) ----------------------- */
+
+/* make the page width fill the window */
+.wy-nav-content {
+ max-width: 1080px;
+}
+
+/* increase the size of the side bar from 300px default to 320px */
+.wy-nav-side {
+ width: 320px;
+}
+
+.wy-side-scroll {
+ width: 340px;
+}
+
+.wy-side-nav-search {
+ width: 320px;
+}
+
+.wy-menu-vertical {
+ width: 320px;
+}
+
+/* (temporarily) add an under development tagline to the bread crumb
+.wy-breadcrumbs::after {
+ content: " (Content under development)";
+ background-color: #FFFACD;
+ color: red;
+ font-weight: bold;
+}
+*/
+
+/* code block highlight color in rtd changed to lime green, no no no */
+
+.rst-content tt.literal, .rst-content code.literal, .highlight {
+ background: #f0f0f0;
+}
+.rst-content tt.literal, .rst-content code.literal {
+ color: #000000;
+}
+
+/* Make the version number more visible */
+.wy-side-nav-search>div.version {
+ color: rgba(255,255,255,1);
+}
+
+/* squish the space between a paragraph before a list */
+div > p + ul, div > p + ol {
+ margin-top: -20px;
+}
+
+/* add some space before the figure caption */
+p.caption {
+ border-top: 1px solid;
+ margin-top: 1em;
+}
+
+/* add a colon after the figure/table number (before the caption) */
+span.caption-number::after {
+ content: ": ";
+}
+
+p.extrafooter {
+ text-align: right;
+ margin-top: -36px;
+}
+
+table.align-center {
+ display: table !important;
+}
+
+
+.code-block-caption {
+ color: #000;
+ font: italic 85%/1 arial,sans-serif;
+ padding: 1em 0;
+ text-align: center;
+}
+
+/* make .. hlist:: tables fill the page */
+table.hlist {
+ width: 95% !important;
+}
+
+/* override rtd theme white-space no-wrap in table heading and content */
+th,td {
+ white-space: normal !important;
+}
+
+/* tweak for doxygen-generated API headings (for RTD theme) */
+.rst-content dl.group>dt, .rst-content dl.group>dd>p {
+ display:none !important;
+}
+.rst-content dl.group {
+ margin: 0 0 12px 0px;
+}
+.rst-content dl.group>dd {
+ margin-left: 0 !important;
+}
+
+/* Mobile-responsive styles for distribution table */
+@media screen and (max-width: 768px) {
+ /* Stack table cells vertically on mobile */
+ table.distribution-table,
+ table.distribution-table tbody,
+ table.distribution-table tr,
+ table.distribution-table td {
+ display: block !important;
+ width: 100% !important;
+ }
+
+ /* Remove table cell borders and padding adjustments */
+ table.distribution-table td {
+ border: none !important;
+ padding: 20px 0 !important;
+ text-align: center !important;
+ }
+
+ /* Add separator between distribution items */
+ table.distribution-table td:not(:last-child) {
+ border-bottom: 2px solid #e1e4e8 !important;
+ margin-bottom: 20px !important;
+ padding-bottom: 30px !important;
+ }
+
+ /* Ensure images scale properly on mobile while maintaining aspect ratio */
+ table.distribution-table img {
+ max-width: 250px !important;
+ max-height: 250px !important;
+ width: auto !important;
+ height: auto !important;
+ object-fit: contain !important;
+ }
+
+ /* Adjust text sizing for mobile */
+ table.distribution-table span[style*="font-size: 20px"] {
+ font-size: 18px !important;
+ }
+
+ table.distribution-table span[style*="font-size: 15px"] {
+ font-size: 14px !important;
+ padding: 10px 20px !important;
+ }
+}
+.rst-content p.breathe-sectiondef-title {
+ text-decoration: underline; /* for API sub-headings */
+ font-size: 1.25rem;
+ font-weight: bold;
+ margin-bottom: 12px;
+}
+
+.rst-content div.breathe-sectiondef {
+ padding-left: 0 !important;
+}
+
+.clps1 {
+ font-size: 175%;
+}
+
+.clps2 {
+ font-size: 150%;
+}
+
+.clps3 {
+ font-size: 125%;
+}
+
+.clps4 {
+ font-size: 115%;
+}
+
+.clps5 {
+ font-size: 110%;
+}
+
+.clps6 {
+ font-size: 100%;
+}
+
+.collapsible {
+ margin-left: -10px;
+ background-color: #f1f1f1;
+ cursor: pointer;
+ padding: 18px 18px 18px 10px;
+ width: 100%;
+ border: none;
+ text-align: left;
+ outline: none;
+ font-weight: 700;
+ font-family: "Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;
+}
+
+.collapsible:hover {
+ background-color: #d8d8d8;
+}
+
+.collapsible:after {
+ content: '\002B';
+ font-weight: bold;
+ float: right;
+ margin-left: 5px;
+}
+
+.active:after {
+ content: "\2212";
+}
+
+.content-collapse {
+ overflow: hidden;
+ transition: max-height 0.2s ease-out;
+}
+
+.header__menu_list li {
+ display: inline;
+ margin-left: 20px;
+}
diff --git a/_themes/otc_tcs_sphinx_theme/static/tcs_theme.js b/_themes/otc_tcs_sphinx_theme/static/tcs_theme.js
new file mode 100644
index 0000000000..6317390701
--- /dev/null
+++ b/_themes/otc_tcs_sphinx_theme/static/tcs_theme.js
@@ -0,0 +1,50 @@
+var i;
+var contents = document.getElementsByClassName("content-collapse section");
+
+for (i = 0; i < contents.length; i++) {
+
+ //Make sure the "content-collapse section" class is occurring in
+ if (contents[i].tagName.toLowerCase() == 'div') {
+ var element = contents[i].children[0];
+ var element_type = element.tagName.toLowerCase();
+ var span_id;
+ var spanElement;
+
+ //if the next element is a span grab the id and skip to the header
+ if (element_type == 'span') {
+ span_id = element.id;
+ element.id = "";
+ element = contents[i].children[1];
+ element_type = element.tagName.toLowerCase();
+ }
+
+ var btn = document.createElement("BUTTON");
+ //If it is a header capture which level and pass on to button
+ if (element_type.length == 2 && element_type[0] == 'h') {
+ var newClass = 'clps' + element_type[1];
+ //collapses the section by default only if javascript is working
+ contents[i].style.maxHeight = 0;
+ //Build the button and define behavior
+ btn.className += " " + newClass;
+ btn.innerHTML = element.innerHTML;
+ btn.className += " collapsible";
+ btn.id = span_id;
+ btn.addEventListener("click", function() {
+ this.classList.toggle("active");
+ var content = this.nextElementSibling;
+ if (content.style.maxHeight != "0px"){
+ content.style.maxHeight = 0;
+ } else {
+ content.style.maxHeight = content.scrollHeight + "px";
+ }
+ });
+
+ //Add the button to the page and remove the header
+ contents[i].parentNode.insertBefore(btn, contents[i]);
+ contents[i].removeChild(element);
+ }else{
+ //reset span id if it isn't followed by Hx element
+ spanElement.id = span_id;
+ }
+ }
+}
diff --git a/_themes/otc_tcs_sphinx_theme/theme.conf b/_themes/otc_tcs_sphinx_theme/theme.conf
new file mode 100644
index 0000000000..fc97c5522d
--- /dev/null
+++ b/_themes/otc_tcs_sphinx_theme/theme.conf
@@ -0,0 +1,2 @@
+[theme]
+inherit = sphinx_rtd_theme
diff --git a/docs/robots_using/assets/ACFR.png b/about/images/ACFR.png
similarity index 100%
rename from docs/robots_using/assets/ACFR.png
rename to about/images/ACFR.png
diff --git a/docs/robots_using/assets/angsa.png b/about/images/angsa.png
similarity index 100%
rename from docs/robots_using/assets/angsa.png
rename to about/images/angsa.png
diff --git a/docs/robots_using/assets/barnowl.png b/about/images/barnowl.png
similarity index 100%
rename from docs/robots_using/assets/barnowl.png
rename to about/images/barnowl.png
diff --git a/docs/robots_using/assets/birdseye.png b/about/images/birdseye.png
similarity index 100%
rename from docs/robots_using/assets/birdseye.png
rename to about/images/birdseye.png
diff --git a/docs/robots_using/assets/botronics.png b/about/images/botronics.png
similarity index 100%
rename from docs/robots_using/assets/botronics.png
rename to about/images/botronics.png
diff --git a/docs/robots_using/assets/brisa.png b/about/images/brisa.png
similarity index 100%
rename from docs/robots_using/assets/brisa.png
rename to about/images/brisa.png
diff --git a/docs/robots_using/assets/datavision.png b/about/images/datavision.png
similarity index 100%
rename from docs/robots_using/assets/datavision.png
rename to about/images/datavision.png
diff --git a/docs/robots_using/assets/dexory.png b/about/images/dexory.png
similarity index 100%
rename from docs/robots_using/assets/dexory.png
rename to about/images/dexory.png
diff --git a/docs/robots_using/assets/elroy.png b/about/images/elroy.png
similarity index 100%
rename from docs/robots_using/assets/elroy.png
rename to about/images/elroy.png
diff --git a/docs/robots_using/assets/firefly.png b/about/images/firefly.png
similarity index 100%
rename from docs/robots_using/assets/firefly.png
rename to about/images/firefly.png
diff --git a/docs/robots_using/assets/g1.png b/about/images/g1.png
similarity index 100%
rename from docs/robots_using/assets/g1.png
rename to about/images/g1.png
diff --git a/docs/robots_using/assets/go2.png b/about/images/go2.png
similarity index 100%
rename from docs/robots_using/assets/go2.png
rename to about/images/go2.png
diff --git a/docs/robots_using/assets/karelics.png b/about/images/karelics.png
similarity index 100%
rename from docs/robots_using/assets/karelics.png
rename to about/images/karelics.png
diff --git a/docs/robots_using/assets/karelics2.png b/about/images/karelics2.png
similarity index 100%
rename from docs/robots_using/assets/karelics2.png
rename to about/images/karelics2.png
diff --git a/docs/robots_using/assets/kiwibot.png b/about/images/kiwibot.png
similarity index 100%
rename from docs/robots_using/assets/kiwibot.png
rename to about/images/kiwibot.png
diff --git a/docs/robots_using/assets/move_base_compare_2.png b/about/images/move_base_compare_2.png
similarity index 100%
rename from docs/robots_using/assets/move_base_compare_2.png
rename to about/images/move_base_compare_2.png
diff --git a/docs/robots_using/assets/mpo_700.png b/about/images/mpo_700.png
similarity index 100%
rename from docs/robots_using/assets/mpo_700.png
rename to about/images/mpo_700.png
diff --git a/docs/robots_using/assets/novacarter.png b/about/images/novacarter.png
similarity index 100%
rename from docs/robots_using/assets/novacarter.png
rename to about/images/novacarter.png
diff --git a/docs/robots_using/assets/pixel.png b/about/images/pixel.png
similarity index 100%
rename from docs/robots_using/assets/pixel.png
rename to about/images/pixel.png
diff --git a/docs/robots_using/assets/polymath.png b/about/images/polymath.png
similarity index 100%
rename from docs/robots_using/assets/polymath.png
rename to about/images/polymath.png
diff --git a/docs/robots_using/assets/polymath_boat.png b/about/images/polymath_boat.png
similarity index 100%
rename from docs/robots_using/assets/polymath_boat.png
rename to about/images/polymath_boat.png
diff --git a/docs/robots_using/assets/rb1.png b/about/images/rb1.png
similarity index 100%
rename from docs/robots_using/assets/rb1.png
rename to about/images/rb1.png
diff --git a/docs/robots_using/assets/rosbot_xl.png b/about/images/rosbot_xl.png
similarity index 100%
rename from docs/robots_using/assets/rosbot_xl.png
rename to about/images/rosbot_xl.png
diff --git a/docs/robots_using/assets/rover.png b/about/images/rover.png
similarity index 100%
rename from docs/robots_using/assets/rover.png
rename to about/images/rover.png
diff --git a/docs/robots_using/assets/saxion.jpeg b/about/images/saxion.jpeg
similarity index 100%
rename from docs/robots_using/assets/saxion.jpeg
rename to about/images/saxion.jpeg
diff --git a/docs/robots_using/assets/seasony.png b/about/images/seasony.png
similarity index 100%
rename from docs/robots_using/assets/seasony.png
rename to about/images/seasony.png
diff --git a/docs/robots_using/assets/soon.png b/about/images/soon.png
similarity index 100%
rename from docs/robots_using/assets/soon.png
rename to about/images/soon.png
diff --git a/docs/robots_using/assets/tailos.png b/about/images/tailos.png
similarity index 100%
rename from docs/robots_using/assets/tailos.png
rename to about/images/tailos.png
diff --git a/docs/robots_using/assets/tb2.png b/about/images/tb2.png
similarity index 100%
rename from docs/robots_using/assets/tb2.png
rename to about/images/tb2.png
diff --git a/docs/robots_using/assets/tb3.png b/about/images/tb3.png
similarity index 100%
rename from docs/robots_using/assets/tb3.png
rename to about/images/tb3.png
diff --git a/docs/robots_using/assets/tb4.png b/about/images/tb4.png
similarity index 100%
rename from docs/robots_using/assets/tb4.png
rename to about/images/tb4.png
diff --git a/docs/robots_using/assets/tiago.png b/about/images/tiago.png
similarity index 100%
rename from docs/robots_using/assets/tiago.png
rename to about/images/tiago.png
diff --git a/docs/robots_using/assets/torch.png b/about/images/torch.png
similarity index 100%
rename from docs/robots_using/assets/torch.png
rename to about/images/torch.png
diff --git a/docs/robots_using/assets/tri.png b/about/images/tri.png
similarity index 100%
rename from docs/robots_using/assets/tri.png
rename to about/images/tri.png
diff --git a/docs/robots_using/assets/ubr1.png b/about/images/ubr1.png
similarity index 100%
rename from docs/robots_using/assets/ubr1.png
rename to about/images/ubr1.png
diff --git a/docs/robots_using/assets/walking.png b/about/images/walking.png
similarity index 100%
rename from docs/robots_using/assets/walking.png
rename to about/images/walking.png
diff --git a/docs/robots_using/assets/waratah.png b/about/images/waratah.png
similarity index 100%
rename from docs/robots_using/assets/waratah.png
rename to about/images/waratah.png
diff --git a/docs/robots_using/assets/wyca.png b/about/images/wyca.png
similarity index 100%
rename from docs/robots_using/assets/wyca.png
rename to about/images/wyca.png
diff --git a/docs/robots_using/assets/yunji.png b/about/images/yunji.png
similarity index 100%
rename from docs/robots_using/assets/yunji.png
rename to about/images/yunji.png
diff --git a/about/index.rst b/about/index.rst
new file mode 100644
index 0000000000..a0c0a9042d
--- /dev/null
+++ b/about/index.rst
@@ -0,0 +1,81 @@
+.. _about:
+
+About and Contact
+#################
+
+.. toctree::
+ :hidden:
+
+ related_projects.rst
+
+About
+*****
+
+Navigation is a community effort to lower the barrier of entry of mobile robotics technology for all.
+This project is one of the flagship projects along with MoveIt that acts as an applications entry point and frameworks for ROS.
+Navigation in ROS 2 builds on the wild success of the original Navigation Stack (Nav Stack) in ROS (1).
+This project has been used by researchers, educators, and industry for over 10 years.
+There are very few projects that have lasted as long or were as successful as ROS (1) Navigation.
+We would like to thank David Lu!! and Mike Ferguson for their tireless over the span of a decade to keep the Nav Stack alive and well.
+Without their hard work, this project would not have been able to happen.
+For a list of robots using Navigation2, see :ref:`robots`.
+
+Aslas, as time moves on, so must we.
+ROS (1) had a great run and those of us that build projects using it will remember it fondly(ish).
+With change comes possibilities.
+Navigation2 builds on the success but redesigns the framework to be more flexible and the feedback gathered over 10 years.
+
+We strive to create an open community and encourage new ROS users and experts alike to collaborate.
+However, that can't happen without your issues, pull requests, and support.
+Navigation, like all open-source projects, is kept going by a dedicated group of developers, maintainers, users, and collaborators.
+We would like to thank here our current and past contributors and maintainers.
+
+If you or your organization are interested in sponsoring Navigation or any work around it, please reach out to the current project lead.
+
+Our current leadership team includes:
+
++-------------------+-------------------+-------------------+------------------+
+| Name | Organization | GitHub ID | Current Role |
++===================+===================+===================+==================+
+| Steve Macenski | Open Navigation | SteveMacenski_ | Project Lead |
++-------------------+-------------------+-------------------+------------------+
+| Ruffin White | UC San Diego | ruffsl_ | CI Wizard |
++-------------------+-------------------+-------------------+------------------+
+| Joshua Wallace | Locus Robotics | JoshuaWallace_ | Main Contributor |
++-------------------+-------------------+-------------------+------------------+
+
+.. _SteveMacenski: https://github.com/SteveMacenski
+.. _ruffsl: https://github.com/ruffsl
+.. _JoshuaWallace: https://github.com/jwallace42
+
+Our former leadership team includes:
+
++-------------------+-------------------+---------------------+---------------------+
+| Name | Organization | GitHub ID | Role |
++===================+===================+=====================+=====================+
+| Matt Hansen | Intel Corporation | mkhansen_ | Former Project Lead |
++-------------------+-------------------+---------------------+---------------------+
+| Brian Wilcox | Intel Corporation | bpwilcox_ | Former Maintainer |
++-------------------+-------------------+---------------------+---------------------+
+| Carl Delsey | Intel Corporation | crdelsey_ | Maintainer |
++-------------------+-------------------+---------------------+---------------------+
+| Alexey Merzlyakov | Samsung Research | AlexeyMerzlyakov_ | Maintainer |
++-------------------+-------------------+---------------------+---------------------+
+
+.. _mkhansen: https://github.com/mkhansen-intel
+.. _bpwilcox: https://github.com/bpwilcox
+.. _crdelsey: https://github.com/crdelsey
+.. _AlexeyMerzlyakov: https://github.com/AlexeyMerzlyakov
+
+Contact
+*******
+
+If you are interested in contacting someone about Navigation, ROS 2, or related projects, please email the project leader or email info@opennav.org.
+We intentionally make our emails easy to find.
+If your inquiry relates to bugs or open-source feature requests, consider posting a ticket on our GitHub project.
+If your inquiry relates to configuration support or private feature development, reach out and we may be able to connect you with
+independent consultants or contractors that know this project well.
+
+Check out the Navigation 2 Slack_ community.
+
+.. _Slack: https://join.slack.com/t/navigation2/shared_invite/zt-uj428p0x-jKx8U7OzK1IOWp5TnDS2rA
diff --git a/about/related_projects.rst b/about/related_projects.rst
new file mode 100644
index 0000000000..32b09d8472
--- /dev/null
+++ b/about/related_projects.rst
@@ -0,0 +1,35 @@
+.. _related_projects:
+
+Related Projects
+################
+
+This is a community maintained list of related repositories and projects to Navigation2.
+
++--------------------------------+------------------------+----------------------------------+
+| Name | Maintainer | Description |
++================================+========================+==================================+
+| `Navigation2`_ | Steve Macenski | Main ROS 2 Navigation Stack |
++--------------------------------+------------------------+----------------------------------+
+| `docs.nav2.org`_ | Steve Macenski | Official documentation website |
+| | | source code |
++--------------------------------+------------------------+----------------------------------+
+| `navigation2_tutorials`_ | Steve Macenski | Source code and examples used |
+| | | in the documentation tutorials |
++--------------------------------+------------------------+----------------------------------+
+| `navigation2_dynamic`_ | Steve Macenski | Tools, algorithms, and |
+| | | capabilities for working with |
+| | | dynamic obstacles in ROS 2 |
++--------------------------------+------------------------+----------------------------------+
+| `robot_localization`_ | Tom Moore | State estimation software for |
+| | | ROS 2 used for odometry fusion |
+| | | and GPS transformations |
++--------------------------------+------------------------+----------------------------------+
+| `slam_toolbox`_ | Steve Macenski | Default 2D SLAM library |
++--------------------------------+------------------------+----------------------------------+
+
+.. _Navigation2: https://github.com/ros-navigation/navigation2
+.. _docs.nav2.org: https://github.com/ros-navigation/docs.nav2.org
+.. _navigation2_tutorials: https://github.com/ros-navigation/navigation2_tutorials
+.. _navigation2_dynamic: https://github.com/ros-navigation/navigation2_dynamic
+.. _robot_localization: https://github.com/cra-ros-pkg/robot_localization
+.. _slam_toolbox: https://github.com/SteveMacenski/slam_toolbox
diff --git a/about/robots.rst b/about/robots.rst
new file mode 100644
index 0000000000..c8b919a5ad
--- /dev/null
+++ b/about/robots.rst
@@ -0,0 +1,273 @@
+.. _robots:
+
+Robots Using
+############
+
+It's always helpful (and fun!) to have a list of robots using or ship with our work.
+Below is a very early list of robots we have encountered using our software as examples.
+
+Click on the images below for a link to the drivers or navigation configurations.
+
+..
+ To add robot to the table, the dimensions MUST be either 512x340 or 340x512
+
++------------------------+------------------------+------------------------+
+| |dex| + |poly| + |nova| |
++------------------------+------------------------+------------------------+
+| |ang| + |fire| + |kiwi| |
++------------------------+------------------------+------------------------+
+| |rosie| + |karl| + |ses| |
++------------------------+------------------------+------------------------+
+| |G1| + |Go2| + |barnowl| |
++------------------------+------------------------+------------------------+
+| |pxl| + |brisa| + |tri| |
++------------------------+------------------------+------------------------+
+| |wyca| + |elroy| + |birds| |
++------------------------+------------------------+------------------------+
+| |ubr1| + |Tiago| + |tb2| |
++------------------------+------------------------+------------------------+
+| |mpo_700| + |data| + |RB1| |
++------------------------+------------------------+------------------------+
+| |yunji| + |pm_boat| + |kar2| |
++------------------------+------------------------+------------------------+
+| |torch| + |ACFR| + |rover| |
++------------------------+------------------------+------------------------+
+| |tb4| + |tb3| + |rosbot_xl| |
++------------------------+------------------------+------------------------+
+| |saxion| + |botr| + |soon| |
++------------------------+------------------------+------------------------+
+
+Research Robots
+================
+
++------------------------+------------------------+------------------------+
+| |waratah| + |walking| + |soon| |
++------------------------+------------------------+------------------------+
+
+.. |walking| image:: images/walking.png
+ :width: 100%
+ :align: middle
+ :alt: walking
+ :target: https://www.aztrobotics.com/walking-y2.html
+
+.. |saxion| image:: images/saxion.jpeg
+ :width: 100%
+ :align: middle
+ :alt: Saxion Robotics
+ :target: https://www.saxion.nl/
+
+.. |G1| image:: images/g1.png
+ :width: 100%
+ :align: middle
+ :alt: Unitree G1 Humanoid
+ :target: https://www.unitree.com/
+
+.. |Go2| image:: images/go2.png
+ :width: 100%
+ :align: middle
+ :alt: Unitree Go2 Quadruped
+ :target: https://www.unitree.com/
+
+.. |barnowl| image:: images/barnowl.png
+ :width: 100%
+ :align: middle
+ :alt: Barn Owl
+ :target: https://barnowlag.com/
+
+.. |botr| image:: images/botronics.png
+ :width: 100%
+ :align: middle
+ :alt: Botronics
+ :target: https://botronics.be/
+
+.. |ACFR| image:: images/ACFR.png
+ :width: 100%
+ :align: middle
+ :alt: Australian Centre for Robotics
+ :target: https://robotics.sydney.edu.au/
+
+.. |torch| image:: images/torch.png
+ :width: 100%
+ :align: middle
+ :alt: Torch Technologies
+ :target: https://torchtechnologies.com/
+
+.. |pm_boat| image:: images/polymath_boat.png
+ :width: 100%
+ :align: middle
+ :alt: Polymath Robotics
+ :target: https://www.polymathrobotics.com/
+
+.. |nova| image:: images/novacarter.png
+ :width: 100%
+ :align: middle
+ :alt: Nvidia Segway Nova Carter
+ :target: https://robotics.segway.com/nova-carter/
+
+.. |kiwi| image:: images/kiwibot.png
+ :width: 100%
+ :align: middle
+ :alt: Kiwibot
+ :target: https://www.kiwibot.com/
+
+.. |fire| image:: images/firefly.png
+ :width: 100%
+ :align: middle
+ :alt: Firefly Automatix
+ :target: https://fireflyautomatix.com/m220/
+
+.. |karl| image:: images/karelics2.png
+ :width: 100%
+ :align: middle
+ :alt: Karelics
+ :target: https://karelics.fi/
+
+.. |kar2| image:: images/karelics.png
+ :width: 100%
+ :align: middle
+ :alt: Karelics
+ :target: https://karelics.fi/
+
+.. |data| image:: images/datavision.png
+ :width: 100%
+ :align: middle
+ :alt: Datavision Software
+ :target: https://rex.software
+
+.. |poly| image:: images/polymath.png
+ :width: 100%
+ :align: middle
+ :alt: Polymath Robotics
+ :target: https://www.polymathrobotics.com/
+
+.. |birds| image:: images/birdseye.png
+ :width: 100%
+ :align: middle
+ :alt: Birds Eye
+ :target: https://www.birdseyerobotics.com/
+
+.. |wyca| image:: images/wyca.png
+ :width: 100%
+ :align: middle
+ :alt: Wyca Robotics
+ :target: https://www.wyca-robotics.fr/
+
+.. |dex| image:: images/dexory.png
+ :width: 100%
+ :align: middle
+ :alt: Dexory
+ :target: https://www.dexory.com/
+
+.. |tri| image:: images/tri.png
+ :width: 100%
+ :align: middle
+ :alt: Olympics2020
+ :target: https://www.tri.global/news/toyota-introduces-tris-t-tr1-a-virtual-mobility-2019-7-22/
+
+.. |elroy| image:: images/elroy.png
+ :width: 100%
+ :align: middle
+ :alt: ElroyAir
+ :target: https://elroyair.com/
+
+.. |ang| image:: images/angsa.png
+ :width: 100%
+ :align: middle
+ :alt: Angsa
+ :target: https://angsa-robotics.com/en-de/roboter/
+
+.. |ses| image:: images/seasony.png
+ :width: 100%
+ :align: middle
+ :alt: Seasony
+ :target: https://www.seasony.io/
+
+.. |pxl| image:: images/pixel.png
+ :width: 100%
+ :align: middle
+ :alt: Pixel
+ :target: https://pixel-robotics.eu/
+
+.. |brisa| image:: images/brisa.png
+ :width: 100%
+ :align: middle
+ :alt: Brisa
+ :target: https://www.brisa.tech/
+
+.. |tb2| image:: images/tb2.png
+ :width: 100%
+ :align: middle
+ :alt: Turtlebot2
+ :target: https://github.com/kobuki-base/kobuki_ros
+
+.. |tb3| image:: images/tb3.png
+ :width: 100%
+ :align: middle
+ :alt: Turtlebot3
+ :target: https://github.com/ROBOTIS-GIT/turtlebot3
+
+.. |tb4| image:: images/tb4.png
+ :width: 100%
+ :align: middle
+ :alt: Turtlebot4
+ :target: https://clearpathrobotics.com/turtlebot-4/
+
+.. |rover| image:: images/rover.png
+ :width: 100%
+ :align: middle
+ :alt: Rover Robotics
+ :target: https://github.com/RoverRobotics/openrover-ros2
+
+.. |yunji| image:: images/yunji.png
+ :width: 100%
+ :align: middle
+ :alt: Yunji Robot
+ :target: https://en.yunjichina.com.cn/a/53.html
+
+.. |RB1| image:: images/rb1.png
+ :width: 100%
+ :align: middle
+ :alt: Robotnik Rb1 base
+ :target: https://github.com/IntelligentRoboticsLabs/marathon_ros2
+
+.. |Tiago| image:: images/tiago.png
+ :align: middle
+ :width: 100%
+ :alt: Tiago Robot
+ :target: https://github.com/IntelligentRoboticsLabs/marathon_ros2
+
+.. |ubr1| image:: images/ubr1.png
+ :align: middle
+ :width: 100%
+ :alt: UBR-1
+ :target: https://www.robotandchisel.com/2020/09/01/navigation2
+
+.. |mpo_700| image:: images/mpo_700.png
+ :width: 100%
+ :align: middle
+ :alt: Neobotix MPO-700
+ :target: https://github.com/neobotix/neo_mpo_700-2
+
+.. |soon| image:: images/soon.png
+ :width: 100%
+ :align: middle
+ :alt: Coming Soon
+ :target: https://www.youtube.com/watch?v=oHg5SJYRHA0
+
+.. |rosie| image:: images/tailos.png
+ :width: 100%
+ :align: middle
+ :alt: Rosie
+ :target: https://tailos.com/
+
+.. |rosbot_xl| image:: images/rosbot_xl.png
+ :width: 100%
+ :align: middle
+ :alt: Husarion ROSbot XL
+ :target: https://github.com/husarion/rosbot-xl-autonomy
+
+.. |waratah| image:: images/waratah.png
+ :width: 100%
+ :align: middle
+ :alt: Waratah from Monash Nova Rocer
+ :target: https://www.novarover.space/
diff --git a/about/roscon.rst b/about/roscon.rst
new file mode 100644
index 0000000000..f303fe24d2
--- /dev/null
+++ b/about/roscon.rst
@@ -0,0 +1,29 @@
+.. _roscon:
+
+ROSCon Talks
+############
+
+Below is a list of ROSCon talks that have been given by the Nav2 team and the community which describe important features, tuning and configuration advice, and how to work with them in your applications.
+
+Nav2 Developer Talks
+--------------------
+
+- `ROSCon 2024: On Use of Nav2 Docking `_
+- `ROSCon FR 2023: Nav2 Whys over What's: Navigating the Philosophies Behind the Features `_
+- `ROSCon 2023: On Use of Nav2 MPPI Controller `_
+- `ROSCon 2023: Bidirectional navigation with Nav2 `_
+- `ROSCon 2022: On Use of Nav2 Smac Planners `_
+- `ROSCon JP 2021: The Past, Present, and Future of Navigation `_
+- `ROSCon 2021: Chronicles of Caching and Containerising CI for Nav2 `_
+- `ROSCon 2020: Navigation2: The Next Generation Navigation System `_
+- `ROSCon 2019: On Use of SLAM Toolbox `_
+- `ROSCon 2019: Navigation 2 Overview `_
+- `ROSCon 2018: On Use of the Spatio-Temporal Voxel Layer `_
+
+Community's Talks
+-----------------
+
+- `ROSCon ES 2024: Navegación robusta en ROS2 `_
+- `ROSCon 2022: BehaviorTree.CPP 4.0. What is new and roadmap `_
+- `ROSCon 2024: Mobile Robotics Scale-up Leveraging ROS `_
+- `ROSCon 2024: Radar Tracks for Path Planning in the presence of Dynamic Obstacles `_
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_nonblockingSequence.png b/behavior_trees/images/control_nonblockingSequence.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_nonblockingSequence.png
rename to behavior_trees/images/control_nonblockingSequence.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_nonblockingSequence_RUNNING_RUNNING_RUNNING.png b/behavior_trees/images/control_nonblockingSequence_RUNNING_RUNNING_RUNNING.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_nonblockingSequence_RUNNING_RUNNING_RUNNING.png
rename to behavior_trees/images/control_nonblockingSequence_RUNNING_RUNNING_RUNNING.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_nonblockingSequence_SUCCESS_RUNNING_RUNNING.png b/behavior_trees/images/control_nonblockingSequence_SUCCESS_RUNNING_RUNNING.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_nonblockingSequence_SUCCESS_RUNNING_RUNNING.png
rename to behavior_trees/images/control_nonblockingSequence_SUCCESS_RUNNING_RUNNING.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_nonblockingSequence_SUCCESS_RUNNING_SUCCESS.png b/behavior_trees/images/control_nonblockingSequence_SUCCESS_RUNNING_SUCCESS.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_nonblockingSequence_SUCCESS_RUNNING_SUCCESS.png
rename to behavior_trees/images/control_nonblockingSequence_SUCCESS_RUNNING_SUCCESS.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_nonblockingSequence_SUCCESS_SUCCESS_SUCCESS.png b/behavior_trees/images/control_nonblockingSequence_SUCCESS_SUCCESS_SUCCESS.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_nonblockingSequence_SUCCESS_SUCCESS_SUCCESS.png
rename to behavior_trees/images/control_nonblockingSequence_SUCCESS_SUCCESS_SUCCESS.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_pipelineSequence.png b/behavior_trees/images/control_pipelineSequence.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_pipelineSequence.png
rename to behavior_trees/images/control_pipelineSequence.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_pipelineSequence_RUNNING_IDLE_IDLE.png b/behavior_trees/images/control_pipelineSequence_RUNNING_IDLE_IDLE.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_pipelineSequence_RUNNING_IDLE_IDLE.png
rename to behavior_trees/images/control_pipelineSequence_RUNNING_IDLE_IDLE.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_pipelineSequence_RUNNING_SUCCESS_RUNNING.png b/behavior_trees/images/control_pipelineSequence_RUNNING_SUCCESS_RUNNING.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_pipelineSequence_RUNNING_SUCCESS_RUNNING.png
rename to behavior_trees/images/control_pipelineSequence_RUNNING_SUCCESS_RUNNING.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_pipelineSequence_RUNNING_SUCCESS_SUCCESS.png b/behavior_trees/images/control_pipelineSequence_RUNNING_SUCCESS_SUCCESS.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_pipelineSequence_RUNNING_SUCCESS_SUCCESS.png
rename to behavior_trees/images/control_pipelineSequence_RUNNING_SUCCESS_SUCCESS.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_pipelineSequence_SUCCESS_RUNNING_IDLE.png b/behavior_trees/images/control_pipelineSequence_SUCCESS_RUNNING_IDLE.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_pipelineSequence_SUCCESS_RUNNING_IDLE.png
rename to behavior_trees/images/control_pipelineSequence_SUCCESS_RUNNING_IDLE.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_recovery_node.png b/behavior_trees/images/control_recovery_node.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_recovery_node.png
rename to behavior_trees/images/control_recovery_node.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin.png b/behavior_trees/images/control_round_robin.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin.png
rename to behavior_trees/images/control_round_robin.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_FAILURE_RUNNING_IDLE.png b/behavior_trees/images/control_round_robin_FAILURE_RUNNING_IDLE.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_FAILURE_RUNNING_IDLE.png
rename to behavior_trees/images/control_round_robin_FAILURE_RUNNING_IDLE.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_FAILURE_SUCCESS_IDLE.png b/behavior_trees/images/control_round_robin_FAILURE_SUCCESS_IDLE.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_FAILURE_SUCCESS_IDLE.png
rename to behavior_trees/images/control_round_robin_FAILURE_SUCCESS_IDLE.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_FAILURE_SUCCESS_RUNNING.png b/behavior_trees/images/control_round_robin_FAILURE_SUCCESS_RUNNING.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_FAILURE_SUCCESS_RUNNING.png
rename to behavior_trees/images/control_round_robin_FAILURE_SUCCESS_RUNNING.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_IDLE_IDLE_IDLE.png b/behavior_trees/images/control_round_robin_IDLE_IDLE_IDLE.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_IDLE_IDLE_IDLE.png
rename to behavior_trees/images/control_round_robin_IDLE_IDLE_IDLE.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_RUNNING_IDLE_FAILURE.png b/behavior_trees/images/control_round_robin_RUNNING_IDLE_FAILURE.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_RUNNING_IDLE_FAILURE.png
rename to behavior_trees/images/control_round_robin_RUNNING_IDLE_FAILURE.png
diff --git a/docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_RUNNING_IDLE_IDLE.png b/behavior_trees/images/control_round_robin_RUNNING_IDLE_IDLE.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/nav2_specific_nodes/assets/control_round_robin_RUNNING_IDLE_IDLE.png
rename to behavior_trees/images/control_round_robin_RUNNING_IDLE_IDLE.png
diff --git a/docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/contextual_recoveries.png b/behavior_trees/images/walkthrough/contextual_recoveries.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/contextual_recoveries.png
rename to behavior_trees/images/walkthrough/contextual_recoveries.png
diff --git a/docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/navigation_subtree.png b/behavior_trees/images/walkthrough/navigation_subtree.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/navigation_subtree.png
rename to behavior_trees/images/walkthrough/navigation_subtree.png
diff --git a/docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/navigation_subtree_bare.png b/behavior_trees/images/walkthrough/navigation_subtree_bare.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/navigation_subtree_bare.png
rename to behavior_trees/images/walkthrough/navigation_subtree_bare.png
diff --git a/docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/overall_bt.png b/behavior_trees/images/walkthrough/overall_bt.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/overall_bt.png
rename to behavior_trees/images/walkthrough/overall_bt.png
diff --git a/docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/overall_bt_w_breakdown.png b/behavior_trees/images/walkthrough/overall_bt_w_breakdown.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/overall_bt_w_breakdown.png
rename to behavior_trees/images/walkthrough/overall_bt_w_breakdown.png
diff --git a/docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/patience_and_recovery.png b/behavior_trees/images/walkthrough/patience_and_recovery.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/patience_and_recovery.png
rename to behavior_trees/images/walkthrough/patience_and_recovery.png
diff --git a/docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/recovery_subtree.png b/behavior_trees/images/walkthrough/recovery_subtree.png
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/detailed_behavior_tree_walkthrough/assets/recovery_subtree.png
rename to behavior_trees/images/walkthrough/recovery_subtree.png
diff --git a/behavior_trees/index.rst b/behavior_trees/index.rst
new file mode 100644
index 0000000000..c8d44022bf
--- /dev/null
+++ b/behavior_trees/index.rst
@@ -0,0 +1,54 @@
+.. _behavior_trees:
+
+Nav2 Behavior Trees
+###################
+
+.. toctree::
+ :maxdepth: 1
+
+ overview/nav2_specific_nodes.rst
+ overview/detailed_behavior_tree_walkthrough.rst
+ trees/nav_to_pose_recovery.rst
+ trees/nav_through_poses_recovery.rst
+ trees/nav_to_pose_and_pause_near_goal_obstacle.rst
+ trees/nav_to_pose_with_consistent_replanning_and_if_path_becomes_invalid.rst
+ trees/navigate_on_route_graph_w_recovery.rst
+ trees/follow_point.rst
+ trees/odometry_calibration.rst
+
+Nav2 is an incredibly reconfigurable project. It allows users to set many different plugin types, across behavior trees, core algorithms, status checkers, and more!
+This section highlights some of the example behavior tree xml files provided by default in the project to do interesting tasks.
+It should be noted that these can be modified for your specific application, or used as a guide to building your own application-specific behavior tree.
+These are some exemplary examples of how you can reconfigure your navigation behavior significantly by using behavior trees.
+Other behavior trees are provided by Nav2 in the ``nav2_bt_navigator`` package, but this section highlights the important ones.
+
+A **very** basic, but functional, navigator can be seen below.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+This behavior tree will simply plan a new path to ``goal`` every 1 meter (set by ``DistanceController``) using ``ComputePathToPose``.
+If a new path is computed on the ``path`` blackboard variable, ``FollowPath`` will take this ``path`` and follow it using the server's default algorithm.
+
+This tree contains:
+
+- No recovery methods
+- No retries on failure
+- No selected planner or controller algorithms
+- No nodes to contextually change settings for optimal performance
+- No integration with automatic door, elevator, or other APIs
+- No user provided custom BT nodes
+- No subtrees for other behaviors like docking, following, etc.
+- No use of other types of planners, like complete coverage (where useful)
+
+All of this, and more, can be set and configured for your customized navigation logic in Nav2.
diff --git a/behavior_trees/overview/detailed_behavior_tree_walkthrough.rst b/behavior_trees/overview/detailed_behavior_tree_walkthrough.rst
new file mode 100644
index 0000000000..2939fcf447
--- /dev/null
+++ b/behavior_trees/overview/detailed_behavior_tree_walkthrough.rst
@@ -0,0 +1,325 @@
+.. _detailed_behavior_tree_walkthrough:
+
+Detailed Behavior Tree Walkthrough
+**********************************
+
+- `Overview`_
+- `Prerequisites`_
+- `Navigate To Pose With Replanning and Recovery`_
+- `Navigation Subtree`_
+- `Recovery Subtree`_
+
+Overview
+========
+
+This document serves as a reference guide to the main behavior tree (BT) used in Nav2.
+
+There are many example behavior trees provided in ``nav2_bt_navigator/behavior_trees``,
+but these sometimes have to be re-configured based on the application of the robot.
+The following document will walk through the current main default BT ``navigate_to_pose_w_replanning_and_recovery.xml``
+in great detail.
+
+Prerequisites
+=============
+
+- Become familiar with the concept of a behavior tree before continuing with this walkthrough
+
+ - Read the short explanation in `navigation concepts <../../concepts/index.html>`_
+
+ - Read the general tutorial and guide (not Nav2 specific) on the `BehaviorTree CPP V4 `_ website. Specifically, the "Basic Concepts" section on the BehaviorTree CPP V4 website explains the basic generic nodes that will be used that this guide will build upon.
+
+- Become familiar with the custom `Nav2 specific BT nodes `_
+
+Navigate To Pose With Replanning and Recovery
+=============================================
+
+The following section will describe in detail the concept of the main and default BT currently used in Nav2, ``navigate_to_pose_w_replanning_and_recovery.xml``.
+This behavior tree replans the global path periodically at 1 Hz and it also has recovery actions.
+
+|
+
+ .. image:: ../images/walkthrough/overall_bt.png
+ :align: center
+
+|
+
+BTs are primarily defined in XML. The tree shown above is represented in XML as follows.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+This is likely still a bit overwhelming, but this tree can be broken into two smaller subtrees that we can focus on one at a time.
+These smaller subtrees are the children of the top-most ``RecoveryNode``. From this point forward the ``NavigateWithReplanning`` subtree will be referred to as the ``Navigation`` subtree, and the ``RecoveryFallback`` subtree will be known as the ``Recovery`` subtree.
+This can be represented in the following way:
+
+|
+
+ .. image:: ../images/walkthrough/overall_bt_w_breakdown.png
+ :align: center
+
+|
+
+The ``Navigation`` subtree mainly involves actual navigation behavior:
+
+- selecting planners / controllers / goal checkers / path handlers / progress checkers plugins
+
+- calculating a path
+
+- following a path
+
+- contextual recovery behaviors for each of the above primary navigation behaviors
+
+The ``Recovery`` subtree includes behaviors for system level failures or items that were not easily dealt with internally.
+
+The overall BT will (hopefully) spend most of its time in the ``Navigation`` subtree. If either of the two main behaviors in the ``Navigation`` subtree fail
+(path calculation or path following), contextual recoveries will be attempted.
+
+If the contextual recoveries were still not enough, the ``Navigation`` subtree will return ``FAILURE``.
+The system will move on to the ``Recovery`` subtree to attempt to clear any system level navigation failures.
+
+This happens until the ``number_of_retries`` for the parent ``RecoveryNode`` is exceeded (which by default is 6).
+
+.. code-block:: xml
+
+
+
+Navigation Subtree
+======================
+
+Now that we have gone over the control flow between the ``Navigation`` subtree and the ``Recovery`` subtree, let's focus on the Navigation subtree.
+
+|
+
+ .. image:: ../images/walkthrough/navigation_subtree.png
+ :align: center
+
+|
+
+The XML of this subtree is as follows:
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+This subtree has two primary actions ``ComputePathToPose`` and ``FollowPath``.
+If either of these two actions fail, they will attempt to clear the failure contextually.
+The crux of the tree can be represented with only one parent and two children nodes like this:
+
+|
+
+ .. image:: ../images/walkthrough/navigation_subtree_bare.png
+ :align: center
+
+|
+
+The parent ``PipelineSequence`` node allows the ``ComputePathToPose`` to be ticked, and once that succeeds, ``FollowPath`` to be ticked.
+While the ``FollowPath`` subtree is being ticked, the ``ComputePathToPose`` subtree will be ticked as well. This allows for the path to be recomputed as the robot moves around.
+
+Both the ``ComputePathToPose`` and the ``FollowPath`` follow the same general structure.
+
+- Do the action
+
+- If the action fails, try to see if we can contextually recover
+
+The below is the ``ComputePathToPose`` subtree:
+
+|
+
+ .. image:: ../images/walkthrough/contextual_recoveries.png
+ :align: center
+
+|
+
+The parent ``RecoveryNode`` controls the flow between the action, and the contextual recovery subtree.
+The contextual recoveries for both ``ComputePathToPose`` and ``FollowPath`` involve checking if the recovery could help clear the error code and clearing the relevant costmap.
+
+Consider changing the ``number_of_retries`` parameter in the parent ``RecoveryNode`` control node if your application can tolerate more attempts at contextual recoveries before moving on to system-level recoveries.
+
+The only differences in the BT subtree of ``ComputePathToPose`` and ``FollowPath`` are outlined below:
+
+- The action node in the subtree:
+ - The ``ComputePathToPose`` subtree centers around the ``ComputePathToPose`` action.
+ - The ``FollowPath`` subtree centers around the ``FollowPath`` action.
+
+- The use of conditional flow control (``Fallback``):
+ - The ``ComputePathToPose`` subtree incorporates logic to handle the robot's behavior as it nears the goal. When using feasible planners, re-planning within a small radius (e.g., < 1.0m) can be detrimental due to state estimation drift or path-tracking errors, often resulting in unnecessary "looping" behaviors.
+ To prevent this, the subtree uses a ``ReactiveSequence`` with the ``IsGoalNearby`` node. If the robot is within a specified proximity threshold and the current path remains valid (i.e., no new obstacles), the subtree will skip the re-planning request. This allows the robot to smoothly transition into its final approach using its current path without unnecessary re-planning.
+ - The ``FollowPath`` subtree, by contrast, does not typically use this conditional gating. Once a path is available, the controller is invoked directly to produce velocity commands.
+- The ``RateController`` that decorates the ``ComputePathToPose`` subtree
+ The ``RateController`` decorates the ``ComputePathToPose`` subtree to keep planning at the specified frequency. The default frequency for this BT is 1 hz.
+ This is done to prevent the BT from flooding the planning server with too many useless requests at the tree update rate (100Hz). Consider changing this frequency to something higher or lower depending on the application and the computational cost of
+ calculating the path. There are other decorators that can be used instead of the ``RateController``. Consider using the ``SpeedController`` or ``DistanceController`` decorators if appropriate.
+
+- The costmap that is being cleared within the contextual recovery:
+ - The ``ComputePathToPose`` subtree clears the global costmap. The global costmap is the relevant costmap in the context of the planner
+ - The ``FollowPath`` subtree clears the local costmap. The local costmap is the relevant costmap in the context of the controller
+
+This subtree also utilizes the ``PlannerSelector``, ``ControllerSelector``, ``GoalCheckerSelector``, ``ProgressCheckerSelector``, and ``PathHandlerSelector`` nodes. These nodes offer flexibility for applications that need to adjust navigation behavior on the fly.
+
+Recovery Subtree
+================
+
+The ``Recovery`` subtree is the second big "half" of the Nav2 default ``navigate_to_pose_w_replanning_and_recovery.xml`` tree.
+In short, this subtree is triggered when the ``Navigation`` subtree returns ``FAILURE`` and controls the recoveries at the system level (in the case the contextual recoveries in the ``Navigation`` subtree were not sufficient).
+
+|
+
+ .. image:: ../images/walkthrough/recovery_subtree.png
+ :align: center
+
+|
+
+And the XML snippet:
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+At the top level, a ``Sequence`` ensures the following steps are executed in order:
+
+- A ``Fallback`` node first checks whether planner or controller recoveries might help resolve the issue. If either returns ``SUCCESS``, the fallback succeeds and the sequence proceeds to the next step.
+
+- A ``ReactiveFallback`` that controls the flow between the rest of the system wide recoveries, and asynchronously checks if a new goal has been received.
+
+If at any point the goal gets updated, this subtree will halt all children and return ``SUCCESS``. This allows for quick reactions to new goals and preempt currently executing recoveries.
+This should look familiar to the contextual recovery portions of the ``Navigation`` subtree. This is a common BT pattern to handle the situation "Unless 'this condition' happens, Do action A".
+
+These condition nodes can be extremely powerful and are typically paired with ``ReactiveFallback``. It can be easy to imagine wrapping this whole ``navigate_to_pose_w_replanning_and_recovery`` tree
+in a ``ReactiveFallback`` with a ``isBatteryLow`` condition -- meaning the ``navigate_to_pose_w_replanning_and_recovery`` tree will execute *unless* the battery becomes low (and then enter a different subtree for docking to recharge).
+
+If the goal is never updated, the behavior tree will go on to the ``RoundRobin`` node. These are the default four system-level recoveries in the BT are:
+
+- A sequence that clears both costmaps (local, and global)
+
+- ``Spin`` action
+
+- ``Wait`` action
+
+- ``BackUp`` action
+
+Upon ``SUCCESS`` of any of the four children of the parent ``RoundRobin``, the robot will attempt to renavigate in the ``Navigation`` subtree.
+If this renavigation was not successful, the next child of the ``RoundRobin`` will be ticked.
+
+For example, let's say the robot is stuck and the ``Navigation`` subtree returns ``FAILURE``:
+(for the sake of this example, let's assume that the goal is never updated).
+
+1. The Costmap clearing sequence in the ``Recovery`` subtree is attempted, and returns ``SUCCESS``. The robot now moves to ``Navigation`` subtree again
+
+2. Let's assume that clearing both costmaps was not sufficient, and the ``Navigation`` subtree returns ``FAILURE`` once again. The robot now ticks the ``Recovery`` subtree
+
+3. In the ``Recovery`` subtree, the ``Spin`` action will be ticked. If this returns ``SUCCESS``, then the robot will return to the main ``Navigation`` subtree *BUT* let's assume that the ``Spin`` action returns ``FAILURE``. In this case, the tree will *remain* in the ``Recovery`` subtree
+
+4. Let's say the next action, ``Wait`` returns ``SUCCESS``. The robot will then move on to the ``Navigation`` subtree
+
+5. Assume the ``Navigation`` subtree returns ``FAILURE`` (clearing the costmaps, attempting a spin, and waiting were *still* not sufficient to recover the system). The robot will move onto the ``Recovery`` subtree and attempt the ``BackUp`` action. Let's say that the robot attempts the ``BackUp`` action and was able to successfully complete the action. The ``BackUp`` action node returns ``SUCCESS`` and so now we move on to the Navigation subtree again.
+
+6. In this hypothetical scenario, let's assume that the ``BackUp`` action allowed the robot to successfully navigate in the ``Navigation`` subtree, and the robot reaches the goal. In this case, the overall BT will still return ``SUCCESS``.
+
+If the ``BackUp`` action was not sufficient enough to allow the robot to become un-stuck, the above logic will go on indefinitely until the ``number_of_retries`` in the parent of the ``Navigate`` subtree and ``Recovery`` subtree is exceeded, or if all the system-wide recoveries in the ``Recovery`` subtree return ``FAILURE`` (this is unlikely, and likely points to some other system failure).
diff --git a/behavior_trees/overview/nav2_specific_nodes.rst b/behavior_trees/overview/nav2_specific_nodes.rst
new file mode 100644
index 0000000000..b36c0bf78c
--- /dev/null
+++ b/behavior_trees/overview/nav2_specific_nodes.rst
@@ -0,0 +1,385 @@
+.. _nav2_specific_nodes:
+
+Introduction To Nav2 Specific Nodes
+===================================
+.. warning::
+ Vocabulary can be a large point of confusion here when first starting out.
+ - A ``Node`` when discussing BTs is entirely different than a ``Node`` in the ROS 2 context
+
+ - An ``ActionNode`` in the context of BTs is not necessarily connected to an Action Server in the ROS 2 context (but often it is)
+
+There are quite a few custom Nav2 BT nodes that are provided to be used in the Nav2 specific fashion. Some commonly used Nav2 nodes will be described below.
+The full list of custom BT nodes can be found in the `nav2_behavior_tree plugins folder `_.
+The `configuration guide <../../configuration/packages/configuring-bt-xml.html>`_ can also be quite useful.
+
+Action Nodes
+------------
+
+* ComputePathToPose - ComputePathToPose Action Server Client (Planner Interface)
+
+* FollowPath - FollowPath Action Server Client (Controller Interface)
+
+* Spin, Wait, Backup - Behaviors Action Server Client
+
+* ClearCostmapService - ClearCostmapService Server Clients
+
+Upon completion, these action nodes will return ``SUCCESS`` if the action server believes the action has been completed correctly, ``RUNNING`` when still running, and will return ``FAILURE`` otherwise. Note that in the above list,
+the `ClearCostmapService` action node is *not* an action server client, but a service client.
+
+Condition Nodes
+---------------
+
+* GoalUpdated - Checks if the goal on the goal topic has been updated
+
+* GoalReached - Checks if the goal has been reached
+
+* InitialPoseReceived - Checks to see if a pose on the ``initial_pose`` topic has been received
+
+* isBatteryLow - Checks to see if the battery is low by listening on the battery topic
+
+The above list of condition nodes can be used to probe particular aspects of the system. Typically they will return ``SUCCESS`` if the condition is true and ``FAILURE`` otherwise.
+The key condition that is used in the default Nav2 BT is ``GoalUpdated`` which is checked asynchronously within particular subtrees. This condition node allows for the behavior described as "If the goal has been updated, then we must replan".
+Condition nodes are typically paired with ReactiveFallback nodes.
+
+Decorator Nodes
+---------------
+
+* Distance Controller - Will tick children nodes every time the robot has traveled a certain distance
+
+* Rate Controller - Controls the ticking of its child node at a constant frequency. The tick rate is an exposed port
+
+* Goal Updater - Will update the goal of children nodes via ports on the BT
+
+* Single Trigger - Will only tick its child node once, and will return ``FAILURE`` for all subsequent ticks
+
+* Speed Controller - Controls the ticking of its child node at a rate proportional to the robot's speed
+
+Control: PipelineSequence
+-------------------------
+The ``PipelineSequence`` control node re-ticks previous children when a child returns ``RUNNING``.
+This node is similar to the ``Sequence`` node, with the additional property that the children prior to the "current" are re-ticked, (resembling the flow of water in a pipe).
+If at any point a child returns ``FAILURE``, all children will be halted and the parent node will also return ``FAILURE``. Upon ``SUCCESS`` of the **last node** in the sequence, this node will halt and return ``SUCCESS``.
+
+To explain this further, here is an example BT that uses PipelineSequence.
+
+|
+
+ .. image:: ../images/control_pipelineSequence.png
+ :align: center
+
+|
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+1. ``Action_A``, ``Action_B``, and ``Action_C`` are all ``IDLE``.
+2. When the parent PipelineSequence is first ticked, let's assume ``Action_A`` returns ``RUNNING``. The parent node will now return ``RUNNING`` and no other nodes are ticked.
+
+|
+
+ .. image:: ../images/control_pipelineSequence_RUNNING_IDLE_IDLE.png
+ :align: center
+
+|
+
+3. Now, let's assume ``Action_A`` returns ``SUCCESS``, ``Action_B`` will now get ticked and will return ``RUNNING``. ``Action_C`` has not yet been ticked so will return ``IDLE``.
+
+|
+
+ .. image:: ../images/control_pipelineSequence_SUCCESS_RUNNING_IDLE.png
+ :align: center
+
+|
+
+4. ``Action_A`` gets ticked again and returns ``RUNNING``, and ``Action_B`` gets re-ticked and returns ``SUCCESS`` and therefore the BT goes on to tick ``Action_C`` for the first time. Let's assume ``Action_C`` returns ``RUNNING``. The retick-ing of ``Action_A`` is what makes PipelineSequence useful.
+
+|
+
+ .. image:: ../images/control_pipelineSequence_RUNNING_SUCCESS_RUNNING.png
+ :align: center
+
+|
+
+5. All actions in the sequence will be re-ticked. Let's assume ``Action_A`` still returns ``RUNNING``, where as ``Action_B`` returns ``SUCCESS`` again, and ``Action_C`` now returns ``SUCCESS`` on this tick. The sequence is now complete, and therefore ``Action_A`` is halted, even though it was still ``RUNNING``.
+
+|
+
+ .. image:: ../images/control_pipelineSequence_RUNNING_SUCCESS_SUCCESS.png
+ :align: center
+
+|
+
+Recall that if ``Action_A``, ``Action_B``, or ``Action_C`` returned ``FAILURE`` at any point of time, the parent would have returned ``FAILURE`` and halted any children as well.
+
+For additional details regarding the ``PipelineSequence`` please see the `PipelineSequence configuration guide <../../configuration/packages/bt-plugins/controls/PipelineSequence.html>`_.
+
+Control: Recovery
+---------------------
+The Recovery control node has only two children and returns ``SUCCESS`` if and only if the first child returns ``SUCCESS``.
+If the first child returns ``FAILURE``, the second child will be ticked. This loop will continue until either:
+
+* The first child returns ``SUCCESS`` (which results in ``SUCCESS`` of the parent node)
+
+* The second child returns ``FAILURE`` (which results in ``FAILURE`` of the parent node)
+
+* The ``number_of_retries`` input parameter is violated
+
+This node is usually used to link together an action, and a recovery action as the name suggests. The first action will typically be the "main" behavior,
+and the second action will be something to be done in case of ``FAILURE`` of the main behavior. Often, the ticking of the second child action will promote the chance the first action will succeed.
+
+|
+
+ .. image:: ../images/control_recovery_node.png
+ :align: center
+
+|
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+In the above example, let's assume ``ComputePathToPose`` fails. ``ClearLocalCostmap`` will be ticked in response, and return ``SUCCESS``.
+Now that we have cleared the costmap, let's say the robot is correctly able to compute the path and ``ComputePathToPose`` now returns ``SUCCESS``. Then, the parent RecoveryNode will also return ``SUCCESS`` and the BT will be complete.
+
+For additional details regarding the ``RecoveryNode`` please see the `RecoveryNode configuration guide <../../configuration/packages/bt-plugins/controls/RecoveryNode.html>`_.
+
+Control: RoundRobin
+-----------------------
+The RoundRobin control node ticks its children in a round robin fashion until a child returns ``SUCCESS``, in which the parent node will also return ``SUCCESS``.
+If all children return ``FAILURE`` so will the parent RoundRobin.
+
+Here is an example BT we will use to walk through the concept.
+
+|
+
+ .. image:: ../images/control_round_robin.png
+ :align: center
+
+|
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+1. All the nodes start at ``IDLE``
+
+|
+
+ .. image:: ../images/control_round_robin_IDLE_IDLE_IDLE.png
+ :align: center
+
+|
+
+2. Upon tick of the parent node, the first child (``Action_A``) is ticked. Let's assume on tick the child returns ``RUNNING``.
+In this case, no other children are ticked and the parent node returns ``RUNNING`` as well.
+
+|
+
+ .. image:: ../images/control_round_robin_RUNNING_IDLE_IDLE.png
+ :align: center
+
+|
+
+3. Upon the next tick, let's assume that ``Action_A`` returns ``FAILURE``.
+This means that ``Action_B`` will get ticked next, and ``Action_C`` remains unticked.
+Let's assume ``Action_B`` returns ``RUNNING`` this time. That means the parent RoundRobin node will also return ``RUNNING``.
+
+|
+
+ .. image:: ../images/control_round_robin_FAILURE_RUNNING_IDLE.png
+ :align: center
+
+|
+
+4. Upon this next tick, let's assume that ``Action_B`` returns ``SUCCESS``. The parent RoundRobin will now halt all children and return ``SUCCESS``.
+The parent node retains this state information, and will tick ``Action_C`` upon the next tick rather than start from ``Action_A`` like Step 2 did.
+
+|
+
+ .. image:: ../images/control_round_robin_FAILURE_SUCCESS_IDLE.png
+ :align: center
+
+|
+
+5. On this tick, let's assume ``Action_C`` returns ``RUNNING``, and so does the parent RoundRobin. No other nodes are ticked.
+
+|
+
+ .. image:: ../images/control_round_robin_FAILURE_SUCCESS_RUNNING.png
+ :align: center
+
+|
+
+
+6. On this last tick, let's assume ``Action_C`` returns ``FAILURE``. The parent will circle and tick ``Action_A`` again. ``Action_A`` returns ``RUNNING`` and so will the parent RoundRobin node. This pattern will continue indefinitely unless all children return ``FAILURE``.
+
+|
+
+ .. image:: ../images/control_round_robin_RUNNING_IDLE_FAILURE.png
+ :align: center
+
+|
+
+For additional details regarding the ``RoundRobin`` please see the `RoundRobin configuration guide <../../configuration/packages/bt-plugins/controls/RoundRobin.html>`_.
+
+Control: NonblockingSequence
+----------------------------
+
+The ``NonblockingSequence`` control node ticks all children as long as they return ``SUCCESS`` or ``RUNNING``. This node is similar to the ``PipelineSequence`` node, with the additional property that all children are re-ticked as long as ``SUCCESS`` or ``RUNNING``, instead of stopping at the latest ``RUNNING`` node. If at any point a child returns ``FAILURE``, all children will be halted and the parent node will also return ``FAILURE``. Upon ``SUCCESS`` of **all nodes** in the sequence, this node will halt and return ``SUCCESS``.
+
+Note that even if a node returns ``SUCCESS`` in a previous tick, on the next tick, the ``NonblockingSequence`` will still tick the successful node, possibly restarting it. This is to ensure that successful nodes do not latch a stale state while waiting for another long running node to be complete
+
+To explain this further, here is an example BT that uses NonblockingSequence.
+
+|
+
+ .. image:: ../images/control_nonblockingSequence.png
+ :align: center
+
+
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+1. ``Action_A``, ``Action_B``, and ``Action_C`` are all ``IDLE``.
+
+2. When the parent NonblockingSequence is first ticked, let's assume ``Action_A`` returns ``RUNNING``. Following this, ``Action_B`` will be ticked, and let's assume it also returns ``RUNNING``. Finally, ``Action_C`` will be ticked, and let's assume it also returns ``RUNNING``. With three ``RUNNING`` children, the NonblockingSequence will return ``RUNNING``
+
+|
+
+ .. image:: ../images/control_nonblockingSequence_RUNNING_RUNNING_RUNNING.png
+ :align: center
+
+|
+
+3. On the next tick of the the parent NonblockingSequence, all actions in the sequence will be re-ticked. Let's assume ``Action_A`` returns ``SUCCESS``, and ``Action_B`` and ``Action_C`` still return ``RUNNING``. In this configuration, the NonblockingSequence still returns ``RUNNING``, as there are two nodes in the children that are ``RUNNING``
+
+|
+
+ .. image:: ../images/control_nonblockingSequence_SUCCESS_RUNNING_RUNNING.png
+ :align: center
+
+|
+
+4. Now, let's assume on the next re-tick, ``Action_A`` and ``Action_C`` return ``SUCCESS``, and ``Action_B`` returns ``RUNNING``. In this configuration, the NonblockingSequence still returns ``RUNNING``, as there is still one child node that is ``RUNNING``. Note that ``ActionA`` was re-ticked and again returned ``SUCCESS`` in this case, it did not skip due to previously returning `SUCCESS``.
+
+|
+
+ .. image:: ../images/control_nonblockingSequence_SUCCESS_RUNNING_SUCCESS.png
+ :align: center
+
+|
+
+5. Finally, Let's assume ``Action_A``, ``Action_B``, and ``Action_C`` all return ``SUCCESS``. The sequence is now complete, and therefore ``Action_A``, ``Action_B``, and ``Action_C`` are all halted and NonblockingSequence returns ``SUCCESS``.
+
+|
+
+ .. image:: ../images/control_nonblockingSequence_SUCCESS_SUCCESS_SUCCESS.png
+ :align: center
+
+|
+
+Recall that if ``Action_A``, ``Action_B``, or ``Action_C`` returned ``FAILURE`` at any point of time, the parent would have returned ``FAILURE`` and halted any children as well.
+
+For additional details regarding the ``NonblockingSequence`` please see the `NonblockingSequence configuration guide <../../configuration/packages/bt-plugins/controls/NonblockingSequence.html>`_.
+
+Control: PersistentSequence
+----------------------------
+
+The ``PersistentSequence`` is similar to the ``Sequence`` node, but it stores the index of the last running child in the blackboard (key: "current_child_idx"), and it does not reset the index on halt.
+
+For more information see the ``Sequence`` BT node in BT.CPP.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+Control: PauseResumeController
+------------------------------
+
+The ``PauseResumeController`` is a control node that adds pause and resume functionality to a behavior tree through service calls.
+
+It has one mandatory child for the RESUMED, and three optional for the PAUSED state, the ON_PAUSE event and the ON_RESUME event.
+It has two input ports:
+
+- ``pause_service_name``: name of the service to pause
+- ``resume_service_name``: name of the service to resume
+
+1. The controller starts in RESUMED state, and ticks it until it returns success.
+2. When the pause service is called, ON_PAUSE is ticked until completion, then the controller switches to PAUSED state.
+3. In PAUSED state the PAUSED child is ticked until the state is changed, or until it returns failure.
+4. When the resume service is called, ON_RESUME is ticked until completion, then the controller switches back to RESUMED state.
+
+The controller only returns success when the RESUMED child returns success. The controller returns failure if any child returns failure. In any other case, it returns running.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+When the ON_PAUSE and ON_RESUME branches fail, the controller will return failure, halt, and the state will be reset to RESUMED. It might be desirable to retry the transition a few times before failing for real, which functionality is not built in the controller node, but is easily achievable by adding a retry node in the BT:
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/behavior_trees/trees/follow_point.rst b/behavior_trees/trees/follow_point.rst
new file mode 100644
index 0000000000..beacf0c213
--- /dev/null
+++ b/behavior_trees/trees/follow_point.rst
@@ -0,0 +1,41 @@
+.. _behavior_tree_follow_point:
+
+Follow Dynamic Point
+####################
+
+
+This behavior tree implements a navigation behavior from a starting point, attempting to follow a dynamic point over time.
+This "dynamic point" could be a person, another robot, a virtual carrot, anything.
+The only requirement is that the pose you'd like to follow is published to the topic outlined in the ``GoalUpdater`` BT node.
+
+In this tree, we replan at 1 hz just as we did in :ref:`behavior_tree_nav_to_pose` using the ``ComputePathToPose`` node.
+However, this time when we replan, we update the ``goal`` based on the newest information in on the updated goal topic.
+After we plan a path to this dynamic point, we use the ``TruncatePath`` node to remove path points from the end of the path near the dynamic point.
+This behavior tree node is useful so that the robot always remains at least ``distance`` away from the obstacle, even if it stops.
+It also smooths out any off path behavior involved with trying to path plan towards a probably occupied space in the costmap.
+
+After the new path to the dynamic point is computed and truncated, it is again passed to the controller via the ``FollowPath`` node.
+However, note that it is under a ``KeepRunningUntilFailure`` decorator node ensuring the controller continues to execute until a failure mode.
+This behavior tree will execute infinitely in time until the navigation request is preempted or cancelled.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/getting_started/nav2_behavior_trees/trees/odometry_calibration/assets/odometry_calibration.gif b/behavior_trees/trees/gifs/odometry_calibration.gif
similarity index 100%
rename from docs/getting_started/nav2_behavior_trees/trees/odometry_calibration/assets/odometry_calibration.gif
rename to behavior_trees/trees/gifs/odometry_calibration.gif
diff --git a/behavior_trees/trees/nav_through_poses_recovery.rst b/behavior_trees/trees/nav_through_poses_recovery.rst
new file mode 100644
index 0000000000..be4b4f7640
--- /dev/null
+++ b/behavior_trees/trees/nav_through_poses_recovery.rst
@@ -0,0 +1,100 @@
+.. _behavior_tree_nav_through_poses:
+
+Navigate Through Poses
+######################
+
+This behavior tree implements a navigation behavior from a starting point, through many intermediary hard pose constraints, to a final goal in freespace.
+It contains both use of custom behaviors for recovery in specific sub-contexts as well as a global recovery subtree for system-level failures.
+It also provides the opportunity for users to retry tasks multiple times before returning a failed state.
+
+The ``ComputePathThroughPoses`` and ``FollowPath`` BT nodes both also specify their algorithms to utilize.
+By convention we name these by the style of algorithms that they are (e.g. not ``DWB`` but rather ``FollowPath``) such that a behavior tree or application developer need not worry about the technical specifics. They just want to use a path following controller.
+
+In this behavior tree, we attempt to retry the entire navigation task 6 times before returning to the caller that the task has failed.
+This allows the navigation system ample opportunity to try to recovery from failure conditions or wait for transient issues to pass, such as crowding from people or a temporary sensor failure.
+
+In nominal execution, this will replan the path at every 3 seconds if not close enough to goal and pass that path onto the controller, similar to the behavior tree in :ref:`behavior_trees`.
+The planner though is now ``ComputePathThroughPoses`` taking a vector, ``goals``, rather than a single pose ``goal`` to plan to.
+The ``RemovePassedGoals`` node is used to cull out ``goals`` that the robot has passed on its path.
+In this case, it is set to remove a pose from the poses when the robot is within ``0.5`` of the goal and it is the next goal in the list.
+Additionally, it records the status of each waypoint (e.g. ``PENDING``, ``COMPLETED``, ``SKIPPED`` or ``FAILED``) in the ``waypoint_statuses``.
+This is implemented such that replanning can be computed after the robot has passed by some of the intermediary poses and not continue to try to replan through them in the future.
+This time, if the planner fails, it will trigger contextually aware recoveries in its subtree, clearing the global costmap.
+Additional recoveries can be added here for additional context-specific recoveries, such as trying another algorithm.
+
+Similarly, the controller has similar logic. If it fails, it also attempts a costmap clearing of the local costmap impacting the controller.
+It is worth noting the ``GoalUpdated`` node in the reactive fallback.
+This allows us to exit recovery conditions when a new goal has been passed to the navigation system through a preemption.
+This ensures that the navigation system will be very responsive immediately when a new goal is issued, even when the last goal was in an attempted recovery.
+
+If these contextual recoveries fail, this behavior tree enters the recovery subtree.
+This subtree is reserved for system-level failures to help resolve issues like the robot being stuck or in a bad spot.
+This subtree also has the ``GoalUpdated`` BT node it ticks every iteration to ensure responsiveness of new goals.
+Next, the recovery subtree will tick the costmap clearing operations, spinning, waiting, and backing up.
+After each of the recoveries in the subtree, the main navigation subtree will be reattempted.
+If it continues to fail, the next recovery in the recovery subtree is ticked.
+
+While this behavior tree does not make use of it, the ``PlannerSelector``, ``ControllerSelector``, ``GoalCheckerSelector``, ``ProgressCheckerSelector``, and ``PathHandlerSelector`` behavior tree nodes can also be helpful. Rather than hardcoding the algorithm to use (``GridBased`` and ``FollowPath``), these behavior tree nodes will allow a user to dynamically change the algorithm used in the navigation system via a ROS topic. It may be instead advisable to create different subtree contexts using condition nodes with specified algorithms in their most useful and unique situations. However, the selector nodes can be a useful way to change algorithms from an external application rather than via internal behavior tree control flow logic. It is better to implement changes through behavior tree methods, but we understand that many professional users have external applications to dynamically change settings of their navigators.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/behavior_trees/trees/nav_to_pose_and_pause_near_goal_obstacle.rst b/behavior_trees/trees/nav_to_pose_and_pause_near_goal_obstacle.rst
new file mode 100644
index 0000000000..ef4c244d52
--- /dev/null
+++ b/behavior_trees/trees/nav_to_pose_and_pause_near_goal_obstacle.rst
@@ -0,0 +1,88 @@
+Navigate To Pose and Pause Near Goal-Obstacle
+#############################################
+
+.. note:: As a prerequisite, we encourage the users to go through the `Behavior Tree documentation `_, which explains about different behaviors nodes used in these trees such as ``ReactiveSequence``, ``SequenceWithMemory`` and ``RetryUntilSuccessful``.
+
+This behavior tree is a soft extension to the :ref:`behavior_tree_nav_to_pose`.
+Apart from the functionalities of :ref:`behavior_tree_nav_to_pose`, this behavior tree allows the robot to efficiently handle an obstacle (e.g. forklift, person, or other temporary obstacles) close to the goal by pausing the robot's navigation and wait for a user-specified time to check if the obstacle has cleared.
+If the obstacle has moved during the waiting time, the robot will continue to the goal taking the shorter path. If the obstacle has not moved during the waiting time or the waiting time expires, then the robot will use the longer path around to reach the final goal location.
+Ultimately, for a given task, this behavior tree aids in solving the problem of long cycle time, which is caused because of the long path generated due to the temporary obstacles present close to the goal location.
+
+The behavior tree is depicted in the image below.
+From the image, it can be noted that there is an additional branch in the Navigation Subtree known as ``MonitorAndFollowPath``. This branch is created with the intention for the users to perform any kind of monitoring behavior that their robot should exhibit.
+In this particular BT, the monitoring branch is exclusively utilized by ``PathLongerOnApproach`` BT node for checking if the global planner has decided to plan a significantly longer path for the robot on approaching the user-specified goal proximity.
+If there is no significantly longer path, the monitor node goes into the ``FollowPath`` recovery node, which then generates the necessary control commands.
+
+.. image:: ../images/walkthrough/patience_and_recovery.png
+
+Once there is a significantly longer path, the child node for the ``PathLongerOnApproach`` node ticks.
+The child node is a ``RetryUntilSuccessful`` decorator node, which inturns have a ``SequenceWithMemory`` node as its child.
+Firstly, the ``SequenceWithMemory`` node cancels the controller server by ticking the ``CancelControl`` node. The cancellation of the controller server halts the further navigation of the robot.
+Next, the ``SequenceWithMemory`` node ticks the ``Wait`` node, which enables the robot to wait for the given user-specified time.
+Here we need to note that, the ``MonitorAndFollowPath`` is a ``ReactiveSequence`` node, therefore the ``PathLongerOnApproach`` node needs to return SUCCESS, before the ``FollowPath`` node can be ticked once again.
+
+In the below GIF, it can be seen that the robot is approaching the goal location, but it found an obstacle in the goal proximity, because of which the global planner, plans a longer path around.
+This is the point where the ``PathLongerOnApproach`` ticks and ticks its children, consequently cancelling the ``controller_server`` and waiting to see if the obstacle clears up.
+In the below scenario, the obstacles do not clear, causing the robot to take the longer path.
+
+.. image:: ../../migration/images/nav2_patience_near_goal_and_go_around.gif
+
+Alternatively, if the obstacles are cleared, then there is a shorter path generated by the global planner.
+Now, the ``PathLongerOnApproach`` returns SUCCESS, that cause the ``FollowPath`` to continue with the robot navigation.
+
+.. image:: ../../migration/images/nav2_patience_near_goal_and_clear_obstacle.gif
+
+Apart from the above scenarios, we also need to note that, the robot will take the longer path to the goal location if the obstacle does not clear up in the given user-specific wait time.
+
+In conclusion, this particular BT would serve, both as an example and ready-to-use BT for an organizational specific application, that wishes to optimize its process cycle time.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A complete demo of this BT can be seen in the video below:
+
+.. raw:: html
+
+
diff --git a/behavior_trees/trees/nav_to_pose_recovery.rst b/behavior_trees/trees/nav_to_pose_recovery.rst
new file mode 100644
index 0000000000..8560ea5b00
--- /dev/null
+++ b/behavior_trees/trees/nav_to_pose_recovery.rst
@@ -0,0 +1,93 @@
+.. _behavior_tree_nav_to_pose:
+
+Navigate To Pose
+################
+
+This behavior tree implements a significantly more mature version of the behavior tree on :ref:`behavior_trees`.
+It navigates from a starting point to a single point goal in freespace.
+It contains both use of custom recovery behaviors in specific sub-contexts as well as a global recovery subtree for system-level failures.
+It also provides the opportunity for users to retry tasks multiple times before returning a failed state.
+
+The ``ComputePathToPose`` and ``FollowPath`` BT nodes both also specify their algorithms to utilize.
+By convention we name these by the style of algorithms that they are (e.g. not ``DWB`` but rather ``FollowPath``) such that a behavior tree or application developer need not worry about the technical specifics. They just want to use a path following controller.
+
+In this behavior tree, we attempt to retry the entire navigation task 6 times before returning to the caller that the task has failed.
+This allows the navigation system ample opportunity to try to recovery from failure conditions or wait for transient issues to pass, such as crowding from people or a temporary sensor failure.
+
+In nominal execution, this will replan the path at every second if not close enough to goal and pass that path onto the controller, similar to the behavior tree in :ref:`behavior_trees`.
+However, this time, if the planner fails, it will trigger contextually aware recovery behaviors in its subtree, clearing the global costmap.
+Additional recovery behaviors can be added here for additional context-specific recoveries, such as trying another algorithm.
+
+Similarly, the controller has similar logic. If it fails, it also attempts a costmap clearing of the local costmap impacting the controller.
+It is worth noting the ``GoalUpdated`` node in the reactive fallback.
+This allows us to exit recovery conditions when a new goal has been passed to the navigation system through a preemption.
+This ensures that the navigation system will be very responsive immediately when a new goal is issued, even when the last goal was in an attempted recovery.
+
+If these contextual recoveries fail, this behavior tree enters the recovery subtree.
+This subtree is reserved for system-level failures to help resolve issues like the robot being stuck or in a bad spot.
+This subtree also has the ``GoalUpdated`` BT node it ticks every iteration to ensure responsiveness of new goals.
+Next, the recovery subtree will the recoveries: costmap clearing operations, spinning, waiting, and backing up.
+After each of the recoveries in the subtree, the main navigation subtree will be reattempted.
+If it continues to fail, the next recovery in the recovery subtree is ticked.
+
+While this behavior tree does not make use of it, the ``PlannerSelector``, ``ControllerSelector``, ``GoalCheckerSelector``, ``ProgressCheckerSelector``, and ``PathHandlerSelector`` behavior tree nodes can also be helpful. Rather than hardcoding the algorithm to use (``GridBased`` and ``FollowPath``), these behavior tree nodes will allow a user to dynamically change the algorithm used in the navigation system via a ROS topic. It may be instead advisable to create different subtree contexts using condition nodes with specified algorithms in their most useful and unique situations. However, the selector nodes can be a useful way to change algorithms from an external application rather than via internal behavior tree control flow logic. It is better to implement changes through behavior tree methods, but we understand that many professional users have external applications to dynamically change settings of their navigators.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/behavior_trees/trees/nav_to_pose_with_consistent_replanning_and_if_path_becomes_invalid.rst b/behavior_trees/trees/nav_to_pose_with_consistent_replanning_and_if_path_becomes_invalid.rst
new file mode 100644
index 0000000000..ac88c418c5
--- /dev/null
+++ b/behavior_trees/trees/nav_to_pose_with_consistent_replanning_and_if_path_becomes_invalid.rst
@@ -0,0 +1,77 @@
+.. _behavior_tree_nav_to_pose_and_replan_if_path_invalid:
+
+Navigate To Pose With Consistent Replanning And If Path Becomes Invalid
+#######################################################################
+
+This behavior tree implements a significantly more mature version of the behavior tree on :ref:`behavior_trees`.
+It navigates from a starting point to a single point goal in freespace.
+It contains both use of custom recoveries in specific sub-contexts as well as a global recovery subtree for system-level failures.
+It also provides the opportunity for users to retry tasks multiple times before returning a failed state.
+
+The ``ComputePathToPose`` and ``FollowPath`` BT nodes both also specify their algorithms to utilize.
+By convention we name these by the style of algorithms that they are (e.g. not ``DWB`` but rather ``FollowPath``) such that a behavior tree or application developer need not worry about the technical specifics. They just want to use a path following controller.
+
+In this behavior tree, we attempt to retry the entire navigation task 6 times before returning to the caller that the task has failed.
+This allows the navigation system ample opportunity to try to recovery from failure conditions or wait for transient issues to pass, such as crowding from people or a temporary sensor failure.
+
+In nominal execution, replanning can be triggered by an a invalid previous path, a new goal or if a new path has not been created for 10 seconds.
+If the planner or controller fails, it will trigger contextually aware recoveries in its subtree.
+Currently, the recoveries will clear the global costmap if the planner fails and clear the local costmap if the controller fails.
+Additional context-specific recoveries can be added to these subtrees.
+
+If these contextual recoveries fail, this behavior tree enters the recovery subtree.
+This subtree is reserved for system-level failures to help resolve issues like the robot being stuck or in a bad spot.
+This subtree has the ``GoalUpdated`` BT node which ticks every iteration to ensure responsiveness of new goals.
+Next, the recovery subtree will attempt the following recoveries: costmap clearing operations, spinning, waiting, and backing up.
+After each of the recoveries in the subtree, the main navigation subtree will be reattempted.
+If it continues to fail, the next recovery in the recovery subtree is ticked.
+
+While this behavior tree does not make use of it, the ``PlannerSelector``, ``ControllerSelector``, and ``GoalCheckerSelector`` behavior tree nodes can also be helpful. Rather than hardcoding the algorithm to use (``GridBased`` and ``FollowPath``), these behavior tree nodes will allow a user to dynamically change the algorithm used in the navigation system via a ROS topic. It may be instead advisable to create different subtree contexts using condition nodes with specified algorithms in their most useful and unique situations. However, the selector nodes can be a useful way to change algorithms from an external application rather than via internal behavior tree control flow logic. It is better to implement changes through behavior tree methods, but we understand that many professional users have external applications to dynamically change settings of their navigators.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/behavior_trees/trees/navigate_on_route_graph_w_recovery.rst b/behavior_trees/trees/navigate_on_route_graph_w_recovery.rst
new file mode 100644
index 0000000000..04467f880f
--- /dev/null
+++ b/behavior_trees/trees/navigate_on_route_graph_w_recovery.rst
@@ -0,0 +1,105 @@
+.. _behavior_tree_navigate_on_route_graph_w_recovery:
+
+Navigate on Route Graph with Recovery
+#####################################
+
+This behavior tree implements a different style of navigation than the other versions in this section.
+Rather than using a freespace planner ``ComputePathToPose`` to plan a complete path to the goal, this behavior tree instead uses the Route Server to find a route to the goal through a pre-defined navigation graph.
+This can be useful for navigating in large-scale environments where real-time planning in freespace for a long distance is not computationally feasible, where a map of the entire space is not possible to plan within, or where deterministic behavior and limited navigation zones/lanes/routes are demanded.
+
+This tree computes a route through the environment using the ``ComputeRoute`` node which is executed on initialization and when either the goal is updated due to preemption (``GlobalUpdatedGoal``) or the current route path is invalid due to collision (``ValidatePath``).
+After which, if the robot's starting pose is too far from the first route node in the graph solution, it will use freespace planning to connect the robot's current pose to the first node in the route.
+This is called the ``first mile`` and is computed using the ``ComputePathToPose`` node.
+This may be removed if navigation only on the graph is required and you know that the robot will always be located on or near the graph.
+
+The complimentary action occurs for ``last mile`` where the robot will use freespace planning to connect the last node in the route to the goal pose.
+This is done using the ``ComputePathToPose`` node again and similarly can be removed if required.
+The compute path, including the first and last mile paths are then smoothed in the smoother server to make the corners more natural and less sharp.
+``FollowPath`` is then used to follow this path.
+
+For a detailed description of the role of the selector nodes, recovery behaviors, or fallbacks, see the other behavior tree explanations in this section.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/behavior_trees/trees/odometry_calibration.rst b/behavior_trees/trees/odometry_calibration.rst
new file mode 100644
index 0000000000..ff5f51bbae
--- /dev/null
+++ b/behavior_trees/trees/odometry_calibration.rst
@@ -0,0 +1,33 @@
+.. _behavior_tree_odometry_calibration:
+
+Odometry Calibration
+####################
+
+This behavior tree drives the robot in a CCW square three times using the DriveOnHeading and Spin behaviors.
+The robot will traverse each side of the square at 0.2 (m/s) for 2 meters before making a 90 degree turn.
+This is a primitive experiment to measure odometric accuracy and can be used and repeated to tune parameters related to odometry to improve quality.
+
+.. image:: gifs/odometry_calibration.gif
+ :width: 800
+ :alt: Alternative text
+ :align: center
+
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/citations.rst b/citations.rst
new file mode 100644
index 0000000000..2f4ed98a37
--- /dev/null
+++ b/citations.rst
@@ -0,0 +1,90 @@
+.. _citations:
+
+Citations
+#########
+
+If you use the navigation framework, an algorithm from this repository, or ideas from it
+please cite this work in your papers!
+
+
+S. Macenski, F. Martín, R. White, J. Clavero.
+`**The Marathon 2: A Navigation System** `_.
+**IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), 2020.**
+
+IROS 2020 talk on Nav2 Marathon Experiments:
+
+.. raw:: html
+
+
+
+
+
+
+
+.. code-block:: bash
+
+ @InProceedings{macenski2020marathon2,
+ author = {Macenski, Steven and Martin, Francisco and White, Ruffin and Ginés Clavero, Jonatan},
+ title = {The Marathon 2: A Navigation System},
+ booktitle = {2020 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
+ year = {2020}
+ }
+
+If you use any of the algorithms in Nav2 or the analysis of the algorithms in your work, please cite this work in your papers!
+
+S. Macenski, T. Moore, DV Lu, A. Merzlyakov, M. Ferguson,
+`**From the desks of ROS maintainers: A survey of modern & capable mobile robotics algorithms in the robot operating system 2** `_,
+**Robotics and Autonomous Systems, 2023**
+
+.. code-block:: bash
+
+ @article{macenski2023survey,
+ title={From the desks of ROS maintainers: A survey of modern & capable mobile robotics algorithms in the robot operating system 2},
+ author={S. Macenski, T. Moore, DV Lu, A. Merzlyakov, M. Ferguson},
+ year={2023},
+ journal = {Robotics and Autonomous Systems}
+ }
+
+Smac Planner (Hybrid A*, State Lattice, 2D):
+
+S. Macenski, M. Booker, J. Wallace, T. Fischer,
+`**Open-Source, Cost-Aware Kinematically Feasible Planning for Mobile and Surface Robotics** `_,
+
+.. code-block:: bash
+
+ @article{macenski2024smac,
+ title={Open-Source, Cost-Aware Kinematically Feasible Planning for Mobile and Surface Robotics},
+ author={Steve Macenski and Matthew Booker and Josh Wallace and Tobias Fischer},
+ year={2026},
+ journal = {IEEE Robotics and Automation Practice}
+ }
+
+Regulated Pure Pursuit Controller:
+
+S. Macenski, S. Singh, F. Martin, J. Gines,
+`**Regulated Pure Pursuit for Robot Path Tracking** `_,
+**Autonomous Robots, 2023.**
+
+.. code-block:: bash
+
+ @article{macenski2023regulated,
+ title={Regulated Pure Pursuit for Robot Path Tracking},
+ author={Steve Macenski and Shrijit Singh and Francisco Martin and Jonatan Gines},
+ year={2023},
+ journal = {Autonomous Robots}
+ }
+
+VSLAM and formal comparisons for service robot needs:
+
+A. Merzlyakov, S. Macenski.
+`**A Comparison of Modern General-Purpose Visual SLAM Approaches** `_.
+**IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), 2021.**
+
+.. code-block:: bash
+
+ @InProceedings{vslamComparison2021,
+ author = {Merzlyakov, Alexey and Macenski, Steven},
+ title = {A Comparison of Modern General-Purpose Visual SLAM Approaches},
+ booktitle = {2021 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
+ year = {2021}
+ }
diff --git a/commander_api/index.rst b/commander_api/index.rst
new file mode 100644
index 0000000000..a74c398334
--- /dev/null
+++ b/commander_api/index.rst
@@ -0,0 +1,267 @@
+.. _commander_api:
+
+Simple Commander API
+####################
+
+Overview
+********
+
+The goal of the Nav2 Simple (Python3) Commander is to provide a "navigation as a library" capability to Python3 users. We provide an API that handles all the ROS 2 and Action Server tasks for you such that you can focus on building an application leveraging the capabilities of Nav2 (after you've configured it to your liking with your plugins of choice). `We also provide you with demos and examples of API usage `_ to build common basic capabilities in autonomous mobile robotics in the ``nav2_simple_commander`` package.
+
+A simple demonstration is shown below. Note: ``goToPose()``, ``goThroughPoses()``, ``followWaypoints()`` and similar are **non-blocking** such that you can receive and process feedback in a single-threaded application. As such while waiting for a task to be completed, the ``while not nav.isTaskComplete()`` design is necessary to poll for changes in the navigation completion, and if not complete some tasks of interest to your application (like processing feedback, doing something with the data the robot is collecting, or checking for faults).
+
+You may use this simple commander preempt commands of the same type (e.g. you can preempt a ``goToPose()`` with another ``goToPose()``) but you must explicitly cancel a current command and issue a new one if switching between ``goToPose()``, ``goThroughPoses()``, or ``followWaypoints()``.
+
+.. code-block:: python3
+
+ from nav2_simple_commander.robot_navigator import BasicNavigator, TaskResult
+ import rclpy
+
+ rclpy.init()
+ nav = BasicNavigator()
+
+ # ...
+
+ nav.setInitialPose(init_pose)
+ nav.waitUntilNav2Active() # if autostarted, else use lifecycleStartup()
+
+ # ...
+
+ path = nav.getPath(init_pose, goal_pose)
+ smoothed_path = nav.smoothPath(path)
+
+ # ...
+
+ nav.goToPose(goal_pose)
+ while not nav.isTaskComplete():
+ feedback = nav.getFeedback()
+ if feedback.navigation_duration > 600:
+ nav.cancelTask()
+
+ # ...
+
+ result = nav.getResult()
+ if result == TaskResult.SUCCEEDED:
+ print('Goal succeeded!')
+ elif result == TaskResult.CANCELED:
+ print('Goal was canceled!')
+ elif result == TaskResult.FAILED:
+ print('Goal failed!')
+
+
+Commander API
+*************
+
+The methods provided by the basic navigator are shown below, with inputs and expected returns.
+If a server fails, it may throw an exception or return a `None` object, so please be sure to properly wrap your navigation calls in try/catch and check returns for `None` type.
+
+New as of September 2023: the simple navigator constructor will accept a `namespace` field to support multi-robot applications or namespaced Nav2 launches.
+
++---------------------------------------+----------------------------------------------------------------------------+
+| Robot Navigator Method | Description |
++=======================================+============================================================================+
+| setInitialPose(initial_pose) | Sets the initial pose (``PoseStamped``) of the robot to localization. |
++---------------------------------------+----------------------------------------------------------------------------+
+| goThroughPoses(poses, | Requests the robot to drive through a set of poses |
+| behavior_tree='') | (list of ``PoseStamped``). |
++---------------------------------------+----------------------------------------------------------------------------+
+| goToPose(pose, behavior_tree='') | Requests the robot to drive to a pose (``PoseStamped``). |
++---------------------------------------+----------------------------------------------------------------------------+
+| followWaypoints(poses, | Requests the robot to follow a set of waypoints (list of ``PoseStamped``), |
+| number_of_loops=0, | starting at ``goal_index`` (default ``0``) and repeating |
+| goal_index=0) | ``number_of_loops`` times after the first pass (default ``0``, runs once). |
+| | This will execute the chosen ``TaskExecutor`` plugin at each pose. |
++---------------------------------------+----------------------------------------------------------------------------+
+| followPath(path, controller_id='', | Requests the robot to follow a path from a starting to a goal |
+| goal_checker_id='', | ``PoseStamped``, ``nav_msgs/Path``. |
+| progress_checker_id='', | |
+| path_handler_id='') | |
++---------------------------------------+----------------------------------------------------------------------------+
+| spin(spin_dist=1.57, | Requests the robot to performs an in-place rotation by a given angle. |
+| time_allowance=10, | |
+| disable_collision_checks=False) | |
++---------------------------------------+----------------------------------------------------------------------------+
+| driveOnHeading(dist=0.15, | Requests the robot to drive on heading by a given distance. |
+| speed=0.025, time_allowance=10, | |
+| disable_collision_checks=False) | |
++---------------------------------------+----------------------------------------------------------------------------+
+| backup(backup_dist=0.15, | Requests the robot to back up by a given distance. |
+| backup_speed=0.025, time_allowance=10,| |
+| disable_collision_checks=False) | |
++---------------------------------------+----------------------------------------------------------------------------+
+| assistedTeleop(time_allowance=30) | Requests the robot to run the assisted teleop action. |
++---------------------------------------+----------------------------------------------------------------------------+
+| cancelTask() | Cancel an ongoing task, including route tasks. |
++---------------------------------------+----------------------------------------------------------------------------+
+| isTaskComplete(task=RunningTask.NONE) | Checks if task is complete yet, times out at ``100ms``. Returns |
+| | ``True`` if completed and ``False`` if still going. Provide the task ID |
+| | from the long-running task (follow path, compute and track route, etc) |
++---------------------------------------+----------------------------------------------------------------------------+
+| getFeedback(task=RunningTask.NONE) | Gets feedback from task, returns action server feedback msg. |
+| | provide the task ID for the task you are requesting. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getResult() | Gets final result of task, to be called after ``isTaskComplete`` |
+| | returns ``True``. Returns action server result msg. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getPath(start, goal, | Gets a path from a starting to a goal ``PoseStamped``, ``nav_msgs/Path``. |
+| planner_id='', use_start=False) | |
++---------------------------------------+----------------------------------------------------------------------------+
+| getPathThroughPoses(start, goals, | Gets a path through a starting to a set of goals, a list |
+| planner_id='', use_start=False) | of ``PoseStamped``, ``nav_msgs/Path``. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getRoute(start, goal, | Gets a route from a set start and goal nodeIDs or PoseStamped. |
+| use_start=False) | Use Start if given, otherwises uses TF to obtain robot pose. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getAndTrackRoute(start, goal, | Gets a route from a set of start and goal NodeIDs or PoseStamped. |
+| use_start=False) | Uses start if given, otherwise uses TF to obtain the robot pose. |
++---------------------------------------+----------------------------------------------------------------------------+
+| dockRobot(dock_pose, dock_type) | Attempts to dock the robot at a given docking pose and type, without using |
+| | docking database of known docks. |
++---------------------------------------+----------------------------------------------------------------------------+
+| dockRobot(dock_id) | Attempts to dock the robot at a given dock ID in the database of known |
+| | docks. |
++---------------------------------------+----------------------------------------------------------------------------+
+| undockRobot(dock_type="") | Undocks robot. If docking server instance was used to dock, type is not |
+| | required. |
++---------------------------------------+----------------------------------------------------------------------------+
+| smoothPath(path, smoother_id='', | Smooths a given path of type ``nav_msgs/Path``. |
+| max_duration=2.0, | |
+| check_for_collision=False) | |
++---------------------------------------+----------------------------------------------------------------------------+
+| changeMap(map_filepath) | Requests a change from the current map to `map_filepath`'s yaml. |
++---------------------------------------+----------------------------------------------------------------------------+
+| clearAllCostmaps() | Clears both the global and local costmaps. |
++---------------------------------------+----------------------------------------------------------------------------+
+| clearLocalCostmap() | Clears the local costmap. |
++---------------------------------------+----------------------------------------------------------------------------+
+| clearGlobalCostmap() | Clears the global costmap. |
++---------------------------------------+----------------------------------------------------------------------------+
+| clearLocalCostmapAroundPose( | |
+| PoseStamped, distance) | Clears the local costmap around given pose. |
++---------------------------------------+----------------------------------------------------------------------------+
+| clearGlobalCostmapAroundPose( | |
+| PoseStamped, distance) | Clears the global costmap around given pose. |
++---------------------------------------+----------------------------------------------------------------------------+
+| clearCostmapExceptRegion( | |
+| distance) | Clears the local costmap around current robot pose. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getGlobalCostmap() | Returns the global costmap, ``nav2_msgs/Costmap``. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getLocalCostmap() | Returns the local costmap, ``nav2_msgs/Costmap``. |
++---------------------------------------+----------------------------------------------------------------------------+
+| toggleCollisionMonitor(enable) | Toggles the collision monitor on (`True`) or off (`False`). |
++---------------------------------------+----------------------------------------------------------------------------+
+| followObjectByTopic(topic, | Requests the robot to follow an object by subscribing to a given topic. |
+| max_duration=0) | |
++---------------------------------------+----------------------------------------------------------------------------+
+| followObjectByFrame(frame, | Requests the robot to follow an object by a given frame. |
+| max_duration=0) | |
++---------------------------------------+----------------------------------------------------------------------------+
+| waitUntilNav2Active( | Blocks until Nav2 is completely online and lifecycle nodes are in the |
+| navigator='bt_navigator', | active state. To be used in conjunction with autostart or external |
+| localizer='amcl') | lifecycle bringup. Custom navigator and localizer nodes can be specified |
++---------------------------------------+----------------------------------------------------------------------------+
+| lifecycleStartup() | Sends a request to all lifecycle management servers to bring them into |
+| | the active state, to be used if autostart is ``False`` and you want this |
+| | program to control Nav2's lifecycle. |
++---------------------------------------+----------------------------------------------------------------------------+
+| lifecycleShutdown() | Sends a request to all lifecycle management servers to shut them down. |
++---------------------------------------+----------------------------------------------------------------------------+
+| destroyNode() | Releases the resources used by the object. |
++---------------------------------------+----------------------------------------------------------------------------+
+
+Costmap API
+*************
+This is a Python3 API for costmap 2d messages from the stack. It provides the basic conversion, get/set, and handling semantics found in the costmap 2d C++ API.
+
++---------------------------------------+----------------------------------------------------------------------------+
+| Costmap Method | Description |
++=======================================+============================================================================+
+| getSizeInCellsX() | Get map width in cells. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getSizeInCellsY() | Get map height in cells. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getSizeInMetersX() | Get x axis map size in meters. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getSizeInMetersY() | Get y axis map size in meters. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getOriginX() | Get the origin x axis of the map [m]. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getOriginY() | Get the origin y axis of the map [m]. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getResolution() | Get map resolution [m/cell]. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getGlobalFrameID() | Get global frame_id. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getCostmapTimestamp() | Get costmap timestamp. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getCostXY(mx, my) | Get the cost (``np.uint8``) of a cell in the costmap using mx (``int``) |
+| | , my (``int``) of Map Coordinate. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getCostIdx(index) | Get the cost (``np.uint8``) of a cell in the costmap using index (``int``) |
++---------------------------------------+----------------------------------------------------------------------------+
+| setCost(mx, my, cost) | Set the cost (``np.uint8``) of a cell in the costmap using mx (``int``) |
+| | , my (``int``) of Map Coordinate. |
++---------------------------------------+----------------------------------------------------------------------------+
+| mapToWorld(mx, my) | Get the wx (``float``) [m], wy (``float``) [m] of world coordinate XY using|
+| | mx (``int``), my (``int``) of map coordinate XY |
++---------------------------------------+----------------------------------------------------------------------------+
+| worldToMapValidated(wx, wy) | Get the mx (``int``), my (``int``) of map coordinate XY using |
+| | wx (``float``) [m], wy (``float``) [m] of world coordinate XY. |
+| | If wx wy coordinates are invalid, (None,None) is returned. |
++---------------------------------------+----------------------------------------------------------------------------+
+| getIndex(mx, my) | Get the index (``int``) of the cell using mx (``int``), my (``int``) of |
+| | map coordinate XY |
++---------------------------------------+----------------------------------------------------------------------------+
+
+Footprint Collision Checker API
+*******************************
+This is a Python3 API for a Footprint Collision Checker.
+It provides the needed methods to manipulate the coordinates
+and calculate the cost of a Footprint in a given map.
+
++----------------------------------------------+--------------------------------------------------------------------------------------------+
+| Footprint Collision Checker Method | Description |
++==============================================+============================================================================================+
+| footprintCost(footprint) | Checks the footprint (``Polygon``) for collision at its implicit provided coordinate pose. |
++----------------------------------------------+--------------------------------------------------------------------------------------------+
+| lineCost(x0, x1, y0, y1, step_size=0.5) | Iterate over all the points along a line and check for collision. |
+| | The line is defined by x0, y0, x1, y1, step_size (``int``) or (``float``). |
++----------------------------------------------+--------------------------------------------------------------------------------------------+
+| worldToMapValidated(wx, wy) | Get the mx (``int``), my (``int``) of map coordinate XY using |
+| | wx (``float``) [m], wy (``float``) [m] of world coordinate XY. |
+| | If wx wy coordinates are invalid, (None,None) is returned. |
+| | Returns None if costmap is not defined yet through (``setCostmap(costmap)``). |
++----------------------------------------------+--------------------------------------------------------------------------------------------+
+| pointCost(x, y) | Get the cost of a point in the costmap using map coordinates XY. (``int``) |
++----------------------------------------------+--------------------------------------------------------------------------------------------+
+| setCostmap(costmap) | Specify which costmap to use with the footprint collision checker. (``PyCostmap2D``) |
++----------------------------------------------+--------------------------------------------------------------------------------------------+
+| footprintCostAtPose(x, y, theta, footprint) | Get the cost of a footprint at a specific Pose in map coordinates. |
+| | x, y, theta (``float``) footprint (``Polygon``). |
++----------------------------------------------+--------------------------------------------------------------------------------------------+
+
+Examples and Demos
+******************
+
+All of these can be found in the `package `_.
+
+.. image:: readme.gif
+ :width: 800
+ :alt: Alternative text
+ :align: center
+
+The ``nav2_simple_commander`` has a few examples to highlight the API functions available to you as a user:
+
+- ``example_nav_to_pose.py`` - Demonstrates the navigate to pose capabilities of the navigator, as well as a number of auxiliary methods.
+- ``example_nav_through_poses.py`` - Demonstrates the navigate through poses capabilities of the navigator, as well as a number of auxiliary methods.
+- ``example_waypoint_follower.py`` - Demonstrates the waypoint following capabilities of the navigator, as well as a number of auxiliary methods.
+- ``example_follow_path.py`` - Demonstrates the path following capabilities of the navigator, as well as a number of auxiliary methods like path smoothing.
+- ``example_assisted_teleop.py`` - Demonstrates the assisted teleop capabilities of the navigator.
+- ``example_route.py`` - Demonstrates the route server capabilities of the navigator.
+
+The ``nav2_simple_commander`` has a few demonstrations to highlight a couple of simple autonomy applications you can build using the API:
+
+- ``demo_security.py`` - A simple security robot application, showing how to have a robot follow a security route using Navigate Through Poses to do a patrol route, indefinitely.
+- ``demo_picking.py`` - A simple item picking application, showing how to have a robot drive to a specific shelf in a warehouse to either pick an item or have a person place an item into a basket and deliver it to a destination for shipping using Navigate To Pose.
+- ``demo_inspection.py`` - A simple shelf inspection application, showing how to use the Waypoint Follower and task executors to take pictures, RFID scans, etc of shelves to analyze the current shelf statuses and locate items in the warehouse.
diff --git a/docs/configuration_and_development/simple_commander_api/assets/readme.gif b/commander_api/readme.gif
similarity index 100%
rename from docs/configuration_and_development/simple_commander_api/assets/readme.gif
rename to commander_api/readme.gif
diff --git a/concepts/index.rst b/concepts/index.rst
new file mode 100644
index 0000000000..dc0ce866b8
--- /dev/null
+++ b/concepts/index.rst
@@ -0,0 +1,359 @@
+.. _concepts:
+
+Navigation Concepts
+###################
+
+This page is to help familiarize new roboticists to the concepts of mobile robot navigation, in particular, with the concepts required to appreciating and working with this project.
+
+ROS 2
+*****
+
+ROS 2 is the core middleware used for Nav2. If you are unfamiliar with this, please visit `the ROS 2 documentation `_ before continuing.
+
+Action Server
+=============
+
+Just as in ROS, action servers are a common way to control long running tasks like navigation.
+This stack makes more extensive use of actions, and in some cases, without an easy topic interface.
+It is more important to understand action servers as a developer in ROS 2.
+Some simple CLI examples can be found in the `ROS 2 documentation `_.
+
+Action servers are similar to a canonical service server.
+A client will request some task to be completed, except, this task may take a long time.
+An example would be moving the shovel up from a bulldozer or ask a robot to travel 10 meters to the right.
+
+In this situation, action servers and clients allow us to call a long-running task in another process or thread and return a future to its result.
+It is permissible at this point to block until the action is complete, however, you may want to occasionally check if the action is complete and continue to process work in the client thread.
+Since it is long-running, action servers will also provide feedback to their clients.
+This feedback can be anything and is defined in the ROS ``.action`` along with the request and result types.
+In the bulldozer example, a request may be an angle, a feedback may be the angle remaining to be moved, and the result is a success or fail boolean with the end angle.
+In the navigation example, a request may be a position, a feedback may be the time its been navigating for and the distance to the goal, and the result a boolean for success.
+
+Feedback and results can be gathered synchronously by registering callbacks with the action client.
+They may also be gathered by asynchronously requesting information from the shared future objects.
+Both require spinning the client node to process callback groups.
+
+Action servers are used in this stack to communicate with the highest level Behavior Tree (BT) navigator through a ``NavigateToPose`` action message.
+They are also used for the BT navigator to communicate with the subsequent smaller action servers to compute plans, control efforts, and recoveries.
+Each will have their own unique ``.action`` type in ``nav2_msgs`` for interacting with the servers.
+
+Lifecycle Nodes and Bond
+========================
+
+Lifecycle (or Managed, more correctly) nodes are unique to ROS 2.
+More information can be `found here `_.
+They are nodes that contain state machine transitions for bringup and teardown of ROS 2 servers.
+This helps in deterministic behavior of ROS systems in startup and shutdown.
+It also helps users structure their programs in reasonable ways for commercial uses and debugging.
+
+When a node is started, it is in the unconfigured state, only processing the node's constructor which should **not** contain any ROS networking setup or parameter reading.
+By the launch system, or the supplied lifecycle manager, the nodes need to be transitioned to inactive by configuring.
+After, it is possible to activate the node by transitioning through the activating stage.
+
+This state will allow the node to process information and be fully setup to run.
+The configuration stage, triggering the ``on_configure()`` method, will setup all parameters, ROS networking interfaces, and for safety systems, all dynamically allocated memory.
+The activation stage, triggering the ``on_activate()`` method, will activate the ROS networking interfaces and set any states in the program to start processing information.
+
+To shutdown, we transition into deactivating, cleaning up, shutting down and end in the finalized state.
+The networking interfaces are deactivated and stop processing, deallocate memory, exit cleanly, in those stages, respectively.
+
+The lifecycle node framework is used extensively through out this project and all servers utilize it.
+It is best convention for all ROS systems to use lifecycle nodes if it is possible.
+
+Within Nav2, we use a wrapper of LifecycleNodes, ``nav2_util LifecycleNode``.
+This wrapper wraps much of the complexities of LifecycleNodes for typical applications.
+It also includes a ``bond`` connection for the lifecycle manager to ensure that after a server transitions up, it also remains active.
+If a server crashes, it lets the lifecycle manager know and transition down the system to prevent a critical failure. See :ref:`eloquent_migration` for details.
+
+------------
+
+Behavior Trees
+**************
+
+Behavior trees (BT) are becoming increasingly common in complex robotics tasks.
+They are a tree structure of tasks to be completed.
+It creates a more scalable and human-understandable framework for defining multi-step or many state applications.
+This is opposed to a finite state machine (FSM) which may have dozens of states and hundreds of transitions.
+An example would be a soccer-playing robot.
+Embedding the logic of soccer game play into a FSM would be challenging and error prone with many possible states and rules.
+Additionally, modeling choices like to shoot at the goal from the left, right, or center, is particularly unclear.
+With a BT, basic primitives, like "kick", "walk", "go to ball", can be created and reused for many behaviors.
+More information can be found `in this book `_.
+I **strongly** recommend reading chapters 1-3 to get a good understanding of the nomenclature and workflow.
+It should only take about 30 minutes.
+
+Behavior Trees provide a formal structure for navigation logic which can be both used to create complex systems but also be verifiable and validated as provenly correct using advanced tools. Having the application logic centralized in the behavior tree and with independent task servers (which only communicate data over the tree) allows for formal analysis.
+
+For this project, we use `BehaviorTree CPP V4 `_ as the behavior tree library.
+We create node plugins which can be constructed into a tree, inside the ``BT Navigator``.
+The node plugins are loaded into the BT and when the XML file of the tree is parsed, the registered names are associated.
+At this point, we can march through the behavior tree to navigate.
+
+One reason this library is used is its ability to load subtrees. This means that the Nav2 behavior tree can be loaded into another higher-level BT to use this project as node plugin.
+An example would be in soccer play, using the Nav2 behavior tree as the "go to ball" node with a ball detection as part of a larger task.
+Additionally, we supply a ``NavigateToPoseAction`` plugin (among others) for BT so the Nav2 stack can be called from a client application through the usual action interface.
+
+Other systems could be used to design complex autonomous behavior, namely Hierarchical FSMs (HFSM).
+Behavior Trees were selected due to popularity across the robotics and related industries and by largely user demand.
+However, due to the independent task server nature of Nav2, it is not difficult to offer a ``nav2_hfsm_navigator`` package in the future, pending interest and contribution.
+
+------------
+
+Navigation Servers
+******************
+
+Planners and controllers are at the heart of a navigation task.
+Recoveries are used to get the robot out of a bad situation or attempt to deal with various forms of issues to make the system fault-tolerant.
+Smoothers can be used for additional quality improvements of the planned path.
+In this section, the general concepts around them and their uses in this project are analyzed.
+
+Planner, Controller, Smoother, Route, and Behavior Servers
+==========================================================
+
+Five of the action servers in this project are the planner, behavior, smoother, route, and controller servers.
+
+These action servers are used to host a map of algorithm plugins to complete various tasks.
+They also host the environmental representation used by the algorithm plugins to compute their outputs.
+
+The planner, smoother and controller servers will be configured at runtime with the names (aliases) and types of algorithms to use.
+These types are the pluginlib names that have been registered and the names are the aliases for the task.
+An example would be the DWB controller used with name ``FollowPath``, as it follows a reference path.
+In this case, then all parameters for DWB would be placed in that namespace, e.g. ``FollowPath.``.
+
+These three servers then expose an action interface corresponding to their task.
+When the behavior tree ticks the corresponding BT node, it will call the action server to process its task.
+The action server callback inside the server will call the chosen algorithm by its name (e.g. ``FollowPath``) that maps to a specific algorithm.
+This allows a user to abstract the algorithm used in the behavior tree to classes of algorithms.
+For instance, you can have ``N`` plugin controllers to follow paths, dock with charger, avoid dynamic obstacles, or interface with a tool.
+Having all of these plugins in the same server allows the user to make use of a single environmental representation object, which is costly to duplicate.
+
+For the behavior server, each of the behaviors also contains their own name, however, each plugin will also expose its own special action server.
+This is done because of the wide variety of behavior actions that may be created which cannot have a single simple interface to share.
+The behavior server also contains a costmap subscriber to the local costmap, receiving real-time updates from the controller server, to compute its tasks.
+We do this to avoid having multiple instances of the local costmap which are computationally expensive to duplicate.
+
+The route server does not contain multiple "routing algorithms" like the planner or controller servers.
+Instead, it computes a route using a navigation graph using a set of plugins for scoring edges in the graph, parsing graph files, and performing operations along the route, if necessary.
+Rather than freespace planning, this computes a route using a graph that can be generated to represent lanes, areas the robot is allowed to navigate, a teach-and-repeat route, urban roadways, and more.
+
+Alternatively, since the BT nodes are trivial plugins calling an action, new BT nodes can be created to call other action servers with other action types.
+It is advisable to use the provided servers if possible at all times.
+If, due to the plugin or action interfaces, a new server is needed, that can be sustained with the framework.
+The new server should use the new type and plugin interface, similar to the provided servers.
+A new BT node plugin will need to be created to call the new action server -- however no forking or modification is required in the Nav2 repo itself by making extensive use of servers and plugins.
+
+If you find that you require a new interface to the pluginlib definition or action type, please file a ticket and see if we can rectify that in the same interfaces.
+
+Planners
+========
+
+The task of a planner is to compute a path to complete some objective function.
+The path can also be known as a route, depending on the nomenclature and algorithm selected.
+Two canonical examples are computing a plan to a goal (e.g. from current position to a goal) or complete coverage (e.g. plan to cover all free space).
+The planner will have access to a global environmental representation and sensor data buffered into it.
+Planners can be written to:
+
+- Compute shortest path
+- Compute complete coverage path
+- Compute paths along sparse or predefined routes
+
+The general task in Nav2 for the planner is to compute a valid, and potentially optimal, path from the current pose to a goal pose.
+However, many classes of plans and routes exist which are supported.
+
+Controllers
+===========
+
+Controllers, also known as local planners in ROS 1, are the way we follow the globally computed path or complete a local task.
+The controller will have access to a local environment representation to attempt to compute feasible control efforts for the base to follow.
+Many controller will project the robot forward in space and compute a locally feasible path at each update iteration.
+Controllers can be written to:
+
+- Follow a path
+- Dock with a charging station using detectors in the odometric frame
+- Board an elevator
+- Interface with a tool
+
+The general task in Nav2 for a controller is to compute a valid control effort to follow the global plan.
+However, many classes of controllers and local planners exist.
+It is the goal of this project that all controller algorithms can be plugins in this server for common research and industrial tasks.
+
+Behaviors
+=========
+
+Recovery behaviors are a mainstay of fault-tolerant systems.
+The goal of recoveries are to deal with unknown or failure conditions of the system and autonomously handle them.
+Examples may include faults in the perception system resulting in the environmental representation being full of fake obstacles.
+The clear costmap recovery would then be triggered to allow the robot to move.
+
+Another example would be if the robot was stuck due to dynamic obstacles or poor control.
+Backing up or spinning in place, if permissible, allow the robot to move from a poor location into free space it may navigate successfully.
+
+Finally, in the case of a total failure, a recovery may be implemented to call an operator's attention for help.
+This can be done via email, SMS, Slack, Matrix, etc.
+
+It is important to note that the behavior server can hold any behavior to share access to expensive resources like costmaps or TF buffers, not just recovery behaviors. Each may have its own API.
+
+Smoothers
+=========
+
+As criteria for optimality of the path searched by a planner are usually reduced compared to reality, additional path refinement is often beneficial.
+Smoothers have been introduced for this purpose, typically responsible for reducing path raggedness and smoothing abrupt rotations,
+but also for increasing distance from obstacles and high-cost areas as the smoothers have access to a global environmental representation.
+
+Use of a separate smoother over one that is included as part of a planner is advantageous when combining different planners with different smoothers or when a specific control over smoothing is required, e.g. smoothing only a specific part of the path.
+
+The general task in Nav2 for a smoother is to receive a path and return its improved version.
+However, for different input paths, criteria of the improvements and methods of acquiring them exist, creating space for a multitude of smoothers that can be registered in this server.
+
+Route
+=====
+
+The route server is a specialized planner that computes a route using a navigation graph, rather than the freespace costmap.
+The route is computed as the optimal way from the start to the goal through the set of nodes and directional edges in the pre-defined navigation graph.
+This navigation graph can be generated to represent lanes, areas the robot is allowed to navigate, a teach-and-repeat route, urban roadways, and more.
+
+Robot Footprints
+================
+
+It is worth remarking that in the cost maps, we set a robot's footprint either as a circle of radius ``robot_radius`` or as a vector of points ``footprint`` representing an arbitrary polygon if the robot is non-circular. This can also be adjusted over time using the costmap's ``~/footprint`` topic, which will update the polygon over time as needed due to changes in the robot's state, such as movement of an attached manipulator, picking up a pallet, or other actions that adjust a robot's shape. That polygon will then automatically be used by the planners and controllers.
+
+Waypoint Following
+==================
+
+Waypoint following is a basic feature of a navigation system. It tells our system how to use navigation to get to multiple destinations.
+
+The ``nav2_waypoint_follower`` contains a waypoint following program with a plugin interface for specific task executors.
+This is useful if you need to go to a given location and complete a specific task like take a picture, pick up a box, or wait for user input.
+It is a nice demo application for how to use Nav2 in a sample application.
+
+However, it could be used for more than just a sample application.
+There are 2 schools of thoughts for fleet managers / dispatchers:
+
+- Dumb robot; smart centralized dispatcher
+- Smart robot; dumb centralized dispatcher
+
+In the first, the ``nav2_waypoint_follower`` is fully sufficient to create a production-grade on-robot solution. Since the autonomy system / dispatcher is taking into account things like the robot's pose, battery level, current task, and more when assigning tasks, the application on the robot just needs to worry about the task at hand and not the other complexities of the system to complete the requested task. In this situation, you should think of a request to the waypoint follower as 1 unit of work (e.g. 1 pick in a warehouse, 1 security patrole loop, 1 aisle, etc) to do a task and then return to the dispatcher for the next task or request to recharge. In this school of thought, the waypoint following application is just one step above navigation and below the system autonomy application.
+
+In the second, the ``nav2_waypoint_follower`` is a nice sample application / proof of concept, but you really need your waypoint following / autonomy system on the robot to carry more weight in making a robust solution. In this case, you should use the ``nav2_behavior_tree`` package to create a custom application-level behavior tree using navigation to complete the task. This can include subtrees like checking for the charge status mid-task for returning to dock or handling more than 1 unit of work in a more complex task. Soon, there will be a ``nav2_bt_waypoint_follower`` (name subject to adjustment) that will allow you to create this application more easily. In this school of thought, the waypoint following application is more closely tied to the system autonomy, or in many cases, is the system autonomy.
+
+Neither is better than the other, it highly depends on the tasks your robot(s) are completing, in what type of environment, and with what cloud resources available. Often this distinction is very clear for a given business case.
+
+``nav2_waypoint_follower`` also supports GPS waypoint following when global localization is provided by `robot_localization `_ using the ``navsat_transform`` node - but also may be provided by Fuse or any number of other sources.
+There is an action server named ``/follow_gps_waypoints`` within ``nav2_waypoint_follower`` that can directly take in goals expressed in GPS coordinates, convert them to cartesian goals in the global frame, and execute them as cartesian waypoints.
+
+------------
+
+State Estimation
+****************
+
+Within the navigation project, there are 2 major transformations that need to be provided, according to community standards.
+The ``map`` to ``odom`` transform is provided by a positioning system (localization, mapping, SLAM) and ``odom`` to ``base_link`` by an odometry system.
+
+.. note::
+
+ There is **no** requirement on using a LIDAR on your robot to use the navigation system. There is no requirement to use lidar-based collision avoidance,
+ localization, or SLAM. However, we do provide instructions and support tried and true implementations of these things using lidars.
+ You can be equally as successful using a vision or depth based positioning system and using other sensors for collision avoidance.
+ The only requirement is that you follow the standards below with your choice of implementation.
+
+Standards
+=========
+
+`REP 105 `_ defines the frames and conventions required for navigation and the larger ROS ecosystem.
+These conventions should be followed at all times to make use of the rich positioning, odometry, and SLAM projects available in the community.
+
+In a nutshell, REP-105 says that you must, at minimum, build a TF tree that contains a full ``map`` -> ``odom`` -> ``base_link`` -> ``[sensor frames]`` for your robot.
+TF2 is the time-variant transformation library in ROS 2 we use to represent and obtain time synchronized transformations.
+It is the job of the global positioning system (GPS, SLAM, Motion Capture) to, at minimum, provide the ``map`` -> ``odom`` transformation.
+It is then the role of the odometry system to provide the ``odom`` -> ``base_link`` transformation.
+The remainder of the transformations relative to ``base_link`` should be static and defined in your `URDF `_.
+
+Global Positioning: Localization and SLAM
+=========================================
+
+It is the job of the global positioning system (GPS, SLAM, Motion Capture) to, at minimum, provide the ``map`` -> ``odom`` transformation.
+We provide ``amcl`` which is an Adaptive Monte-Carlo Localization technique based on a particle filter for localization in a static map.
+We also provide SLAM Toolbox as the default SLAM algorithm for use to position and generate a static map.
+
+These methods may also produce other output including position topics, maps, or other metadata, but they must provide that transformation to be valid.
+Multiple positioning methods can be fused together using robot localization, discussed more below.
+
+
+Odometry
+========
+
+It is the role of the odometry system to provide the ``odom`` -> ``base_link`` transformation.
+Odometry can come from many sources including LIDAR, RADAR, wheel encoders, VIO, and IMUs.
+The goal of the odometry is to provide a smooth and continuous local frame based on robot motion.
+The global positioning system will update the transformation relative to the global frame to account for the odometric drift.
+
+`Robot Localization `_ is typically used for this fusion.
+It will take in ``N`` sensors of various types and provide a continuous and smooth odometry to TF and to a topic.
+A typical mobile robotics setup may have odometry from wheel encoders, IMUs, and vision fused in this manner.
+
+The smooth output can be used then for dead-reckoning for precise motion and updating the position of the robot accurately between global position updates.
+
+------------
+
+Environmental Representation
+****************************
+
+The environmental representation is the way the robot perceives its environment.
+It also acts as the central localization for various algorithms and data sources to combine their information into a single space.
+This space is then used by the controllers, planners, and recoveries to compute their tasks safely and efficiently.
+
+Costmaps and Layers
+===================
+
+The current environmental representation is a costmap.
+A costmap is a regular 2D grid of cells containing a cost from unknown, free, occupied, or inflated cost.
+This costmap is then searched to compute a global plan or sampled to compute local control efforts.
+
+Various costmap layers are implemented as pluginlib plugins to buffer information into the costmap.
+This includes information from LIDAR, RADAR, sonar, depth images, etc.
+It may be wise to process sensor data before inputting it into the costmap layer, but that is up to the developer.
+
+Costmap layers can be created to detect and track obstacles in the scene for collision avoidance using camera or depth sensors.
+Additionally, layers can be created to algorithmically change the underlying costmap based on some rule or heuristic.
+Finally, they may be used to buffer live data into the 2D or 3D world for binary obstacle marking.
+
+Costmap Filters
+===============
+
+Imagine, you're annotating a map file (or any image file) in order to have a specific action occur based on the location in the annotated map. Examples of marking/annotating might be keep out zones to avoid planning inside, or have pixels belong to maximum speeds in marked areas. This annotated map is called "filter mask". Just like a mask overlaid on a surface, it can or cannot be same size, pose and scale as a main map. The main goal of filter mask - is to provide the ability of marking areas on maps with some additional features or behavioral changes.
+
+Costmap filters are a costmap layer-based approach of applying spatial-dependent behavioral changes, annotated in filter masks, into the Nav2 stack.
+Costmap filters are implemented as costmap plugins.
+These plugins are called "filters" as they are filtering a costmap by spatial annotations marked on filter masks.
+In order to make a filtered costmap and change a robot's behavior in annotated areas, the filter plugin reads the data coming from the filter mask.
+This data is being linearly transformed into a feature map in a filter space.
+Having this transformed feature map along with a map/costmap, any sensor data and current robot coordinate filters can update the underlying costmap and change the behavior of the robot depending on where it is.
+For example, the following functionality could be made by use of costmap filters:
+
+- Keep-out/safety zones where robots will never enter.
+- Speed restriction areas. Maximum speed of robots going inside those areas will be limited.
+- Preferred lanes for robots moving in industrial environments and warehouses.
+
+Other Forms
+===========
+
+Various other forms of environmental representations exist.
+These include:
+
+- gradient maps, which are similar to costmaps but represent surface gradients to check traversibility over
+- 3D costmaps, which represent the space in 3D, but then also requires 3D planning and collision checking
+- Mesh maps, which are similar to gradient maps but with surface meshes at many angles
+- "Vector space", taking in sensor information and using machine learning to detect individual items and locations to track rather than buffering discrete points.
+
+------------
+
+Nav2 Academic Overview
+**********************
+
+.. raw:: html
+
+
+
+
+
+
diff --git a/conf.py b/conf.py
new file mode 100644
index 0000000000..5d212827e8
--- /dev/null
+++ b/conf.py
@@ -0,0 +1,204 @@
+# -*- coding: utf-8 -*-
+#
+# Project SOF documentation build configuration file, created by
+# sphinx-quickstart on Wed Jan 10 20:51:29 2018.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+import os
+import sys
+import time
+
+sys.path.insert(0, os.path.abspath('.'))
+
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ 'breathe',
+ 'myst_parser',
+ 'sphinx_copybutton',
+ 'sphinx.ext.extlinks',
+ 'sphinx.ext.graphviz',
+ 'sphinxcontrib.plantuml',
+]
+
+myst_enable_extensions = ['colon_fence']
+
+graphviz_output_format='png'
+graphviz_dot_args=[
+ '-Nfontname="verdana"',
+ '-Gfontname="verdana"',
+ '-Efontname="verdana"']
+
+plantuml = 'java -jar ' + os.path.join(os.path.abspath('.'), 'scripts/plantuml.jar')
+plantuml_output_format = 'png'
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+# source_suffix = ['.rst', '.md']
+source_suffix = ['.rst', '.md']
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Nav2'
+author = u'Open Navigation LLC'
+copyright = f'{time.strftime("%Y")}, {author}'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+
+version = release = "1.0.0"
+
+#
+# The short X.Y version.
+# version = u'0.1'
+# The full version, including alpha/beta/rc tags.
+# release = u'0.1'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = 'en'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This patterns also effect to html_static_path and html_extra_path
+exclude_patterns = ['venv', '_build','_themes','scripts', 'README.md', '.github' ]
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+try:
+ import sphinx_rtd_theme
+except ImportError:
+ html_theme = 'alabaster'
+ # This is required for the alabaster theme
+ # refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
+ html_sidebars = {
+ '**': [
+ 'relations.html', # needs 'show_related': True theme option to display
+ 'searchbox.html',
+ ]
+ }
+ sys.stderr.write('Warning: sphinx_rtd_theme missing. Use pip to install it.\n')
+else:
+ html_theme = "sphinx_rtd_theme"
+ html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
+ html_theme_options = {
+ 'canonical_url': '',
+ 'analytics_id': 'G-EVD5Z6G6NH',
+ 'logo_only': False,
+ 'display_version': True,
+ 'prev_next_buttons_location': 'None',
+ # Toc options
+ 'collapse_navigation': False,
+ 'sticky_navigation': True,
+ 'navigation_depth': 4,
+ }
+
+html_theme_path = ['_themes']
+html_theme = 'otc_tcs_sphinx_theme'
+
+# Here's where we (manually) list the document versions maintained on
+# the published doc website. On a daily basis we publish to the
+# /latest folder but when releases are made, we publish to a /
+# folder (specified via RELEASE=name on the make command).
+
+if tags.has('release'):
+ current_version = version
+else:
+ version = current_version = "latest"
+
+html_context = {
+ 'current_version': current_version,
+ 'versions': ( ("latest", "/latest/"),
+# ("0.1-rc4", "/0.1-rc4/"),
+ )
+ }
+
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#
+# html_theme_options = {}
+
+html_logo = 'images/nav2_logo_powered.png'
+html_favicon = 'images/nav2_48x48.png'
+
+numfig = True
+#numfig_secnum_depth = (2)
+numfig_format = {'figure': 'Figure %s', 'table': 'Table %s', 'code-block': 'Code Block %s'}
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+#html_static_path = ['static']
+
+# Custom sidebar templates, must be a dictionary that maps document names
+# to template names.
+#
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+html_show_sphinx = False
+
+# If true, links to the reST sources are added to the pages.
+html_show_sourcelink = False
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page
+# bottom,
+# using the given strftime format (ei %b %d, %Y).
+html_last_updated_fmt = None
+
+# -- Options for HTMLHelp output ------------------------------------------
+
+
+rst_epilog = """
+.. include:: /substitutions.txt
+"""
+
+
+breathe_projects = {
+ "SOF Project" : "doxygen/xml",
+}
+breathe_default_project = "SOF Project"
+breathe_default_members = ('members', 'undoc-members', 'content-only')
+
+extlinks = {'projectfile':
+ ('https://github.com/ros-navigation/navigation2/blob/main/%s', 'filepath %s')}
diff --git a/configuration/index.rst b/configuration/index.rst
new file mode 100644
index 0000000000..a16c91aa41
--- /dev/null
+++ b/configuration/index.rst
@@ -0,0 +1,71 @@
+.. _configuration:
+
+Configuration Guide
+###################
+
+This guide provides a process through which the user can adjust the tunable parameters to obtain
+the best navigation performance.
+
+Core Servers
+************
+
+.. toctree::
+ :maxdepth: 1
+
+ packages/configuring-behavior-server.rst
+ packages/configuring-bt-navigator.rst
+ packages/configuring-bt-xml.rst
+ packages/configuring-collision-monitor.rst
+ packages/configuring-controller-server.rst
+ packages/configuring-costmaps.rst
+ packages/configuring-docking-server.rst
+ packages/configuring-lifecycle.rst
+ packages/configuring-map-server.rst
+ packages/configuring-planner-server.rst
+ packages/configuring-route-server.rst
+ packages/configuring-smoother-server.rst
+ packages/configuring-velocity-smoother.rst
+ packages/configuring-waypoint-follower.rst
+
+Planners Plugins
+****************
+
+.. toctree::
+ :maxdepth: 1
+
+ packages/configuring-navfn.rst
+ packages/configuring-smac-planner.rst
+ packages/configuring-thetastar.rst
+
+Controller Plugins
+******************
+
+.. toctree::
+ :maxdepth: 1
+
+ packages/configuring-dwb-controller.rst
+ packages/configuring-graceful-motion-controller.rst
+ packages/configuring-mppic.rst
+ packages/configuring-regulated-pp.rst
+ packages/configuring-rotation-shim-controller.rst
+
+Smoother Plugins
+****************
+
+.. toctree::
+ :maxdepth: 1
+
+ packages/configuring-constrained-smoother.rst
+ packages/configuring-savitzky-golay-smoother.rst
+ packages/configuring-simple-smoother.rst
+
+Others
+******
+
+.. toctree::
+ :maxdepth: 1
+
+ packages/configuring-amcl.rst
+ packages/configuring-coverage-server.rst
+ packages/configuring-following-server.rst
+ packages/configuring-loopback-sim.rst
diff --git a/configuration/packages/bt-plugins/actions/AppendGoalPoseToGoals.rst b/configuration/packages/bt-plugins/actions/AppendGoalPoseToGoals.rst
new file mode 100644
index 0000000000..730cf188b7
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/AppendGoalPoseToGoals.rst
@@ -0,0 +1,54 @@
+.. _bt_append_goal_pose_to_goals_action:
+
+AppendGoalPoseToGoals
+=====================
+
+Appends a goal ``PoseStamped`` to the end of a ``goals`` vector.
+May be useful to add in the final task goal pose to a list of goals extracted from Route nodes (or other sources of future goals).
+
+Input Ports
+-----------
+
+:goal_pose:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ geometry_msgs/PoseStamped N/A
+ =============================== =======
+
+ Description
+ Goal pose to append to the ``goals`` vector.
+
+:input_goals:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ nav_msgs/Goals N/A
+ =============================== =======
+
+ Description
+ Input goals vector to append to.
+
+
+Output Ports
+------------
+
+:output_goals:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ nav_msgs/Goals N/A
+ =============================== =======
+
+ Description
+ Output goals vector appended to.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/AssistedTeleop.rst b/configuration/packages/bt-plugins/actions/AssistedTeleop.rst
new file mode 100644
index 0000000000..2d07def7bf
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/AssistedTeleop.rst
@@ -0,0 +1,88 @@
+.. _bt_assisted_teleop_action:
+
+AssistedTeleop
+==============
+
+Invokes the AssistedTeleop ROS 2 action server, which filters teleop twist commands to prevent
+collisions. This is used in nav2 Behavior Trees as a recovery behavior or a regular behavior.
+The nav2_behaviors_ module implements the AssistedTeleop action server.
+
+.. _nav2_behaviors: https://github.com/ros-navigation/navigation2/tree/main/nav2_behaviors
+
+
+Input Ports
+***********
+
+:is_recovery:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double false
+ ====== =======
+
+ Description
+ If true increment the recovery counter.
+
+:time_allowance:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10.0
+ ====== =======
+
+ Description
+ Time to invoke behavior for, if exceeds considers it a stuck condition or failure case (seconds).
+
+:server_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Action server name.
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Action server timeout (ms).
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Assisted teleop error code. See ``AssistedTeleop`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Assisted teleop error message. See ``AssistedTeleop`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/BackUp.rst b/configuration/packages/bt-plugins/actions/BackUp.rst
new file mode 100644
index 0000000000..96b6970a63
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/BackUp.rst
@@ -0,0 +1,112 @@
+.. _bt_backup_action:
+
+BackUp
+======
+
+Invokes the BackUp ROS 2 action server, which causes the robot to back up by a specific displacement.
+It performs an linear translation by a given distance.
+This is used in nav2 Behavior Trees as a recovery behavior. The nav2_behaviors module implements the BackUp action server.
+
+.. nav2_behaviors_: https://github.com/ros-navigation/navigation2/tree/main/nav2_behaviors
+
+Input Ports
+***********
+
+:backup_dist:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double -0.15
+ ====== =======
+
+ Description
+ Total distance to backup (m).
+
+:backup_speed:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.025
+ ====== =======
+
+ Description
+ Backup speed (m/s).
+
+:time_allowance:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10.0
+ ====== =======
+
+ Description
+ Time to invoke behavior for, if exceeds considers it a stuck condition or failure case (seconds).
+
+:server_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Action server name.
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Action server timeout (ms).
+
+:disable_collision_checks:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool false
+ ====== =======
+
+ Description
+ Disable collision checking.
+
+Output Ports
+------------
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Backup error code. See ``BackUp`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Backup error message. See ``BackUp`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CancelAssistedTeleop.rst b/configuration/packages/bt-plugins/actions/CancelAssistedTeleop.rst
new file mode 100644
index 0000000000..9760eb67f1
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CancelAssistedTeleop.rst
@@ -0,0 +1,39 @@
+.. _bt_cancel_assisted_teleop:
+
+CancelAssistedTeleop
+====================
+
+Used to cancel the AssistedTeleop action that is part of the behavior server. The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Service name, if not using default of ``assisted_teleop`` due to remapping.
+
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CancelBackUp.rst b/configuration/packages/bt-plugins/actions/CancelBackUp.rst
new file mode 100644
index 0000000000..d00a38e08d
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CancelBackUp.rst
@@ -0,0 +1,39 @@
+.. _bt_cancel_backup:
+
+CancelBackUp
+============
+
+Used to cancel the backup action that is part of the behavior server. The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Service name, if not using default of ``backup`` due to remapping.
+
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CancelComputeAndTrackRoute.rst b/configuration/packages/bt-plugins/actions/CancelComputeAndTrackRoute.rst
new file mode 100644
index 0000000000..9781ddcbc3
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CancelComputeAndTrackRoute.rst
@@ -0,0 +1,39 @@
+.. _bt_cancel_compute_and_track_route:
+
+CancelComputeAndTrackRoute
+==========================
+
+Used to cancel the compute and track route action that is part of the behavior server. The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Service name, if not using default of ``compute_and_track_route`` due to remapping.
+
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CancelControl.rst b/configuration/packages/bt-plugins/actions/CancelControl.rst
new file mode 100644
index 0000000000..504f188dae
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CancelControl.rst
@@ -0,0 +1,39 @@
+.. _bt_cancel_control:
+
+CancelControl
+=============
+
+Used to cancel the goals given to the controllers' action server. The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Service name.
+
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CancelCoverage.rst b/configuration/packages/bt-plugins/actions/CancelCoverage.rst
new file mode 100644
index 0000000000..0a3ee3ebcb
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CancelCoverage.rst
@@ -0,0 +1,39 @@
+.. _bt_cancel_coverage:
+
+CancelCoverage
+==============
+
+Used to cancel the goals given to the complete coverage action server. The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Service name.
+
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CancelDriveOnHeading.rst b/configuration/packages/bt-plugins/actions/CancelDriveOnHeading.rst
new file mode 100644
index 0000000000..0d8d3087db
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CancelDriveOnHeading.rst
@@ -0,0 +1,39 @@
+.. _bt_cancel_driveonheading:
+
+CancelDriveOnHeading
+====================
+
+Used to cancel the drive on heading action that is part of the behavior server. The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Service name, if not using default of ``drive_on_heading`` due to remapping.
+
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CancelFollowObject.rst b/configuration/packages/bt-plugins/actions/CancelFollowObject.rst
new file mode 100644
index 0000000000..92f59e794b
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CancelFollowObject.rst
@@ -0,0 +1,38 @@
+.. _bt_cancel_follow_object:
+
+CancelFollowObject
+==================
+
+Used to cancel the goals given to the follow object action server. The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Service name.
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CancelSpin.rst b/configuration/packages/bt-plugins/actions/CancelSpin.rst
new file mode 100644
index 0000000000..7e7d24e90d
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CancelSpin.rst
@@ -0,0 +1,39 @@
+.. _bt_cancel_spin:
+
+CancelSpin
+==========
+
+Used to cancel the spin action that is part of the behavior server. The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Service name, if not using default of ``spin`` due to remapping.
+
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CancelWait.rst b/configuration/packages/bt-plugins/actions/CancelWait.rst
new file mode 100644
index 0000000000..36e8285d63
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CancelWait.rst
@@ -0,0 +1,39 @@
+.. _bt_cancel_wait:
+
+CancelWait
+==========
+
+Used to cancel the wait action that is part of the behavior server. The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Service name, if not using default of ``wait`` due to remapping.
+
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CheckPoseOccupancy.rst b/configuration/packages/bt-plugins/actions/CheckPoseOccupancy.rst
new file mode 100644
index 0000000000..fc1983a937
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CheckPoseOccupancy.rst
@@ -0,0 +1,84 @@
+.. _bt_check_pose_occupancy_action:
+
+CheckPoseOccupancy
+==================
+
+Checks to see if the pose is occupied. If it is occupied, it returns SUCCESS, otherwise
+it returns FAILURE.
+
+Input Ports
+-----------
+
+:pose:
+
+ ========================= =======
+ Type Default
+ ------------------------- -------
+ geometry_msgs/PoseStamped N/A
+ ========================= =======
+
+ Description
+ Pose to check if it is occupied.
+
+:service_name:
+
+ ====== =======================================
+ Type Default
+ ------ ---------------------------------------
+ string /global_costmap/get_cost_global_costmap
+ ====== =======================================
+
+ Description
+ costmap service name responsible for getting the cost.
+
+:cost_threshold:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 254.0
+ ====== =======
+
+ Description
+ The cost threshold above which a waypoint is considered in collision and should be removed. If ``use_footprint = false``, consider setting to 253 for occupied.
+
+:use_footprint:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool true
+ ====== =======
+
+ Description
+ Whether to use the footprint cost or the point cost.
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 20.0
+ ====== =======
+
+ Description
+ Service response timeout (ms).
+
+:consider_unknown_as_obstacle:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool false
+ ====== =======
+
+ Description
+ Whether to consider unknown cost (255) as obstacle.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/CheckStopStatus.rst b/configuration/packages/bt-plugins/actions/CheckStopStatus.rst
new file mode 100644
index 0000000000..29a8edff69
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/CheckStopStatus.rst
@@ -0,0 +1,39 @@
+.. _bt_check_stop_status_action:
+
+CheckStopStatus
+===============
+
+BT node that tracks robot odometry and returns SUCCESS if robot is considered stopped for long enough,
+RUNNING if stopped but not for long enough and FAILURE otherwise
+
+Input Port
+----------
+
+:velocity_threshold:
+
+ ======= =======
+ Type Default
+ ------- -------
+ double 0.01
+ ======= =======
+
+ Description
+ Velocity threshold below which robot is considered stopped
+
+:duration_stopped:
+
+ ======== =======
+ Type Default
+ -------- -------
+ int (ms) 1000
+ ======== =======
+
+ Description
+ Duration (ms) the velocity must remain below the threshold
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ClearCostmapAroundPose.rst b/configuration/packages/bt-plugins/actions/ClearCostmapAroundPose.rst
new file mode 100644
index 0000000000..339e2d18a1
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ClearCostmapAroundPose.rst
@@ -0,0 +1,78 @@
+.. _bt_clear_costmap_around_pose_action:
+
+
+ClearCostmapAroundPose
+======================
+
+Action to call a costmap clearing around a given pose server.
+
+Input Ports
+-----------
+
+:pose:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ =============================== =======
+
+ Description
+ Pose around which to clear the costmap
+
+:reset_distance:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 1.0
+ ============== =======
+
+ Description
+ Distance from the pose under which obstacles are cleared
+
+:service_name:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ costmap service name responsible for clearing the costmap.
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Action server timeout (ms).
+
+:plugins:
+
+ ===================== =======
+ Type Default
+ --------------------- -------
+ std::vector N/A
+ ===================== =======
+
+ Description
+ Optional. A list of costmap plugin names to be cleared.
+ If specified, only these costmap plugins will be cleared.
+ Otherwise, all "clearable" costmap plugins will be cleared.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ClearCostmapAroundRobot.rst b/configuration/packages/bt-plugins/actions/ClearCostmapAroundRobot.rst
new file mode 100644
index 0000000000..e454662ee4
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ClearCostmapAroundRobot.rst
@@ -0,0 +1,66 @@
+.. _bt_clear_entire_costmap_around_robot_action:
+
+
+ClearCostmapAroundRobot
+=======================
+
+Action to call a costmap clearing around robot server.
+
+Input Ports
+-----------
+
+:reset_distance:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 1
+ ============== =======
+
+ Description
+ side size of the square area centered on the robot that will be cleared on the costmap (the rest of the costmap won't)
+
+:service_name:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ costmap service name responsible for clearing the costmap.
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Action server timeout (ms).
+
+:plugins:
+
+ ===================== =======
+ Type Default
+ --------------------- -------
+ std::vector N/A
+ ===================== =======
+
+ Description
+ Optional. A list of costmap plugin names to be cleared.
+ If specified, only these costmap plugins will be cleared.
+ Otherwise, all "clearable" costmap plugins will be cleared.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ClearCostmapExceptRegion.rst b/configuration/packages/bt-plugins/actions/ClearCostmapExceptRegion.rst
new file mode 100644
index 0000000000..d7ba02c0a8
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ClearCostmapExceptRegion.rst
@@ -0,0 +1,66 @@
+.. _bt_clear_costmap_except_region_action:
+
+
+ClearCostmapExceptRegion
+========================
+
+Action to call a costmap clearing except region server.
+
+Input Ports
+-----------
+
+:reset_distance:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 1
+ ============== =======
+
+ Description
+ side size of the square area centered on the robot that will not be cleared on the costmap (all the rest of the costmap will)
+
+:service_name:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ costmap service name responsible for clearing the costmap.
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Action server timeout (ms).
+
+:plugins:
+
+ ===================== =======
+ Type Default
+ --------------------- -------
+ std::vector N/A
+ ===================== =======
+
+ Description
+ Optional. A list of costmap plugin names to be cleared.
+ If specified, only these costmap plugins will be cleared.
+ Otherwise, all "clearable" costmap plugins will be cleared.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ClearEntireCostmap.rst b/configuration/packages/bt-plugins/actions/ClearEntireCostmap.rst
new file mode 100644
index 0000000000..9a6112d87e
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ClearEntireCostmap.rst
@@ -0,0 +1,54 @@
+.. _bt_clear_entire_costmap_action:
+
+
+ClearEntireCostmap
+==================
+
+Action to call a costmap clearing server.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ costmap service name responsible for clearing the costmap.
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Action server timeout (ms).
+
+:plugins:
+
+ ===================== =======
+ Type Default
+ --------------------- -------
+ std::vector N/A
+ ===================== =======
+
+ Description
+ Optional. A list of costmap plugin names to be cleared.
+ If specified, only these costmap plugins and the master costmap will be cleared.
+ Otherwise, the entire costmap will be cleared.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ComputeAndTrackRoute.rst b/configuration/packages/bt-plugins/actions/ComputeAndTrackRoute.rst
new file mode 100644
index 0000000000..1f876e0d56
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ComputeAndTrackRoute.rst
@@ -0,0 +1,144 @@
+.. _bt_compute_and_track_route_action:
+
+ComputeAndTrackRoute
+====================
+
+Invokes the ComputeAndTrackRoute ROS 2 action server, which is implemented by the nav2_route_ module.
+The server address can be remapped using the ``server_name`` input port.
+
+.. _nav2_route: https://github.com/ros-navigation/navigation2/tree/main/nav2_route
+
+Input Ports
+-----------
+:start:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ ===================================== =======
+
+ Description
+ Start pose. Optional. Only used if not left empty. Takes in a blackboard variable, e.g. "{start}".
+
+:goal:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ ===================================== =======
+
+ Description
+ Goal pose. Takes in a blackboard variable, e.g. "{goal}".
+
+:start_id:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ int N/A
+ ===================================== =======
+
+ Description
+ Start node ID to use.
+
+:goal_id:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ int N/A
+ ===================================== =======
+
+ Description
+ Goal node ID to use.
+
+:use_start:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool false
+ ============== =======
+
+ Description
+ Whether to use the start or use TF to obtain the robot's start pose.
+
+:use_poses:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool false
+ ============== =======
+
+ Description
+ Whether to use the start and goal poses or start and goal node IDs.
+
+:server_name:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Action server name.
+
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Action server timeout (ms).
+
+Output Ports
+------------
+
+:execution_time:
+
+ ================================= =======
+ Type Default
+ --------------------------------- -------
+ builtin_interfaces::msg::Duration N/A
+ ================================= =======
+
+ Description
+ Time it took to compute the route.
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Compute route error code. See ``ComputeAndTrackRoute`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Compute route error message. See ``ComputeAndTrackRoute`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ComputeCoveragePath.rst b/configuration/packages/bt-plugins/actions/ComputeCoveragePath.rst
new file mode 100644
index 0000000000..51eb0daf26
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ComputeCoveragePath.rst
@@ -0,0 +1,146 @@
+.. _bt_compute_coverage_path_action:
+
+ComputeCoveragePath
+===================
+
+Invokes the ComputeCoveragePath ROS 2 action server, which is implemented by the opennav_coverage_ server module.
+The server address can be remapped using the ``server_name`` input port.
+This server can take in both cartesian and GPS coordinates and is implemented using the ``Fields2Cover`` library.
+
+.. _opennav_coverage: https://github.com/open-navigation/opennav_coverage
+
+Input Ports
+-----------
+:generate_headland:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ bool true
+ ===================================== =======
+
+ Description
+ Whether or not to generate a headland of the field or polygon to compute coverage of
+
+:generate_route:
+
+ ============================================= =======
+ Type Default
+ --------------------------------------------- -------
+ bool true
+ ============================================= =======
+
+ Description
+ Whether or not to generate a route, e.g. an ordered set of swaths
+
+:generate_path:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool true
+ ============== =======
+
+ Description
+ Whether or not to generate a path, e.g. adding path connectors to the ordered route
+
+:file_field:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ The filepath to the field's GML file to use, if not specifying the field via ``polygons``
+
+
+:file_field_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ int 0
+ ============== =======
+
+ Description
+ The ID of the field in the GML File to use, if multiple exist in the same file. This is the ordered number of the fields in the file.
+
+:polygons:
+
+ =================================== =======
+ Type Default
+ ----------------------------------- -------
+ vector N/A
+ =================================== =======
+
+ Description
+ The polygons of the field, if not specifying via a GML file. The first polygon should be the outermost region, whereas additional polygons are voids.
+
+:polygons_frame_id:
+
+ =================================== =======
+ Type Default
+ ----------------------------------- -------
+ string "map"
+ =================================== =======
+
+ Description
+ The polygon's frame ID, since the GML file provides the frame ID for its format, this is the frame ID for user-defined input ``polygons``.
+
+Output Ports
+------------
+
+:nav_path:
+
+ ========================== =======
+ Type Default
+ -------------------------- -------
+ nav_msgs::msg::Path N/A
+ ========================== =======
+
+ Description
+ Path created by action server in the form of a navigation path. Takes in a blackboard variable, e.g. "{path}".
+
+:coverage_path:
+
+ ========================== =======
+ Type Default
+ -------------------------- -------
+ vector N/A
+ ========================== =======
+
+ Description
+ An ordered set of swaths and turns corresponding to the coverage path when its important to distinguish between turns and swaths for applications. A ``opennav_coverage::utils::PathComponentsIterator`` object is provided to help make this easy to use by iterating through the outputs's path components to return you the next swath and turn one at a time.
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Compute coverage error code. See ``ComputeCoveragePath`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Compute coverage error message. See ``ComputeCoveragePath`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+Note: the blackboard IDs for the path, error code, and more may be adjusted, but need to match the corresponding parameters in the ``CoverageNavigator`` plugin to set on the blackboard for use from the action server.
diff --git a/configuration/packages/bt-plugins/actions/ComputePathThroughPoses.rst b/configuration/packages/bt-plugins/actions/ComputePathThroughPoses.rst
new file mode 100644
index 0000000000..0b98ccaa7a
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ComputePathThroughPoses.rst
@@ -0,0 +1,121 @@
+.. _bt_compute_path_through_poses_action:
+
+ComputePathThroughPoses
+=======================
+
+Invokes the ComputePathThroughPoses ROS 2 action server, which is implemented by the nav2_planner_ module.
+The server address can be remapped using the ``server_name`` input port.
+
+.. _nav2_planner: https://github.com/ros-navigation/navigation2/tree/main/nav2_planner
+
+Input Ports
+-----------
+:start:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ ===================================== =======
+
+ Description
+ Start pose. Optional. Only used if not left empty. Takes in a blackboard variable, e.g. "{start}".
+
+:goals:
+
+ ==================== =======
+ Type Default
+ -------------------- -------
+ nav_msgs::msg::Goals N/A
+ ==================== =======
+
+ Description
+ Goal poses. Takes in a blackboard variable, e.g. "{goals}".
+
+:planner_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Mapped name to the planner plugin type to use, e.g. GridBased.
+
+:server_name:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Action server name.
+
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Action server timeout (ms).
+
+Output Ports
+------------
+
+:path:
+
+ ========================== =======
+ Type Default
+ -------------------------- -------
+ nav_msgs::msg::Path N/A
+ ========================== =======
+
+ Description
+ Path created by action server. Takes in a blackboard variable, e.g. "{path}".
+
+:last_reached_index:
+
+ ========================== =======
+ Type Default
+ -------------------------- -------
+ int16 -1
+ ========================== =======
+
+ Description
+ In the case of a partial plan, index of the last reached pose from the goals list. Otherwise -1 which also corresponds to ComputePathThroughPosesResult::ALL_GOALS if a full plan through all the goals was possible.
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Compute path through poses error code. See ``ComputePathThroughPoses`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Compute path through poses error message. See ``ComputePathThroughPoses`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ComputePathToPose.rst b/configuration/packages/bt-plugins/actions/ComputePathToPose.rst
new file mode 100644
index 0000000000..1f42ddf3ad
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ComputePathToPose.rst
@@ -0,0 +1,133 @@
+.. _bt_compute_path_to_pose_action:
+
+ComputePathToPose
+=================
+
+Invokes the ComputePathToPose ROS 2 action server, which is implemented by the nav2_planner_ module.
+The server address can be remapped using the ``server_name`` input port.
+
+.. _nav2_planner: https://github.com/ros-navigation/navigation2/tree/main/nav2_planner
+
+Input Ports
+-----------
+:start:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ ===================================== =======
+
+ Description
+ Start pose. Optional. Used as the planner start pose instead of the current robot pose, if ``use_start`` is not false (i.e. not provided or set to true). Takes in a blackboard variable, e.g. "{start}".
+
+:use_start:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ ===================================== =======
+
+ Description
+ Optional. For using or not using (i.e. ignoring) the provided start pose ``start``. Takes in a blackboard variable, e.g. "{use_start}".
+
+:goal:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ ===================================== =======
+
+ Description
+ Goal pose. Takes in a blackboard variable, e.g. "{goal}".
+
+:viapoints:
+
+ ============================================= =======
+ Type Default
+ --------------------------------------------- -------
+ std::vector N/A
+ ============================================= =======
+
+ Description
+ Optional. A list of intermediate viapoints (excluding goal) to consider for planning. Takes in a blackboard variable, e.g. "{viapoints}".
+
+:planner_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Mapped name to the planner plugin type to use, e.g. GridBased.
+
+:server_name:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Action server name.
+
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Action server timeout (ms).
+
+Output Ports
+------------
+
+:path:
+
+ ========================== =======
+ Type Default
+ -------------------------- -------
+ nav_msgs::msg::Path N/A
+ ========================== =======
+
+ Description
+ Path created by action server. Takes in a blackboard variable, e.g. "{path}".
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Compute path to pose error code. See ``ComputePathToPose`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Compute path to pose error message. See ``ComputePathToPose`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ComputeRoute.rst b/configuration/packages/bt-plugins/actions/ComputeRoute.rst
new file mode 100644
index 0000000000..3ea8854995
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ComputeRoute.rst
@@ -0,0 +1,166 @@
+.. _bt_compute_route_action:
+
+ComputeRoute
+============
+
+Invokes the ComputeRoute ROS 2 action server, which is implemented by the nav2_route_ module.
+The server address can be remapped using the ``server_name`` input port.
+
+.. _nav2_route: https://github.com/ros-navigation/navigation2/tree/main/nav2_route
+
+Input Ports
+-----------
+:start:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ ===================================== =======
+
+ Description
+ Start pose. Optional. Only used if not left empty. Takes in a blackboard variable, e.g. "{start}".
+
+:goal:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ ===================================== =======
+
+ Description
+ Goal pose. Takes in a blackboard variable, e.g. "{goal}".
+
+:start_id:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ int N/A
+ ===================================== =======
+
+ Description
+ Start node ID to use.
+
+:goal_id:
+
+ ===================================== =======
+ Type Default
+ ------------------------------------- -------
+ int N/A
+ ===================================== =======
+
+ Description
+ Goal node ID to use.
+
+:use_start:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool false
+ ============== =======
+
+ Description
+ Whether to use the start or use TF to obtain the robot's start pose.
+
+:use_poses:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool false
+ ============== =======
+
+ Description
+ Whether to use the start and goal poses or start and goal node IDs.
+
+:server_name:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Action server name.
+
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Action server timeout (ms).
+
+Output Ports
+------------
+
+:route:
+
+ ========================== =======
+ Type Default
+ -------------------------- -------
+ nav2_msgs::msg::Route N/A
+ ========================== =======
+
+ Description
+ Route created by action server. Takes in a blackboard variable, e.g. "{route}".
+
+:path:
+
+ ========================== =======
+ Type Default
+ -------------------------- -------
+ nav_msgs::msg::Path N/A
+ ========================== =======
+
+ Description
+ Path created by action server. Takes in a blackboard variable, e.g. "{path}".
+
+:planning_time:
+
+ ================================= =======
+ Type Default
+ --------------------------------- -------
+ builtin_interfaces::msg::Duration N/A
+ ================================= =======
+
+ Description
+ Time it took to compute the route.
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Compute route error code. See ``ComputeRoute`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Compute route error message. See ``ComputeRoute`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ConcatenatePaths.rst b/configuration/packages/bt-plugins/actions/ConcatenatePaths.rst
new file mode 100644
index 0000000000..8e52a4c0ec
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ConcatenatePaths.rst
@@ -0,0 +1,53 @@
+.. _bt_concatenate_paths_action:
+
+ConcatenatePaths
+================
+
+Concatenates two paths into a single path, in order such that the output is ``input_path1 + input_path2``.
+May be used with multiple of these calls sequentially to concatenate multiple paths.
+
+Input Ports
+-----------
+
+:input_path1:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ nav_msgs/Path N/A
+ =============================== =======
+
+ Description
+ First path to concatenate.
+
+:input_path2:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ nav_msgs/Path N/A
+ =============================== =======
+
+ Description
+ Second path to concatenate.
+
+Output Ports
+------------
+
+:input_path2:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ nav_msgs/Path N/A
+ =============================== =======
+
+ Description
+ Output concatenated path.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ControllerSelector.rst b/configuration/packages/bt-plugins/actions/ControllerSelector.rst
new file mode 100644
index 0000000000..c69d75d492
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ControllerSelector.rst
@@ -0,0 +1,58 @@
+.. _bt_controller_selector_node:
+
+ControllerSelector
+==================
+
+It is used to select the Controller that will be used by the Controller server. It subscribes to the ``controller_selector`` topic to receive command messages with the name of the Controller to be used. It is commonly used before of the FollowPathAction. The ``selected_controller`` output port is passed to ``controller_id`` input port of the FollowPathAction. If none is provided on the topic, the ``default_controller`` is used.
+
+Any publisher to this topic needs to be configured with some QoS defined as ``reliable`` and ``transient local``.
+
+.. _bt_navigator: https://github.com/ros-navigation/navigation2/tree/main/nav2_bt_navigator
+
+Input Ports
+-----------
+
+:topic_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string controller_selector
+ ====== =======
+
+ Description
+ The name of the topic used to received select command messages. This is used to support multiple ControllerSelector nodes.
+
+:default_controller:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The default value for the selected Controller if no message is received from the input topic.
+
+
+Output Ports
+------------
+
+:selected_controller:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The output selected Controller id. This selected_controller string is usually passed to the FollowPath behavior via the controller_id input port.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/DockRobot.rst b/configuration/packages/bt-plugins/actions/DockRobot.rst
new file mode 100644
index 0000000000..e14101df0d
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/DockRobot.rst
@@ -0,0 +1,131 @@
+.. _bt_dock_robot_action:
+
+DockRobot
+=========
+
+Invokes the DockRobot ROS 2 action server, which is implemented by the docking server.
+
+It is used to dock the robot to a docking station.
+
+Input Ports
+***********
+
+:use_dock_id:
+
+ ==== =======
+ Type Default
+ ---- -------
+ bool true
+ ==== =======
+
+ Description
+ Whether to use the dock's ID or dock pose fields.
+
+:dock_id:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Dock ID or name to use.
+
+:dock_pose:
+
+ ========================= =======
+ Type Default
+ ------------------------- -------
+ geometry_msgs/PoseStamped N/A
+ ========================= =======
+
+ Description
+ The dock pose, if not using dock id.
+
+:dock_type:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The dock plugin type, if using dock pose.
+
+:max_staging_time:
+
+ ===== =======
+ Type Default
+ ----- -------
+ float 1000.0
+ ===== =======
+
+ Description
+ Maximum time to navigate to the staging pose.
+
+:navigate_to_staging_pose:
+
+ ==== =======
+ Type Default
+ ---- -------
+ bool true
+ ==== =======
+
+ Description
+ Whether to autonomously navigate to staging pose.
+
+Output Ports
+------------
+
+:success:
+
+ ==== =======
+ Type Default
+ ---- -------
+ bool true
+ ==== =======
+
+ Description
+ If the action was successful.
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 0
+ ============== =======
+
+ Description
+ Dock robot error code. See ``DockRobot`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string 0
+ ============== =======
+
+ Description
+ Dock robot error message. See ``DockRobot`` action message for the enumerated set of error codes.
+
+:num_retries:
+
+ ====== =======
+ Type Default
+ ------ -------
+ uint16 0
+ ====== =======
+
+ Description
+ The number of retries executed.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/DriveOnHeading.rst b/configuration/packages/bt-plugins/actions/DriveOnHeading.rst
new file mode 100644
index 0000000000..ee0cb908cd
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/DriveOnHeading.rst
@@ -0,0 +1,111 @@
+.. _bt_driveonheading_action:
+
+DriveOnHeading
+==============
+
+Invokes the DriveOnHeading ROS 2 action server, which causes the robot to drive on the current heading by a specific displacement.
+It performs a linear translation by a given distance. The nav2_behaviors module implements the DriveOnHeading action server.
+
+.. nav2_behaviors_: https://github.com/ros-navigation/navigation2/tree/main/nav2_behaviors
+
+Input Ports
+***********
+
+:dist_to_travel:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.15
+ ====== =======
+
+ Description
+ Distance to travel (m).
+
+:speed:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.025
+ ====== =======
+
+ Description
+ Speed at which to travel (m/s).
+
+:time_allowance:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10.0
+ ====== =======
+
+ Description
+ Time to invoke behavior for, if exceeds considers it a stuck condition or failure case (seconds).
+
+:server_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Action server name.
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Action server timeout (ms).
+
+:disable_collision_checks:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool false
+ ====== =======
+
+ Description
+ Disable collision checking.
+
+Output Ports
+------------
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Drive on heading error code. See ``DriveOnHeading`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Drive on heading error message. See ``DriveOnHeading`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ExtractRouteNodesAsGoals.rst b/configuration/packages/bt-plugins/actions/ExtractRouteNodesAsGoals.rst
new file mode 100644
index 0000000000..8aac68f189
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ExtractRouteNodesAsGoals.rst
@@ -0,0 +1,42 @@
+.. _bt_extract_route_nodes_as_goals_action:
+
+ExtractRouteNodesAsGoals
+========================
+
+Concatenates two paths into a single path, in order such that the output is ``input_path1 + input_path2``.
+May be used with multiple of these calls sequentially to concatenate multiple paths.
+
+Input Ports
+-----------
+
+:route:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ nav2_msgs/Route N/A
+ =============================== =======
+
+ Description
+ Route to convert its ``nodes`` into Goals.
+
+Output Ports
+------------
+
+:goals:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ nav_msgs/Goals N/A
+ =============================== =======
+
+ Description
+ Goals comparing the route's ``nodes``.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/FollowObject.rst b/configuration/packages/bt-plugins/actions/FollowObject.rst
new file mode 100644
index 0000000000..64d84152d5
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/FollowObject.rst
@@ -0,0 +1,99 @@
+.. _bt_follow_object_action:
+
+FollowObject
+============
+
+Invokes the FollowObject ROS 2 action server, it will dynamically follow an object while maintaining a defined distance.
+The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+:pose_topic:
+
+ ============== ============
+ Type Default
+ -------------- ------------
+ string dynamic_pose
+ ============== ============
+
+ Description
+ Topic to publish the pose of the object to follow.
+
+:max_duration:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 0.0
+ ============== =======
+
+ Description
+ The maximum duration to follow the object.
+
+:tracked_frame:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Target frame to follow.
+
+:server_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Action server name.
+
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Action server timeout (ms).
+
+
+Output Ports
+------------
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Follow object error code. See ``FollowObject`` action for the enumerated set of error code definitions.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Follow object error message. See ``FollowObject`` action for the enumerated set of error code definitions.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/FollowPath.rst b/configuration/packages/bt-plugins/actions/FollowPath.rst
new file mode 100644
index 0000000000..aa4a6507e4
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/FollowPath.rst
@@ -0,0 +1,134 @@
+.. _bt_follow_path_action:
+
+FollowPath
+==========
+
+Invokes the FollowPath ROS 2 action server, which is implemented by the controller plugin modules loaded.
+The server address can be remapped using the ``server_name`` input port.
+
+Input Ports
+-----------
+
+:path:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Takes in a blackboard variable containing the path to follow, eg. "{path}".
+
+:controller_id:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Mapped name of the controller plugin type to use, e.g. FollowPath.
+
+:goal_checker_id:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Mapped name of the goal checker plugin type to use, e.g. SimpleGoalChecker.
+
+:progress_checker_id:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Mapped name of the progress checker plugin type to use, e.g. SimpleProgressChecker.
+
+:path_handler_id:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Mapped name of the path handler plugin type to use, e.g. FeasiblePathHandler.
+
+:server_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Action server name.
+
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Action server timeout (ms).
+
+
+Output Ports
+------------
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Follow path error code. See ``FollowPath`` action for the enumerated set of error code definitions.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Follow path error message. See ``FollowPath`` action for the enumerated set of error code definitions.
+
+:tracking_feedback:
+
+ ================================ =======
+ Type Default
+ -------------------------------- -------
+ nav2_msgs::msg::TrackingFeedback N/A
+ ================================ =======
+
+ Description
+ Tracking feedback message from the controller server, including cross track error, current path index, remaining path length, etc.
+
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/GetCurrentPose.rst b/configuration/packages/bt-plugins/actions/GetCurrentPose.rst
new file mode 100644
index 0000000000..251435e647
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/GetCurrentPose.rst
@@ -0,0 +1,52 @@
+.. _bt_get_current_pose_action:
+
+GetCurrentPose
+==============
+
+Obtains the current pose from TF and places it on the blackboard for other nodes to use.
+
+Input Ports
+-----------
+
+:robot_base_frame:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ string N/A
+ =============================== =======
+
+ Description
+ Robot base frame to transform poses to if not given in the same frame. If not provided, uses the BT Navigator's ``base_frame`` setting automatically.
+
+:global_frame:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Global frame to transform poses to if not given in the same frame. If not provided, uses the BT Navigator's ``global_frame`` setting automatically.
+
+Output Ports
+------------
+
+:current_pose:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ =============================== =======
+
+ Description
+ The current pose in the global frame.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/GetNextFewGoals.rst b/configuration/packages/bt-plugins/actions/GetNextFewGoals.rst
new file mode 100644
index 0000000000..f535b950f2
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/GetNextFewGoals.rst
@@ -0,0 +1,53 @@
+.. _bt_get_next_few_goals_action:
+
+GetNextFewGoals
+===============
+
+Extracts only the next ``N`` goals from a list of goals to send to a later task that only needs localized future knowledge.
+
+Input Ports
+-----------
+
+:num_goals:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ int N/A
+ =============================== =======
+
+ Description
+ How many of the goals to take from the input goals.
+
+:input_goals:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ nav_msgs/Goals N/A
+ =============================== =======
+
+ Description
+ Input goals list.
+
+
+Output Ports
+------------
+
+:output_goals:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ nav_msgs/Goals N/A
+ =============================== =======
+
+ Description
+ The output pruned goals list.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/GetPoseFromPath.rst b/configuration/packages/bt-plugins/actions/GetPoseFromPath.rst
new file mode 100644
index 0000000000..a9918ff729
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/GetPoseFromPath.rst
@@ -0,0 +1,52 @@
+.. _bt_getposefrompath_action:
+
+GetPoseFromPath
+===============
+
+Gets a pose from a particular index on the path. Use ``-1`` to get the last pose, ``-2`` for second to last, and so on.
+
+Input Ports
+***********
+
+:path:
+
+ ============= =======
+ Type Default
+ ------------- -------
+ nav_msgs/Path N/A
+ ============= =======
+
+ Description
+ Path to extract pose from
+
+:index:
+
+ ====== =======
+ Type Default
+ ------ -------
+ int 0
+ ====== =======
+
+ Description
+ Index from path to use. Use ``-1`` to get the last pose, ``-2`` for second to last, and so on.
+
+Output Ports
+------------
+
+:pose:
+
+ ========================= =======
+ Type Default
+ ------------------------- -------
+ geometry_msgs/PoseStamped N/A
+ ========================= =======
+
+ Description
+ Pose from path, with the Path's set header.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/GoalCheckerSelector.rst b/configuration/packages/bt-plugins/actions/GoalCheckerSelector.rst
new file mode 100644
index 0000000000..4bdcf5e7f0
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/GoalCheckerSelector.rst
@@ -0,0 +1,58 @@
+.. _bt_goal_checker_selector_node:
+
+GoalCheckerSelector
+===================
+
+It is used to select the GoalChecker that will be used by the goal_checker server. It subscribes to the ``goal_checker_selector`` topic to receive command messages with the name of the GoalChecker to be used. It is commonly used before of the FollowPathAction. The ``selected_goal_checker`` output port is passed to ``goal_checker_id`` input port of the FollowPathAction. If none is provided on the topic, the ``default_goal_checker`` is used.
+
+Any publisher to this topic needs to be configured with some QoS defined as ``reliable`` and ``transient local``.
+
+.. _bt_navigator: https://github.com/ros-navigation/navigation2/tree/main/nav2_bt_navigator
+
+Input Ports
+-----------
+
+:topic_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string goal_checker_selector
+ ====== =======
+
+ Description
+ The name of the topic used to received select command messages. This is used to support multiple GoalCheckerSelector nodes.
+
+:default_goal_checker:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The default value for the selected GoalChecker if no message is received from the input topic.
+
+
+Output Ports
+------------
+
+:selected_goal_checker:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The output selected GoalChecker id. This selected_goal_checker string is usually passed to the FollowPath behavior via the goal_checker_id input port.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/NavigateThroughPoses.rst b/configuration/packages/bt-plugins/actions/NavigateThroughPoses.rst
new file mode 100644
index 0000000000..cd5ddc3636
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/NavigateThroughPoses.rst
@@ -0,0 +1,89 @@
+.. _bt_navigate_through_poses_action:
+
+NavigateThroughPoses
+====================
+
+Invokes the NavigateThroughPoses ROS 2 action server, which is implemented by the bt_navigator_ module.
+
+.. _bt_navigator: https://github.com/ros-navigation/navigation2/tree/main/nav2_bt_navigator
+
+Input Ports
+-----------
+
+:goals:
+
+ ==================== =======
+ Type Default
+ -------------------- -------
+ nav_msgs::msg::Goals N/A
+ ==================== =======
+
+ Description
+ Goal poses. Takes in a blackboard variable, e.g. "{goals}".
+
+:server_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Action server name.
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Action server timeout (ms).
+
+:behavior_tree:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Behavior tree absolute path or ID. If none is specified, NavigateThroughPoses action server uses a default behavior tree.
+
+Output Ports
+------------
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ The lowest error code in the list of the `error_code_name_prefixes` parameter.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ The error message associated with the lowest error code in the list of the `error_code_name_prefixes` parameter.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/NavigateToPose.rst b/configuration/packages/bt-plugins/actions/NavigateToPose.rst
new file mode 100644
index 0000000000..b9f5d7f6bb
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/NavigateToPose.rst
@@ -0,0 +1,89 @@
+.. _bt_navigate_to_pose_action:
+
+NavigateToPose
+==============
+
+Invokes the NavigateToPose ROS 2 action server, which is implemented by the bt_navigator_ module.
+
+.. _bt_navigator: https://github.com/ros-navigation/navigation2/tree/main/nav2_bt_navigator
+
+Input Ports
+-----------
+
+:goal:
+
+ =========== =======
+ Type Default
+ ----------- -------
+ PoseStamped N/A
+ =========== =======
+
+ Description
+ Takes in a blackboard variable containing the goal, eg. "{goal}".
+
+:server_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Action server name.
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Action server timeout (ms).
+
+:behavior_tree:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Behavior tree absolute path or ID. If none is specified, NavigateToPose action server uses a default behavior tree.
+
+Output Ports
+------------
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ The lowest error code in the list of the `error_code_names_prefixes` + `_error_code` suffix parameter.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ The error messages associated with the lowest error code in the list of the `error_code_name_prefixes` + `_error_code` parameter.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/PathHandlerSelector.rst b/configuration/packages/bt-plugins/actions/PathHandlerSelector.rst
new file mode 100644
index 0000000000..c7dc0c6f0a
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/PathHandlerSelector.rst
@@ -0,0 +1,58 @@
+.. _bt_path_handler_selector_node:
+
+PathHandlerSelector
+===================
+
+It is used to select the PathHandler that will be used by the controller server. It subscribes to the ``path_handler_selector`` topic to receive command messages with the name of the PathHandler to be used. It is commonly used before of the FollowPathAction. The ``selected_path_handler`` output port is passed to ``path_handler_id`` input port of the FollowPathAction. If none is provided on the topic, the ``default_path_handler`` is used.
+
+Any publisher to this topic needs to be configured with some QoS defined as ``reliable`` and ``transient local``.
+
+.. _bt_navigator: https://github.com/ros-navigation/navigation2/tree/main/nav2_bt_navigator
+
+Input Ports
+-----------
+
+:topic_name:
+
+ ====== =====================
+ Type Default
+ ------ ---------------------
+ string path_handler_selector
+ ====== =====================
+
+ Description
+ The name of the topic used to received select command messages. This is used to support multiple PathHandlerSelector nodes.
+
+:default_path_handler:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The default value for the selected PathHandler if no message is received from the input topic.
+
+
+Output Ports
+------------
+
+:selected_path_handler:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The output selected PathHandler id. This selected_path_handler string is usually passed to the FollowPath behavior via the path_handler_id input port.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/PlannerSelector.rst b/configuration/packages/bt-plugins/actions/PlannerSelector.rst
new file mode 100644
index 0000000000..b819d5727c
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/PlannerSelector.rst
@@ -0,0 +1,58 @@
+.. _bt_planner_selector_node:
+
+PlannerSelector
+===============
+
+It is used to select the planner that will be used by the planner server. It subscribes to the ``planner_selector`` topic to receive command messages with the name of the planner to be used. It is commonly used before of the ComputePathToPoseAction. The ``selected_planner`` output port is passed to ``planner_id`` input port of the ComputePathToPoseAction. If none is provided on the topic, the ``default_planner`` is used.
+
+Any publisher to this topic needs to be configured with some QoS defined as ``reliable`` and ``transient local``.
+
+.. _bt_navigator: https://github.com/ros-navigation/navigation2/tree/main/nav2_bt_navigator
+
+Input Ports
+-----------
+
+:topic_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string planner_selector
+ ====== =======
+
+ Description
+ The name of the topic used to received select command messages. This is used to support multiple PlannerSelector nodes.
+
+:default_planner:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The default value for the selected planner if no message is received from the input topic.
+
+
+Output Ports
+------------
+
+:selected_planner:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The output selected planner id. This selected_planner string is usually passed to the ComputePathToPose behavior via the planner_id input port.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ProgressCheckerSelector.rst b/configuration/packages/bt-plugins/actions/ProgressCheckerSelector.rst
new file mode 100644
index 0000000000..ac3c53a358
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ProgressCheckerSelector.rst
@@ -0,0 +1,58 @@
+.. _bt_progress_checker_selector_node:
+
+ProgressCheckerSelector
+=======================
+
+It is used to select the ProgressChecker that will be used by the progress_checker server. It subscribes to the ``progress_checker_selector`` topic to receive command messages with the name of the ProgressChecker to be used. It is commonly used before of the FollowPathAction. The ``selected_progress_checker`` output port is passed to ``progress_checker_id`` input port of the FollowPathAction. If none is provided on the topic, the ``default_progress_checker`` is used.
+
+Any publisher to this topic needs to be configured with some QoS defined as ``reliable`` and ``transient local``.
+
+.. _bt_navigator: https://github.com/ros-navigation/navigation2/tree/main/nav2_bt_navigator
+
+Input Ports
+-----------
+
+:topic_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string progress_checker_selector
+ ====== =======
+
+ Description
+ The name of the topic used to received select command messages. This is used to support multiple ProgressCheckerSelector nodes.
+
+:default_progress_checker:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The default value for the selected ProgressChecker if no message is received from the input topic.
+
+
+Output Ports
+------------
+
+:selected_progress_checker:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The output selected ProgressChecker id. This selected_progress_checker string is usually passed to the FollowPath behavior via the progress_checker_id input port.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ReinitializeGlobalLocalization.rst b/configuration/packages/bt-plugins/actions/ReinitializeGlobalLocalization.rst
new file mode 100644
index 0000000000..1936aab39c
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ReinitializeGlobalLocalization.rst
@@ -0,0 +1,39 @@
+.. _bt_reinitialize_global_localization_action:
+
+ReinitializeGlobalLocalization
+==============================
+
+Used to trigger global relocalization using AMCL in case of severe delocalization or kidnapped robot problem.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Service name.
+
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/RemoveInCollisionGoals.rst b/configuration/packages/bt-plugins/actions/RemoveInCollisionGoals.rst
new file mode 100644
index 0000000000..d618a91a08
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/RemoveInCollisionGoals.rst
@@ -0,0 +1,108 @@
+.. _bt_remove_in_collision_goals_action:
+
+RemoveInCollisionGoals
+======================
+
+Looks over the input port ``goals`` and removes any waypoint that has a point or footprint cost above a certain threshold.
+This may be used to cull goal points passed from ``ComputePathThroughPoses`` to avoid waiting indefinitely on occupied waypoints.
+
+Input Ports
+-----------
+
+:service_name:
+
+ ====== =======================================
+ Type Default
+ ------ ---------------------------------------
+ string /global_costmap/get_cost_global_costmap
+ ====== =======================================
+
+ Description
+ costmap service name responsible for getting the cost.
+
+:input_goals:
+
+ ==================== =======
+ Type Default
+ -------------------- -------
+ nav_msgs::msg::Goals N/A
+ ==================== =======
+
+ Description
+ A vector of goals to check if in collision
+
+:cost_threshold:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 254.0
+ ====== =======
+
+ Description
+ The cost threshold above which a waypoint is considered in collision and should be removed. If ``use_footprint = false``, consider setting to 253 for occupied.
+
+:use_footprint:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool true
+ ====== =======
+
+ Description
+ Whether to use the footprint cost or the point cost.
+
+:consider_unknown_as_obstacle:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool false
+ ====== =======
+
+ Description
+ Whether to consider unknown cost (255) as obstacle.
+
+:input_waypoint_statuses:
+
+ =========================================== =======
+ Type Default
+ ------------------------------------------- -------
+ std::vector N/A
+ =========================================== =======
+
+ Description
+ Original waypoint_statuses to mark waypoint status from.
+
+Output Ports
+------------
+
+:output_goals:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ =============================== =======
+
+ Description
+ A vector of goals containing only those that are not in collision.
+
+:output_waypoint_statuses:
+
+ =========================================== =======
+ Type Default
+ ------------------------------------------- -------
+ std::vector N/A
+ =========================================== =======
+
+ Description
+ Waypoint_statuses with in-collision waypoints marked.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/RemovePassedGoals.rst b/configuration/packages/bt-plugins/actions/RemovePassedGoals.rst
new file mode 100644
index 0000000000..5e2084714a
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/RemovePassedGoals.rst
@@ -0,0 +1,86 @@
+.. _bt_remove_passed_goals_action:
+
+RemovePassedGoals
+=================
+
+Looks over the input port ``goals`` and removes any point that the robot is in close proximity to or has recently passed.
+This is used to cull goal points that have been passed from ``ComputePathThroughPoses`` to enable replanning to only the current task goals.
+
+Input Ports
+-----------
+
+:radius:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.5
+ ====== =======
+
+ Description
+ The radius (m) in proximity to the viapoint for the BT node to remove from the list as having passed.
+
+:robot_base_frame:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ string N/A
+ ====== ===========
+
+ Description
+ Robot base frame. If not provided, uses the BT Navigator's ``robot_base_frame`` setting automatically.
+
+:input_goals:
+
+ ==================== =======
+ Type Default
+ -------------------- -------
+ nav_msgs::msg::Goals N/A
+ ==================== =======
+
+ Description
+ A vector of goals to check if it passed any in the current iteration.
+
+:input_waypoint_statuses:
+
+ =========================================== =======
+ Type Default
+ ------------------------------------------- -------
+ std::vector N/A
+ =========================================== =======
+
+ Description
+ Original waypoint_statuses to mark waypoint status from.
+
+Output Ports
+------------
+
+:output_goals:
+
+ ==================== =======
+ Type Default
+ -------------------- -------
+ nav_msgs::msg::Goals N/A
+ ==================== =======
+
+ Description
+ A vector of goals with goals removed in proximity to the robot
+
+:output_waypoint_statuses:
+
+ =========================================== =======
+ Type Default
+ ------------------------------------------- -------
+ std::vector N/A
+ =========================================== =======
+
+ Description
+ Waypoint_statuses with passed waypoints marked.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/Smooth.rst b/configuration/packages/bt-plugins/actions/Smooth.rst
new file mode 100644
index 0000000000..92f5d7b161
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/Smooth.rst
@@ -0,0 +1,118 @@
+.. _bt_smooth_action:
+
+SmoothPath
+==========
+
+Invokes the SmoothPath action API in the smoother server to smooth a given path plan.
+
+Input Ports
+-----------
+
+:unsmoothed_path:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The blackboard variable or hard-coded input path to smooth
+
+:max_smoothing_duration:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 3.0
+ ====== =======
+
+ Description
+ Maximum time to smooth for (seconds)
+
+:check_for_collisions:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool false
+ ====== =======
+
+ Description
+ Whether to check the output smoothed path for collisions.
+
+:smoother_id:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The smoother plugin ID to use for smoothing in the smoother server
+
+Output Ports
+------------
+
+:smoothed_path:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The output blackboard variable to assign the smoothed path to
+
+:smoothing_duration:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double N/A
+ ====== =======
+
+ Description
+ The actual duration used for smoothing
+
+:was_completed:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool N/A
+ ====== =======
+
+ Description
+ Indicates if the smoothing process was completed. Will return ``false`` if ``check_for_collisions`` is set to ``true`` and a collision is detected.
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Follow smoother error code. See ``SmoothPath`` action for the enumerated set of error code definitions.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Follow smoother error message. See ``SmoothPath`` action for the enumerated set of error code definitions.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/SmootherSelector.rst b/configuration/packages/bt-plugins/actions/SmootherSelector.rst
new file mode 100644
index 0000000000..256392eee8
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/SmootherSelector.rst
@@ -0,0 +1,58 @@
+.. _bt_smoother_selector_node:
+
+SmootherSelector
+==================
+
+It is used to select the Smoother that will be used by the Smoother server. It subscribes to the ``smoother_selector`` topic to receive command messages with the name of the Smoother to be used. It is commonly used before of the FollowPathAction. If none is provided on the topic, the ``default_smoother`` is used.
+
+Any publisher to this topic needs to be configured with some QoS defined as ``reliable`` and ``transient local``.
+
+.. _bt_navigator: https://github.com/ros-navigation/navigation2/tree/main/nav2_bt_navigator
+
+Input Ports
+-----------
+
+:topic_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string smoother_selector
+ ====== =======
+
+ Description
+ The name of the topic used to received select command messages. This is used to support multiple SmootherSelector nodes.
+
+:default_smoother:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The default value for the selected Smoother if no message is received from the input topic.
+
+
+Output Ports
+------------
+
+:selected_smoother:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The output selected Smoother id.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/Spin.rst b/configuration/packages/bt-plugins/actions/Spin.rst
new file mode 100644
index 0000000000..1c45084aab
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/Spin.rst
@@ -0,0 +1,112 @@
+.. _bt_spin_action:
+
+Spin
+====
+
+Invokes the Spin ROS 2 action server, which is implemented by the nav2_behaviors_ module.
+It performs an in-place rotation by a given angle.
+This action is used in nav2 Behavior Trees as a recovery behavior.
+
+.. _nav2_behaviors: https://github.com/ros-navigation/navigation2/tree/main/nav2_behaviors
+
+Input Ports
+-----------
+
+:spin_dist:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 1.57
+ ====== =======
+
+ Description
+ Spin distance (radians).
+
+:time_allowance:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10.0
+ ====== =======
+
+ Description
+ Time to invoke behavior for, if exceeds considers it a stuck condition or failure case (seconds).
+
+:server_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Action server name.
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Action server timeout (ms).
+
+:is_recovery:
+
+ ==== =======
+ Type Default
+ ---- -------
+ bool True
+ ==== =======
+
+ Description
+ True if the action is being used as a recovery.
+
+:disable_collision_checks:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool false
+ ====== =======
+
+ Description
+ Disable collision checking.
+
+Output Ports
+------------
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Spin error code. See ``Spin`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Spin error message. See ``Spin`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ToggleCollisionMonitor.rst b/configuration/packages/bt-plugins/actions/ToggleCollisionMonitor.rst
new file mode 100644
index 0000000000..a0391010d9
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ToggleCollisionMonitor.rst
@@ -0,0 +1,50 @@
+.. _bt_toggle_colllsion_monitor_service:
+
+
+ToggleCollisionMonitor
+======================
+
+Calls the ToggleCollisionMonitor service. Used to toggle the collision monitor on (enabled) and off (disabled).
+
+Input Ports
+-----------
+
+:enable:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool true
+ ============== =======
+
+ Description
+ Whether to enable or disable the collision monitor.
+
+:service_name:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Service name.
+
+:server_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 10
+ ============== =======
+
+ Description
+ Server timeout (ms).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/TruncatePath.rst b/configuration/packages/bt-plugins/actions/TruncatePath.rst
new file mode 100644
index 0000000000..9c94f20720
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/TruncatePath.rst
@@ -0,0 +1,52 @@
+.. _bt_truncate_path:
+
+TruncatePath
+============
+
+A custom control node, which modifies a path making it shorter. It removes parts of the path closer than a distance to the goal pose. The resulting last pose of the path orientates the robot to the original goal pose.
+
+Input Ports
+-----------
+
+:input_path:
+
+ ============= =======
+ Type Default
+ ------------- -------
+ nav_msgs/Path N/A
+ ============= =======
+
+ Description
+ The original path to be truncated.
+
+:distance:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ double 1.0
+ ====== ===========
+
+ Description
+ The distance to the original goal for truncating the path.
+
+Output Ports
+------------
+
+:output_path:
+
+ ============= =======
+ Type Default
+ ------------- -------
+ nav_msgs/Path N/A
+ ============= =======
+
+ Description
+ The resulting truncated path.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/TruncatePathLocal.rst b/configuration/packages/bt-plugins/actions/TruncatePathLocal.rst
new file mode 100644
index 0000000000..6f78633e53
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/TruncatePathLocal.rst
@@ -0,0 +1,118 @@
+.. _bt_truncate_path_local:
+
+TruncatePathLocal
+=================
+
+A custom control node, which modifies a path making it shorter. It removes parts of the path which are more distant than specified forward/backward distance around robot
+
+Input Ports
+-----------
+
+:input_path:
+
+ ============= =======
+ Type Default
+ ------------- -------
+ nav_msgs/Path N/A
+ ============= =======
+
+ Description
+ The original path to be truncated.
+
+:distance_forward:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ double 8.0
+ ====== ===========
+
+ Description
+ The trimming distance in forward direction. Set to -1 to search full path forward.
+
+:distance_backward:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ double 4.0
+ ====== ===========
+
+ Description
+ The trimming distance in backward direction.
+
+:robot_base_frame:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ string N/A
+ ====== ===========
+
+ Description
+ Robot base frame id. If not provided, uses the BT Navigator's ``robot_base_frame`` setting automatically.
+
+:transform_tolerance:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ double 0.2
+ ====== ===========
+
+ Description
+ Robot pose lookup tolerance.
+
+:pose:
+
+ ========================= ===========
+ Type Default
+ ------------------------- -----------
+ geometry_msgs/PoseStamped N/A
+ ========================= ===========
+
+ Description
+ Manually specified pose to be used alternatively to current robot pose.
+
+:angular_distance_weight:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ double 0.0
+ ====== ===========
+
+ Description
+ Weight of angular distance relative to positional distance when finding which path pose is closest to robot. Not applicable on paths without orientations assigned.
+
+:max_robot_pose_search_dist:
+
+ ====== ========
+ Type Default
+ ------ --------
+ double infinity
+ ====== ========
+
+ Description
+ Maximum forward integrated distance along the path (starting from the last detected pose) to bound the search for the closest pose to the robot. When set to infinity (default), whole path is searched every time.
+
+Output Ports
+------------
+
+:output_path:
+
+ ============= =======
+ Type Default
+ ------------- -------
+ nav_msgs/Path N/A
+ ============= =======
+
+ Description
+ The resulting truncated path.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/UndockRobot.rst b/configuration/packages/bt-plugins/actions/UndockRobot.rst
new file mode 100644
index 0000000000..c9089cb7c7
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/UndockRobot.rst
@@ -0,0 +1,76 @@
+.. _bt_undock_robot_action:
+
+UndockRobot
+===========
+
+Invokes the UndockRobot ROS 2 action server, which is implemented by the docking server.
+
+It is used to undock the robot from a docking station.
+
+Input Ports
+***********
+
+:dock_type:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ The dock plugin type, if not previous instance used for docking.
+
+:max_undocking_time:
+
+ ===== =======
+ Type Default
+ ----- -------
+ float 30.0
+ ===== =======
+
+ Description
+ Maximum time to get back to the staging pose.
+
+Output Ports
+------------
+
+:success:
+
+ ==== =======
+ Type Default
+ ---- -------
+ bool true
+ ==== =======
+
+ Description
+ If the action was successful.
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 0
+ ============== =======
+
+ Description
+ Dock robot error code. See ``UndockRobot`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string 0
+ ============== =======
+
+ Description
+ Dock robot error message. See ``UndockRobot`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/ValidatePath.rst b/configuration/packages/bt-plugins/actions/ValidatePath.rst
new file mode 100644
index 0000000000..c0f5bcc07b
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/ValidatePath.rst
@@ -0,0 +1,167 @@
+.. _bt_validate_path_action:
+
+ValidatePath
+============
+
+Checks to see if the global path is valid. If there is an
+obstacle along the path, it returns FAILURE, otherwise
+it returns SUCCESS. Optionally checks specific costmap layers and
+can use a custom footprint for validation.
+
+Input Ports
+-----------
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 20.0
+ ====== =======
+
+ Description
+ Service response timeout (ms).
+
+:path:
+
+ ==================================== =======
+ Type Default
+ ------------------------------------ -------
+ nav_msgs::msg::Path N/A
+ ==================================== =======
+
+ Description
+ The global path to check for validity.
+
+:max_cost:
+
+ ============== ==========
+ Type Default
+ -------------- ----------
+ unsigned int 254
+ ============== ==========
+
+ Description
+ The maximum allowable cost for the path to be considered valid.
+
+:consider_unknown_as_obstacle:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool false
+ ====== =======
+
+ Description
+ Whether to consider unknown cost (255) as obstacle.
+
+:layer_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string ""
+ ====== =======
+
+ Description
+ Name of the specific costmap layer to check against.
+ If empty, checks against the full costmap.
+
+:footprint:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string ""
+ ====== =======
+
+ Description
+ Custom footprint specification as a bracketed array of arrays,
+ e.g., "[[x1,y1],[x2,y2],...]". If empty, uses the robot's
+ configured footprint.
+
+:stop_at_first_collision:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool true
+ ====== =======
+
+ Description
+ Whether to stop validation at the first collision (true) or check
+ all poses in the path (false). When false, all collision poses
+ are reported.
+
+:max_lookahead_distance:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double -1.0
+ ====== =======
+
+ Description
+ Maximum distance ahead of the robot along the path to validate.
+ When set to -1.0 (default), the full path is validated.
+ A positive value limits validation to only the portion of the
+ path within that distance from the robot's current position.
+
+Output Ports
+------------
+
+:collision_poses:
+
+ ============================================ =======
+ Type Default
+ -------------------------------------------- -------
+ std::vector N/A
+ ============================================ =======
+
+ Description
+ Vector of poses in the path that are in collision or invalid.
+ Empty if the path is valid.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+With max_lookahead_distance:
+
+.. code-block:: xml
+
+
+
+With custom footprint:
+
+.. code-block:: xml
+
+
+
+Checking a specific costmap layer:
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/actions/Wait.rst b/configuration/packages/bt-plugins/actions/Wait.rst
new file mode 100644
index 0000000000..80275d9749
--- /dev/null
+++ b/configuration/packages/bt-plugins/actions/Wait.rst
@@ -0,0 +1,78 @@
+.. _bt_wait_action:
+
+Wait
+====
+
+Invokes the Wait ROS 2 action server, which is implemented by the nav2_behaviors_ module.
+This action is used in nav2 Behavior Trees as a recovery behavior.
+
+.. _nav2_behaviors: https://github.com/ros-navigation/navigation2/tree/main/nav2_behaviors
+
+Input Ports
+-----------
+
+:wait_duration:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 1.0
+ ====== =======
+
+ Description
+ Wait time (s).
+
+:server_name:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Action server name.
+
+:server_timeout:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10
+ ====== =======
+
+ Description
+ Action server timeout (ms).
+
+Output Ports
+------------
+
+:error_code_id:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ uint16 N/A
+ ============== =======
+
+ Description
+ Wait error code. See ``Wait`` action message for the enumerated set of error codes.
+
+:error_msg:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string N/A
+ ============== =======
+
+ Description
+ Wait error message. See ``Wait`` action message for the enumerated set of error codes.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/AreErrorCodesPresent.rst b/configuration/packages/bt-plugins/conditions/AreErrorCodesPresent.rst
new file mode 100644
index 0000000000..844c3d28c5
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/AreErrorCodesPresent.rst
@@ -0,0 +1,48 @@
+.. _bt_are_error_codes_present_condition:
+
+AreErrorCodesPresent
+====================
+
+Checks the if the provided error code matches any error code within a set.
+
+If the active error code is a match, the node returns ``SUCCESS``. Otherwise, it returns ``FAILURE``.
+
+Input Ports
+-----------
+
+:error_code:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ unsigned short N/A
+ ============== =======
+
+ Description
+ The active error code to compare against.
+
+:error_codes_to_check:
+
+ ======================== =======
+ Type Default
+ ------------------------ -------
+ std::set N/A
+ ======================== =======
+
+ Description
+ The set of error codes you wish to compare against the active error code.
+
+Example
+-------
+
+Error codes to check are defined in another port.
+
+.. code-block:: xml
+
+
+
+Error codes to check are defined to be 101, 107 and 119.
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/ArePosesNear.rst b/configuration/packages/bt-plugins/conditions/ArePosesNear.rst
new file mode 100644
index 0000000000..a71295342e
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/ArePosesNear.rst
@@ -0,0 +1,60 @@
+.. _bt_are_poses_near_action:
+
+ArePosesNear
+============
+
+Checks if two poses are nearby. If the input poses are in different frames, it will automatically transform both to the global frame.
+
+Input Ports
+-----------
+
+:ref_pose:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ =============================== =======
+
+ Description
+ Takes in a blackboard variable containing the initial pose to check.
+
+:target_pose:
+
+ =============================== =======
+ Type Default
+ ------------------------------- -------
+ geometry_msgs::msg::PoseStamped N/A
+ =============================== =======
+
+ Description
+ Takes in a blackboard variable containing the other pose to check against.
+
+:global_frame:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Global frame to transform poses to if not given in the same frame. If not provided, uses the BT Navigator's ``global_frame`` setting automatically.
+
+:tolerance:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.50
+ ====== =======
+
+ Description
+ Tolerance to check poses if nearby with respect to.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/DistanceTraveled.rst b/configuration/packages/bt-plugins/conditions/DistanceTraveled.rst
new file mode 100644
index 0000000000..41ccadf791
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/DistanceTraveled.rst
@@ -0,0 +1,65 @@
+.. _bt_distance_traveled_condition:
+
+DistanceTraveled
+================
+
+Node that returns success when a configurable distance has been traveled.
+
+Parameters
+-----------
+
+:transform_tolerance:
+
+ Defined and declared in :ref:`configuring_bt_navigator`.
+
+Example
+^^^^^^^
+.. code-block:: yaml
+
+ bt_navigator:
+ ros__parameters:
+ # other bt_navigator parameters
+ transform_tolerance: 0.1
+
+Input Ports
+-----------
+
+:distance:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 1.0
+ ====== =======
+
+ Description
+ The distance that must travel before returning success (m).
+
+:global_frame:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Reference frame. If not provided, uses the BT Navigator's ``global_frame`` setting automatically.
+
+:robot_base_frame:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ string N/A
+ ====== ===========
+
+ Description
+ Robot base frame. If not provided, uses the BT Navigator's ``robot_base_frame`` setting automatically.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/GlobalUpdatedGoal.rst b/configuration/packages/bt-plugins/conditions/GlobalUpdatedGoal.rst
new file mode 100644
index 0000000000..635648baea
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/GlobalUpdatedGoal.rst
@@ -0,0 +1,42 @@
+.. _bt_global_updated_goal_condition:
+
+GlobalUpdatedGoal
+=================
+
+Checks if the global navigation goal has changed in the blackboard.
+Returns failure if the goal is the same, if it changes, it returns success.
+
+This node differs from the GoalUpdated by retaining the state of the current goal/goals throughout each tick of the BehaviorTree
+such that it will update on any "global" change to the goal.
+
+Input Ports
+-----------
+
+:goal:
+
+ =============================== ========
+ Type Default
+ ------------------------------- --------
+ geometry_msgs::msg::PoseStamped "{goal}"
+ =============================== ========
+
+ Description
+ Destination to check. Takes in a blackboard variable, "{goal}" if not specified.
+
+:goals:
+
+ ==================== =========
+ Type Default
+ -------------------- ---------
+ nav_msgs::msg::Goals "{goals}"
+ ==================== =========
+
+ Description
+ Vector of goals to check. Takes in a blackboard variable, "{goals}" if not specified.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/GoalReached.rst b/configuration/packages/bt-plugins/conditions/GoalReached.rst
new file mode 100644
index 0000000000..cc14b4a423
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/GoalReached.rst
@@ -0,0 +1,69 @@
+.. _bt_goal_reached_condition:
+
+GoalReached
+===========
+
+Checks the distance to the goal, if the distance to goal is less than the pre-defined threshold, the tree returns SUCCESS, otherwise it returns FAILURE.
+
+
+Parameter
+---------
+
+:transform_tolerance:
+
+ Defined and declared in :ref:`configuring_bt_navigator`.
+
+:goal_reached_tol:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.25
+ ====== =======
+
+ Description
+ Tolerance of accepting pose as the goal (m).
+
+Example
+^^^^^^^
+.. code-block:: yaml
+
+ bt_navigator:
+ ros__parameters:
+ # other bt_navigator parameters
+ transform_tolerance: 0.1
+ goal_reached_tol: 0.25
+
+
+Input Ports
+-----------
+
+:goal:
+
+ =============================== ========
+ Type Default
+ ------------------------------- --------
+ geometry_msgs::msg::PoseStamped N/A
+ =============================== ========
+
+ Description
+ Destination to check. Takes in a blackboard variable, e.g. "{goal}".
+ The global reference frame is taken from the goal's header `frame_id` field.
+
+:robot_base_frame:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ string "base_link"
+ ====== ===========
+
+ Description
+ Robot base frame.
+
+Example
+^^^^^^^
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/GoalUpdated.rst b/configuration/packages/bt-plugins/conditions/GoalUpdated.rst
new file mode 100644
index 0000000000..9f167ede07
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/GoalUpdated.rst
@@ -0,0 +1,39 @@
+.. _goal_updated_condition:
+
+GoalUpdated
+===========
+
+Checks if the global navigation goal, or a vector of goals, has changed in the blackboard.
+Returns failure if the goal is the same, if it changes, it returns success.
+
+Input Ports
+-----------
+
+:goal:
+
+ =============================== ========
+ Type Default
+ ------------------------------- --------
+ geometry_msgs::msg::PoseStamped "{goal}"
+ =============================== ========
+
+ Description
+ Destination to check. Takes in a blackboard variable, "{goal}" if not specified.
+
+:goals:
+
+ ==================== =========
+ Type Default
+ -------------------- ---------
+ nav_msgs::msg::Goals "{goals}"
+ ==================== =========
+
+ Description
+ Vector of goals to check. Takes in a blackboard variable, "{goals}" if not specified.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/InitialPoseReceived.rst b/configuration/packages/bt-plugins/conditions/InitialPoseReceived.rst
new file mode 100644
index 0000000000..2cb23182b2
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/InitialPoseReceived.rst
@@ -0,0 +1,28 @@
+.. _bt_initial_pose_received_condition:
+
+InitialPoseReceived
+===================
+
+Node that returns success when the initial pose is sent to AMCL via `/initial_pose``.
+
+Input Ports
+-----------
+
+:initial_pose_received:
+
+ ===== =========================
+ Type Default
+ ----- -------------------------
+ bool "{initial_pose_received}"
+ ===== =========================
+
+ Description
+ Success if the value in the port is true. Takes in a blackboard variable,
+ "{initial_pose_received}" if not specified.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/IsBatteryCharging.rst b/configuration/packages/bt-plugins/conditions/IsBatteryCharging.rst
new file mode 100644
index 0000000000..834d7378fe
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/IsBatteryCharging.rst
@@ -0,0 +1,27 @@
+.. _bt_is_battery_charging_condition:
+
+IsBatteryCharging
+=================
+
+Checks if the battery is charging by subscribing to a ``sensor_msgs/BatteryState`` topic and checking if the power_supply_status is ``POWER_SUPPLY_STATUS_CHARGING``.
+Returns SUCCESS in that case, FAILURE otherwise.
+
+Input Ports
+-----------
+
+:battery_topic:
+ =============== ===================
+ Type Default
+ --------------- -------------------
+ string "/battery_status"
+ =============== ===================
+
+ Description
+ Topic for battery info.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/IsBatteryLow.rst b/configuration/packages/bt-plugins/conditions/IsBatteryLow.rst
new file mode 100644
index 0000000000..27795fcc8f
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/IsBatteryLow.rst
@@ -0,0 +1,48 @@
+.. _bt_is_battery_low_condition:
+
+IsBatteryLow
+============
+
+Checks if battery is low by subscribing to a ``sensor_msgs/BatteryState`` topic and checking if battery percentage/voltage is below a specified minimum value.
+By default percentage (in range 0 to 1) is used to check for low battery. Set the ``is_voltage`` parameter to `true` to use voltage.
+Returns SUCCESS when battery percentage/voltage is lower than the specified value, FAILURE otherwise.
+
+Input Ports
+-----------
+
+:min_battery:
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.0
+ ====== =======
+
+ Description
+ Min battery percentage or voltage before triggering.
+
+:battery_topic:
+ =============== ===================
+ Type Default
+ --------------- -------------------
+ string "/battery_status"
+ =============== ===================
+
+ Description
+ Topic for battery info.
+
+:is_voltage:
+ ====== =======
+ Type Default
+ ------ -------
+ bool false
+ ====== =======
+
+ Description
+ If true voltage will be used to check for low battery.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/IsGoalNearby.rst b/configuration/packages/bt-plugins/conditions/IsGoalNearby.rst
new file mode 100644
index 0000000000..0255557b63
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/IsGoalNearby.rst
@@ -0,0 +1,87 @@
+.. _bt_is_goal_nearby_condition:
+
+IsGoalNearby
+============
+
+Checks if the robot is near the goal by computing the remaining path length from the robot's current position to the goal. Returns SUCCESS when the remaining path length is less than the proximity threshold, otherwise returns FAILURE.
+
+Parameter
+---------
+
+:transform_tolerance:
+
+ Defined and declared in :ref:`configuring_bt_navigator`.
+
+Example
+^^^^^^^
+.. code-block:: yaml
+
+ bt_navigator:
+ ros__parameters:
+ # other bt_navigator parameters
+ transform_tolerance: 0.1
+
+Input Ports
+-----------
+
+:path:
+
+ ==================================== =======
+ Type Default
+ ------------------------------------ -------
+ nav_msgs::msg::Path N/A
+ ==================================== =======
+
+ Description
+ The planned path to evaluate.
+
+:proximity_threshold:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 1.0
+ ====== =======
+
+ Description
+ The remaining path length (in meters) considered as "nearby". When the remaining distance along the path is less than this threshold, the condition returns SUCCESS.
+
+:max_robot_pose_search_dist:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double -1.0
+ ====== =======
+
+ Description
+ Maximum forward integrated distance along the path (starting from the last detected pose) to bound the search for the closest pose to the robot. When set to a negative value (default), the entire path is searched every time. Setting this to a positive value (e.g., 1.0-2.0 meters) can improve performance when this BT node is ticked frequently to address looping or crossed paths (when present).
+
+:global_frame:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string "map"
+ ====== =======
+
+ Description
+ The global reference frame.
+
+:robot_base_frame:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string "base_link"
+ ====== =======
+
+ Description
+ Robot base frame.
+
+Example
+^^^^^^^
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/IsStuck.rst b/configuration/packages/bt-plugins/conditions/IsStuck.rst
new file mode 100644
index 0000000000..90f7ea404e
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/IsStuck.rst
@@ -0,0 +1,15 @@
+.. _bt_is_stuck_condition:
+
+IsStuck
+=======
+
+Determines if the robot is not progressing towards the goal.
+If the robot is stuck and not progressing, the condition returns
+SUCCESS, otherwise it returns FAILURE.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/IsWithinPathTrackingBounds.rst b/configuration/packages/bt-plugins/conditions/IsWithinPathTrackingBounds.rst
new file mode 100644
index 0000000000..46facf212f
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/IsWithinPathTrackingBounds.rst
@@ -0,0 +1,60 @@
+.. _bt_is_within_path_tracking_bounds_condition:
+
+IsWithinPathTrackingBounds
+==========================
+
+Checks if the robot is within determined tracking error bounds during path following.
+
+Input Ports
+-----------
+
+:max_error_left:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.5
+ ====== =======
+
+ Description
+ Maximum allowable tracking error (m) on the left side of the path before returning FAILURE. Must be a positive value.
+
+:max_error_right:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.5
+ ====== =======
+
+ Description
+ Maximum allowable tracking error (m) on the right side of the path before returning FAILURE. Must be a positive value.
+
+:max_error_heading:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 3.14
+ ====== =======
+
+ Description
+ Maximum allowable heading error (rad) before returning FAILURE. Must be a positive value.
+
+:tracking_feedback:
+
+ ==================================== ========
+ Type Default
+ ------------------------------------ --------
+ nav2_msgs::msg::PathTrackingFeedback N/A
+ ==================================== ========
+
+ Description
+ Generally, the feedback message from the controller server, which contains the current tracking error information. Though, it may be populated by another source or topic if need be.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/PathExpiringTimer.rst b/configuration/packages/bt-plugins/conditions/PathExpiringTimer.rst
new file mode 100644
index 0000000000..554bd4a776
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/PathExpiringTimer.rst
@@ -0,0 +1,38 @@
+.. _bt_path_expiring_timer_condition:
+
+PathExpiringTimer
+=================
+
+Checks if the timer has expired. Returns success if the timer has expired, otherwise it returns failure.
+The timer will reset if the path gets updated.
+
+Input Ports
+-----------
+
+:seconds:
+ ====== =======
+ Type Default
+ ------ -------
+ double 1.0
+ ====== =======
+
+ Description
+ Time to check if expired.
+
+:path:
+ ==================================== =======
+ Type Default
+ ------------------------------------ -------
+ nav_msgs::msg::Path N/A
+ ==================================== =======
+
+ Description
+ Check if path has been updated to enable timer reset.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/TimeExpired.rst b/configuration/packages/bt-plugins/conditions/TimeExpired.rst
new file mode 100644
index 0000000000..02feb9af7a
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/TimeExpired.rst
@@ -0,0 +1,24 @@
+.. _bt_time_expired_condition:
+
+TimeExpired
+===========
+
+Node that returns success when a time duration has passed
+
+:seconds:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ double 1.0
+ ====== ===========
+
+ Description
+ The time passed to return success (s).
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/TransformAvailable.rst b/configuration/packages/bt-plugins/conditions/TransformAvailable.rst
new file mode 100644
index 0000000000..cd1dc76a48
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/TransformAvailable.rst
@@ -0,0 +1,38 @@
+.. _bt_transform_available_condition:
+
+TransformAvailable
+==================
+
+Checks if a TF transform is available. Returns failure if it cannot be found. Once found, it will always return success. Useful for initial condition checks.
+
+Input Ports
+-----------
+
+:child:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string ""
+ ====== =======
+
+ Description
+ Child frame for transform.
+
+:parent:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string ""
+ ====== =======
+
+ Description
+ Parent frame for transform.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/WouldAControllerRecoveryHelp.rst b/configuration/packages/bt-plugins/conditions/WouldAControllerRecoveryHelp.rst
new file mode 100644
index 0000000000..7910389d63
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/WouldAControllerRecoveryHelp.rst
@@ -0,0 +1,29 @@
+.. _bt_would_a_controller_recovery_help_condition:
+
+WouldAControllerRecoveryHelp
+============================
+
+Checks if the active controller server error code is UNKNOWN, PATIENCE_EXCEEDED, FAILED_TO_MAKE_PROGRESS, or NO_VALID_CONTROL.
+
+If the active error code is a match, the node returns ``SUCCESS``. Otherwise, it returns ``FAILURE``.
+
+Input Port
+----------
+
+:error_code:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ unsigned short N/A
+ ============== =======
+
+ Description
+ The active error code to compare against. This should match the controller server error code.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/WouldAPlannerRecoveryHelp.rst b/configuration/packages/bt-plugins/conditions/WouldAPlannerRecoveryHelp.rst
new file mode 100644
index 0000000000..c725322759
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/WouldAPlannerRecoveryHelp.rst
@@ -0,0 +1,29 @@
+.. _bt_would_a_planner_recovery_help_condition:
+
+WouldAPlannerRecoveryHelp
+=========================
+
+Checks if the active planner server error code is UNKNOWN, NO_VALID_PATH, or TIMEOUT.
+
+If the active error code is a match, the node returns ``SUCCESS``. Otherwise, it returns ``FAILURE``.
+
+Input Port
+----------
+
+:error_code:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ unsigned short N/A
+ ============== =======
+
+ Description
+ The active error code to compare against. This should match the planner server error code.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/WouldARouteRecoveryHelp.rst b/configuration/packages/bt-plugins/conditions/WouldARouteRecoveryHelp.rst
new file mode 100644
index 0000000000..3b029cc700
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/WouldARouteRecoveryHelp.rst
@@ -0,0 +1,29 @@
+.. _bt_would_a_route_recovery_help_condition:
+
+WouldARouteRecoveryHelp
+=======================
+
+Checks if the active route server error code is UNKNOWN, NO_VALID_ROUTE, or TIMEOUT.
+
+If the active error code is a match, the node returns ``SUCCESS``. Otherwise, it returns ``FAILURE``.
+
+Input Port
+----------
+
+:error_code:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ unsigned short N/A
+ ============== =======
+
+ Description
+ The active error code to compare against. This should match the route server error code.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/configuration/packages/bt-plugins/conditions/WouldASmootherRecoveryHelp.rst b/configuration/packages/bt-plugins/conditions/WouldASmootherRecoveryHelp.rst
new file mode 100644
index 0000000000..674745452b
--- /dev/null
+++ b/configuration/packages/bt-plugins/conditions/WouldASmootherRecoveryHelp.rst
@@ -0,0 +1,29 @@
+.. _bt_would_a_smoother_recovery_help_condition:
+
+WouldASmootherRecoveryHelp
+==========================
+
+Checks if the active smoother server error code is UNKNOWN, TIMEOUT, FAILED_TO_SMOOTH_PATH, or SMOOTHED_PATH_IN_COLLISION.
+
+If the active error code is a match, the node returns ``SUCCESS``. Otherwise, it returns ``FAILURE``.
+
+Input Port
+----------
+
+:error_code:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ unsigned short N/A
+ ============== =======
+
+ Description
+ The active error code to compare against. This should match the smoother server error code.
+
+Example
+-------
+
+.. code-block:: xml
+
+
diff --git a/docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/NonblockingSequence.md b/configuration/packages/bt-plugins/controls/NonblockingSequence.rst
similarity index 58%
rename from docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/NonblockingSequence.md
rename to configuration/packages/bt-plugins/controls/NonblockingSequence.rst
index dbd32962b2..31d10411d3 100644
--- a/docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/NonblockingSequence.md
+++ b/configuration/packages/bt-plugins/controls/NonblockingSequence.rst
@@ -1,11 +1,15 @@
-# NonblockingSequence { #nonblocking-sequence }
+.. _bt_non_blocking_sequence_control:
-Ticks all child nodes until they all return SUCCESS. If any of the child nodes return RUNNING, it will continue to tick the subsequent nodes. This node will once again tick through all the child nodes if it is ticked itself. If at any time a child returns FAILURE, that stops all children and returns FAILURE overall.
+NonblockingSequence
+===================
-{{ render_bt_node_ports(page.title) }}
+Ticks all child nodes until they all return SUCCESS. If any of the child nodes return RUNNING, it will continue to tick the subsequent nodes. This node will once again tick through all the child nodes if it is ticked itself. If at any time a child returns FAILURE, that stops all children and returns FAILURE overall.
-## Example
+Example
+-------
-{% set bt_hpp_file_path = nav2_bt_hpp_dir_path + "/control/nonblocking_sequence.hpp" %}
+.. code-block:: xml
-{{ render_bt_node_example(bt_hpp_file_path) }}
+
+
+
diff --git a/configuration/packages/bt-plugins/controls/PauseResumeController.rst b/configuration/packages/bt-plugins/controls/PauseResumeController.rst
new file mode 100644
index 0000000000..6bfe782453
--- /dev/null
+++ b/configuration/packages/bt-plugins/controls/PauseResumeController.rst
@@ -0,0 +1,52 @@
+.. _bt_pause_resume_controller_control:
+
+PauseResumeController
+=====================
+
+Controlled through service calls to pause and resume the execution of the tree.
+It has one mandatory child for the RESUMED, and three optional for the PAUSED state, the ON_PAUSE event and the ON_RESUME event.
+It has two input ports:
+
+- pause_service_name: name of the service to pause
+- resume_service_name: name of the service to resume
+
+The controller starts in RESUMED state, and ticks it until it returns success.
+When the pause service is called, ON_PAUSE is ticked until completion, then the controller switches to PAUSED state.
+When the resume service is called, ON_RESUME is ticked until completion, then the controller switches back to RESUMED state.
+
+The controller only returns success when the RESUMED child returns success.
+The controller returns failure if any child returns failure.
+In any other case, it returns running.
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+When the ON_PAUSE and ON_RESUME branches fail, the controller will return failure, halt, and the state will be reset to RESUMED. It might be desirable to retry the transition a few times before failing for real, which functionality is not built in the controller node, but is easily achievable by adding a retry node in the BT:
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/PersistentSequence.md b/configuration/packages/bt-plugins/controls/PersistentSequence.rst
similarity index 58%
rename from docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/PersistentSequence.md
rename to configuration/packages/bt-plugins/controls/PersistentSequence.rst
index 9c3b514ab7..9a0e55937d 100644
--- a/docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/PersistentSequence.md
+++ b/configuration/packages/bt-plugins/controls/PersistentSequence.rst
@@ -1,16 +1,21 @@
-# PersistentSequence { #persistent-sequence }
+.. _bt_persistent_sequence_control:
-The PersistentSequenceNode is similar to the SequenceNode, but it stores the index of the last running child in the blackboard (key: *current_child_idx*), and it does not reset the index when it got halted. It used to tick children in an ordered sequence. If any child returns RUNNING, previous children will NOT be ticked again.
-This can be helpful paired with the `PauseResumeController`.
+PersistentSequence
+===================
+
+The PersistentSequenceNode is similar to the SequenceNode, but it stores the index of the last running child in the blackboard (key: `current_child_idx`), and it does not reset the index when it got halted. It used to tick children in an ordered sequence. If any child returns RUNNING, previous children will NOT be ticked again.
+This can be helpful paired with the ``PauseResumeController``.
- If all the children return SUCCESS, this node returns SUCCESS.
- If a child returns RUNNING, this node returns RUNNING. Loop is NOT restarted, the same running child will be ticked again.
- If a child returns FAILURE, stop the loop and return FAILURE. Restart the loop only if (reset_on_failure == true)
-{{ render_bt_node_ports(page.title) }}
-
-## Example
+Example
+-------
-{% set bt_hpp_file_path = nav2_bt_hpp_dir_path + "/control/persistent_sequence.hpp" %}
+.. code-block:: xml
-{{ render_bt_node_example(bt_hpp_file_path) }}
+
+
+
+
diff --git a/docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/PipelineSequence.md b/configuration/packages/bt-plugins/controls/PipelineSequence.rst
similarity index 63%
rename from docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/PipelineSequence.md
rename to configuration/packages/bt-plugins/controls/PipelineSequence.rst
index b49624a111..95822074a1 100644
--- a/docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/PipelineSequence.md
+++ b/configuration/packages/bt-plugins/controls/PipelineSequence.rst
@@ -1,14 +1,19 @@
-# PipelineSequence { #pipeline-sequence }
+.. _bt_pipe_line_sequence_control:
+
+PipelineSequence
+================
Ticks the first child till it succeeds, then ticks the first and second children till the second one succeeds.
It then ticks the first, second, and third children until the third succeeds, and so on, and so on. If at any
time a child returns RUNNING, that doesn't change the behavior. If at any time a child returns FAILURE, that
stops all children and returns FAILURE overall.
-{{ render_bt_node_ports(page.title) }}
-## Example
+Example
+-------
-{% set bt_hpp_file_path = nav2_bt_hpp_dir_path + "/control/pipeline_sequence.hpp" %}
+.. code-block:: xml
-{{ render_bt_node_example(bt_hpp_file_path) }}
+
+
+
diff --git a/docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/RecoveryNode.md b/configuration/packages/bt-plugins/controls/RecoveryNode.rst
similarity index 61%
rename from docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/RecoveryNode.md
rename to configuration/packages/bt-plugins/controls/RecoveryNode.rst
index 888a9a24c6..898c6a2924 100644
--- a/docs/configuration_and_development/configuration_guide/core_servers/bt_plugins/controls/RecoveryNode.md
+++ b/configuration/packages/bt-plugins/controls/RecoveryNode.rst
@@ -1,4 +1,7 @@
-# RecoveryNode { #recovery-node }
+.. _bt_recovery_node_control:
+
+RecoveryNode
+============
The RecoveryNode is a control flow node with two children.
It returns SUCCESS if and only if the first child returns SUCCESS.
@@ -8,10 +11,25 @@ If the second child returns FAILURE, the RecoveryNode returns FAILURE as well.
The user can specify how many times the recovery actions should be taken before returning FAILURE.
In nav2, the RecoveryNode is included in Behavior Trees to implement recovery actions upon failures.
-{{ render_bt_node_ports(page.title) }}
+Input Ports
+-----------
+
+:number_of_retries:
+
+ ==== =======
+ Type Default
+ ---- -------
+ int 1
+ ==== =======
+
+ Description
+ Number of retries.
-## Example
+Example
+-------
-{% set bt_hpp_file_path = nav2_bt_hpp_dir_path + "/control/recovery_node.hpp" %}
+.. code-block:: xml
-{{ render_bt_node_example(bt_hpp_file_path) }}
+
+
+
diff --git a/configuration/packages/bt-plugins/controls/RoundRobin.rst b/configuration/packages/bt-plugins/controls/RoundRobin.rst
new file mode 100644
index 0000000000..899b9a4f51
--- /dev/null
+++ b/configuration/packages/bt-plugins/controls/RoundRobin.rst
@@ -0,0 +1,30 @@
+.. _bt_round_robin_control:
+
+
+RoundRobin
+==========
+
+Custom control flow node used to create a round-robin behavior for children BT nodes.
+
+Input Ports
+-----------
+
+:wrap_around:
+
+ ============= =======
+ Type Default
+ ============= =======
+ bool false
+ ============= =======
+
+ Description
+ Controls wrap-around behavior. When ``false``, the node returns FAILURE instead of wrapping to the first child after all children have been attempted. When ``true``, the node wraps around to the first child and continues the round-robin behavior.
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+
diff --git a/configuration/packages/bt-plugins/decorators/DistanceController.rst b/configuration/packages/bt-plugins/decorators/DistanceController.rst
new file mode 100644
index 0000000000..d9d916d603
--- /dev/null
+++ b/configuration/packages/bt-plugins/decorators/DistanceController.rst
@@ -0,0 +1,54 @@
+.. _bt_distance_controller:
+
+DistanceController
+==================
+
+A node that controls the tick rate for its child based on the distance traveled.
+The distance to be traveled before replanning can be supplied to the node as a parameter.
+The node returns RUNNING when it is not ticking its child. Currently, in the navigation
+stack, the ``DistanceController`` is used to adjust the rate at which the ``ComputePathToPose`` and ``GoalReached`` nodes are ticked.
+
+Input Ports
+-----------
+
+:distance:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 1.0
+ ====== =======
+
+ Description
+ The distance travelled to trigger an action such as planning a path (m).
+
+:global_frame:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string "map"
+ ====== =======
+
+ Description
+ Reference frame.
+
+:robot_base_frame:
+
+ ====== ===========
+ Type Default
+ ------ -----------
+ string "base_link"
+ ====== ===========
+
+ Description
+ Robot base frame.
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+
diff --git a/configuration/packages/bt-plugins/decorators/GoalUpdatedController.rst b/configuration/packages/bt-plugins/decorators/GoalUpdatedController.rst
new file mode 100644
index 0000000000..88fe8c1c2e
--- /dev/null
+++ b/configuration/packages/bt-plugins/decorators/GoalUpdatedController.rst
@@ -0,0 +1,40 @@
+.. _bt_goal_updated_controller:
+
+GoalUpdatedController
+=====================
+
+Checks if the global navigation goal, or a vector of goals, has changed in the blackboard. The node ticks its child if the goal was updated.
+
+Input Ports
+-----------
+
+:goal:
+
+ =============================== ========
+ Type Default
+ ------------------------------- --------
+ geometry_msgs::msg::PoseStamped "{goal}"
+ =============================== ========
+
+ Description
+ Destination to check. Takes in a blackboard variable, "{goal}" if not specified.
+
+:goals:
+
+ ==================== =========
+ Type Default
+ -------------------- ---------
+ nav_msgs::msg::Goals "{goals}"
+ ==================== =========
+
+ Description
+ Vector of goals to check. Takes in a blackboard variable, "{goals}" if not specified.
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+
diff --git a/configuration/packages/bt-plugins/decorators/GoalUpdater.rst b/configuration/packages/bt-plugins/decorators/GoalUpdater.rst
new file mode 100644
index 0000000000..4d70933c16
--- /dev/null
+++ b/configuration/packages/bt-plugins/decorators/GoalUpdater.rst
@@ -0,0 +1,90 @@
+.. _bt_goal_updater:
+
+GoalUpdater
+===========
+
+A custom control node, which updates the goal(s) pose(s). It subscribes to a topic in which it can receive (an) updated goal(s) pose(s) to use instead of the one(s) commanded in action. It is useful for dynamic object following tasks.
+
+Parameters
+----------
+
+:goal_updater_topic:
+
+ ====== ==============
+ Type Default
+ ------ --------------
+ string "goal_update"
+ ====== ==============
+
+ Description
+ The topic to receive the updated goal pose
+
+:goals_updater_topic:
+
+ ====== ===============
+ Type Default
+ ------ ---------------
+ string "goals_update"
+ ====== ===============
+
+ Description
+ The topic to receive the updated goals poses
+
+Input Ports
+-----------
+
+:input_goal:
+
+ ========================= =======
+ Type Default
+ ------------------------- -------
+ geometry_msgs/PoseStamped N/A
+ ========================= =======
+
+ Description
+ The original goal pose
+
+:input_goals:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ nav_msgs/Goals N/A
+ ============== =======
+
+ Description
+ The original goals poses
+
+Output Ports
+------------
+
+:output_goal:
+
+ ========================= =======
+ Type Default
+ ------------------------- -------
+ geometry_msgs/PoseStamped N/A
+ ========================= =======
+
+ Description
+ The resulting updated goal. If no goal received by subscription, it will be the input_goal
+
+:output_goals:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ nav_msgs/Goals N/A
+ ============== =======
+
+ Description
+ The resulting updated goals. If no goals received by subscription, it will be the input_goals
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+
diff --git a/configuration/packages/bt-plugins/decorators/PathLongerOnApproach.rst b/configuration/packages/bt-plugins/decorators/PathLongerOnApproach.rst
new file mode 100644
index 0000000000..b377e8b451
--- /dev/null
+++ b/configuration/packages/bt-plugins/decorators/PathLongerOnApproach.rst
@@ -0,0 +1,51 @@
+.. _bt_path_longer_on_approach:
+
+PathLongerOnApproach
+====================
+
+This node checks if the newly generated global path is significantly larger than the old global path in the user-defined robot's goal proximity and triggers their corresponding children. This allows users to enact special behaviors before a robot attempts to execute a path significantly longer than the prior path when close to a goal (e.g. going around an dynamic obstacle that may just need a few seconds to move out of the way).
+
+Input Ports
+-----------
+
+:path:
+
+ ========================== =======
+ Type Default
+ -------------------------- -------
+ nav_msgs::msg::Path N/A
+ ========================== =======
+
+ Description
+ Path created by action server. Takes in a blackboard variable, e.g. "{path}".
+
+:prox_len:
+
+ ============= =======
+ Type Default
+ ------------- -------
+ double 3.0
+ ============= =======
+
+ Description
+ Proximity length (m) for the path to be longer on approach.
+
+:length_factor:
+
+ ============= =======
+ Type Default
+ ------------- -------
+ double 2.0
+ ============= =======
+
+ Description
+ Length multiplication factor to check if the path is significantly longer.
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+
diff --git a/configuration/packages/bt-plugins/decorators/RateController.rst b/configuration/packages/bt-plugins/decorators/RateController.rst
new file mode 100644
index 0000000000..b51a3d2e80
--- /dev/null
+++ b/configuration/packages/bt-plugins/decorators/RateController.rst
@@ -0,0 +1,33 @@
+.. _bt_rate_controller:
+
+RateController
+==============
+
+A node that throttles the tick rate for its child.
+The tick rate can be supplied to the node as a parameter.
+The node returns RUNNING when it is not ticking its child.
+Currently, in the navigation stack, the ``RateController`` is
+used to adjust the rate at which the ``ComputePathToPose`` and ``GoalReached`` nodes are ticked.
+
+Input Ports
+-----------
+
+:hz:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 10.0
+ ====== =======
+
+ Description
+ Rate to throttle an action or a group of actions.
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+
diff --git a/configuration/packages/bt-plugins/decorators/SingleTrigger.rst b/configuration/packages/bt-plugins/decorators/SingleTrigger.rst
new file mode 100644
index 0000000000..9091ad7683
--- /dev/null
+++ b/configuration/packages/bt-plugins/decorators/SingleTrigger.rst
@@ -0,0 +1,15 @@
+.. _SingleTrigger:
+
+SingleTrigger
+=============
+
+This node triggers its child only once and returns FAILURE for every succeeding tick.
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+
diff --git a/configuration/packages/bt-plugins/decorators/SpeedController.rst b/configuration/packages/bt-plugins/decorators/SpeedController.rst
new file mode 100644
index 0000000000..84ba185729
--- /dev/null
+++ b/configuration/packages/bt-plugins/decorators/SpeedController.rst
@@ -0,0 +1,87 @@
+.. _bt_speed_controller:
+
+SpeedController
+==================
+
+A node that controls the tick rate for its child based on current robot speed.
+The maximum and minimum replanning rates can be supplied to the node as parameters along with maximum and minimum speed.
+The node returns RUNNING when it is not ticking its child. Currently, in the navigation
+stack, the ``SpeedController`` is used to adjust the rate at which the ``ComputePathToPose`` and ``GoalReached`` nodes are ticked.
+
+Input Ports
+-----------
+
+:min_rate:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.1
+ ====== =======
+
+ Description
+ The minimum rate at which child node can be ticked (hz).
+
+:max_rate:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 1.0
+ ====== =======
+
+ Description
+ The maximum rate at which child node can be ticked (hz).
+
+:min_speed:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.0
+ ====== =======
+
+ Description
+ The minimum robot speed below which the child node is ticked at minimum rate (m/s).
+
+:max_speed:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.5
+ ====== =======
+
+ Description
+ The maximum robot speed above which the child node is ticked at maximum rate (m/s).
+
+:goal:
+
+ =============================== ========
+ Type Default
+ ------------------------------- --------
+ geometry_msgs::msg::PoseStamped "{goal}"
+ =============================== ========
+
+ Description
+ Destination to check. Takes in a blackboard variable, "{goal}" if not specified.
+
+:goals:
+
+ ==================== =========
+ Type Default
+ -------------------- ---------
+ nav_msgs::msg::Goals "{goals}"
+ ==================== =========
+
+ Description
+ Vector of goals to check. Takes in a blackboard variable, "{goals}" if not specified.
+
+Example
+-------
+
+.. code-block:: xml
+
+
+
+
diff --git a/configuration/packages/collision_monitor/configuring-collision-detector-node.rst b/configuration/packages/collision_monitor/configuring-collision-detector-node.rst
new file mode 100644
index 0000000000..36bd951d9b
--- /dev/null
+++ b/configuration/packages/collision_monitor/configuring-collision-detector-node.rst
@@ -0,0 +1,550 @@
+.. _configuring_collision_detector_node:
+
+Collision Detector Node
+#######################
+
+The Collision Detector is a node similar to the Collision Monitor, so it is recommended to read the :ref:`collision_monitor_tutorial` tutorial first.
+
+In some cases, the user may want to be informed about the detected obstacles without affecting the robot's velocity and instead take a different action within an external node. For example, the user may want to blink LEDs or sound an alarm when the robot is close to an obstacle.
+Another use case could be to detect data points in particular regions (e.g extremely close to the sensor) and warn of malfunctioning sensors. For this purpose, the Collision Detector node was introduced.
+It works similarly to the Collision Monitor, but does not affect the robot's velocity. It will only inform that data from the configured sources has been detected within the configured polygons via message to the ``collision_detector_state`` topic.
+
+See the package's ``README`` for more information.
+
+Features
+********
+
+Similarly to the Collision Monitor, the Collision Detector uses robot's relative polygons to define "zones".
+However, unlike the Collision Monitor that uses different behavior models, the Collision Detector does not use any of them and therefore the `action_type` should always be set to `none`. If set to anything else, it will throw an error
+
+The zones around the robot and the data sources are the same as for the Collision Monitor, with the exception of the footprint polygon, which is not supported by the Collision Detector.
+
+Any data source can optionally define one or more **exclusion zones**.
+An exclusion zone is a region that *removes* (masks out) that source's points which fall inside it, before the detector polygons are evaluated.
+Unlike the polygons above, an exclusion zone does **not** trigger detection, it is a per-source pre-filter.
+A typical use case is ignoring known structure the robot deliberately approaches, such as a charging dock or a conveyor, whose returns would otherwise trip the detection zones.
+Another common use case is self-filtering: masking out returns from parts of the robot itself (e.g. arms, mast, bumpers, or trailers) that fall within a sensor's field of view, which would otherwise be mistaken for obstacles. Anchoring the zone to the relevant robot frame keeps the mask aligned with that structure as it moves.
+A zone can be a polygon or circle anchored to an arbitrary ``frame_id`` (e.g. ``dock_link``), so it tracks that frame as the robot moves, with an optional height band for 3D sources.
+The filter is fail-safe: if the zone transform is unavailable, no points are removed.
+Each zone inherits its owning source's ``base_shift_correction`` policy, so the mask and the source points are always transformed under the same assumptions.
+See YAML at the bottom for an example.
+
+
+Parameters
+**********
+
+:frequency:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 10.0
+ ============== =============================
+
+ Description:
+ Frequency of the main loop that checks for detections.
+
+:base_frame_id:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "base_footprint"
+ ============== =============================
+
+ Description:
+ Robot base frame.
+
+:odom_frame_id:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "odom"
+ ============== =============================
+
+ Description:
+ Which frame to use for odometry.
+
+:transform_tolerance:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.1
+ ============== =============================
+
+ Description
+ Time with which to post-date the transform that is published, to indicate that this transform is valid into the future.
+
+:source_timeout:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.0
+ ============== =============================
+
+ Description:
+ Maximum time interval in which source data is considered as valid. If no new data is received within this interval, an additional warning will be displayed. Setting ``source_timeout: 0.0`` disables it. This parameter can be overridden per observation source.
+
+:base_shift_correction:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool True
+ ============== =============================
+
+ Description:
+ Whether to correct source data towards to base frame movement, considering the difference between current time and latest source time. If enabled, produces more accurate sources positioning in the robot base frame, at the cost of slower performance. This will cause average delays for ``~1/(2*odom_rate)`` per each ``cmd_vel`` calculation cycle. However, disabling this option for better performance is not recommended for the fast moving robots, where during the typical rate of data sources, robot could move unacceptably far. Thus reasonable odometry rates are recommended (~100 hz).
+
+:polygons:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ vector N/A
+ ============== =============================
+
+ Description:
+ List of zones to check for data points. Causes an error, if not specialized.
+
+
+:observation_sources:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ vector N/A
+ ============== =============================
+
+ Description:
+ List of data sources (laser scanners, pointclouds, etc...). Causes an error, if not specialized.
+
+Polygons parameters
+===================
+
+```` is the corresponding polygon name ID selected for this type.
+
+:````.type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string N/A
+ ============== =============================
+
+ Description:
+ Type of polygon shape. Available values are ``polygon``, ``circle``. Causes an error, if not specialized.
+
+:````.points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string N/A
+ ============== =============================
+
+ Description:
+ Polygon vertices, listed in ``"[[p1.x, p1.y], [p2.x, p2.y], [p3.x, p3.y], ...]"`` format (e.g. ``"[[0.5, 0.25], [0.5, -0.25], [0.0, -0.25], [0.0, 0.25]]"`` for the square in the front). Used for ``polygon`` type. Minimum 3 points for a triangle polygon. If not specified, the collision detector will use dynamic polygon subscription to ``polygon_sub_topic``
+
+:````.polygon_sub_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string N/A
+ ============== =============================
+
+ Description:
+ Topic to listen the polygon points from. Causes an error, if not specified **and** points are also not specified. If both ``points`` and ``polygon_sub_topic`` are specified, the static ``points`` takes priority.
+
+:````.radius:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double N/A
+ ============== =============================
+
+ Description:
+ Circle radius. Used for ``circle`` type. Causes an error, if not specialized.
+
+:````.action_type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string N/A
+ ============== =============================
+
+ Description:
+ Only ``none`` action type is supported (more options available for collision monitor)
+
+:````.min_points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 4
+ ============== =============================
+
+ Description:
+ Minimum number of data readings within a zone to trigger the action. Former ``max_points`` parameter for Humble, that meant the maximum number of data readings within a zone to not trigger the action). ``min_points`` is equal to ``max_points + 1`` value.
+
+:````.trigger_consecutive_points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 1
+ ============== =============================
+
+ Description:
+ Number of consecutive processing cycles with ``points_inside >= min_points`` required to enter the triggered state.
+ A value of ``1`` means trigger in a single processing cycle.
+
+:````.release_consecutive_points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 1
+ ============== =============================
+
+ Description:
+ Number of consecutive processing cycles with ``points_inside < min_points`` required to leave the triggered state.
+ A value of ``1`` means release in a single processing cycle.
+ In practice, values greater than ``1`` can reduce sensor noise flicker while remaining responsive.
+
+:````.visualize:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description:
+ Whether to publish the polygon in a separate topic.
+
+:````.polygon_pub_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string
+ ============== =============================
+
+ Description:
+ Topic name to publish a polygon to. Used only if ``visualize`` is true.
+
+:````.enabled:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool True
+ ============== =============================
+
+ Description:
+ Whether to use this source for collision detection. (Can be dynamically set)
+
+Observation sources parameters
+==============================
+
+```` is the corresponding data source name ID selected for this type.
+
+:````.type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "scan"
+ ============== =============================
+
+ Description:
+ Type of polygon shape. Could be ``scan``, ``pointcloud``, ``range`` or ``polygon``.
+
+:````.transport_type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "raw"
+ ============== =============================
+
+ Description:
+ For ``pointcloud`` data, specify the transport plugin to use:
+
+ * raw: No compression. Default; highest bandwidth usage.
+ * draco: Lossy compression via Google.
+ * zlib: Lossless compression via Zlib compression.
+ * zstd: Lossless compression via Zstd compression.
+
+ See the `known transports `_ for more details.
+
+:````.topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "scan"
+ ============== =============================
+
+ Description:
+ Topic to listen the source data from.
+
+:````.min_height:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.05
+ ============== =============================
+
+ Description:
+ Minimum height the PointCloud projection to 2D space started from. Applicable for ``pointcloud`` type.
+
+:````.max_height:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.5
+ ============== =============================
+
+ Description:
+ Maximum height the PointCloud projection to 2D space ended with. Applicable for ``pointcloud`` type.
+
+:````.obstacles_angle:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double PI / 180 (1 degree)
+ ============== =============================
+
+ Description:
+ Angle increment (in radians) between nearby obstacle points at the range arc. Two outermost points from the field of view are not taken into account (they will always exist regardless of this value). Applicable for ``range`` type.
+
+:````.sampling_distance:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.1
+ ============== =============================
+
+ Description:
+ Internally the polygon is sampled for collision detection. sampling_distance is the distance between sampled points of the polygon. Applicable for ``polygon`` source type.
+
+:````.enabled:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool True
+ ============== =============================
+
+ Description:
+ Whether to use this source for collision detection. (Can be dynamically set)
+
+:````.source_timeout:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double (node parameter ``source_timeout`` value)
+ ============== =============================
+
+ Description:
+ Maximum time interval in which source data is considered as valid. If no new data is received within this interval, an additional warning will be displayed. Setting ``source_timeout: 0.0`` disables it. Overrides node parameter for each source individually, if desired.
+
+:````.exclusion_zones:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ vector []
+ ============== =============================
+
+ Description:
+ List of exclusion zone name IDs defined for this source. Each name refers to a
+ zone parameter block (see `Exclusion zones parameters`_). Points from this source
+ that fall inside an enabled zone are removed before the detector polygons are evaluated.
+
+Exclusion zones parameters
+==========================
+
+```` is a parameter block referenced by name from a source's ``exclusion_zones`` list. Zone names are global across the node.
+Exclusion zones remove (mask out) a source's points and never trigger detection. Each zone inherits the owning source's ``base_shift_correction`` policy.
+
+:````.type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "polygon"
+ ============== =============================
+
+ Description:
+ Type of zone shape. Available values are ``polygon`` and ``circle``.
+
+:````.points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string ""
+ ============== =============================
+
+ Description:
+ Zone polygon vertices, listed in ``"[[p1.x, p1.y], [p2.x, p2.y], [p3.x, p3.y], ...]"`` format, expressed in ``frame_id``. Used for ``polygon`` type. Minimum 3 points. Causes an error, if invalid for a ``polygon`` zone.
+
+:````.radius:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double N/A
+ ============== =============================
+
+ Description:
+ Circle radius. Used for ``circle`` type. Must be greater than 0. Causes an error, if not specified for a ``circle`` zone.
+
+:````.frame_id:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string (node ``base_frame_id``)
+ ============== =============================
+
+ Description:
+ Frame the zone shape is anchored to and tracked via TF (e.g. ``dock_link``). Leaving it empty, or equal to the base frame, makes a static, robot-relative zone.
+
+:````.frame_hold_timeout:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.0
+ ============== =============================
+
+ Description:
+ Extra time (in seconds) beyond ``transform_tolerance`` that the last known pose of a stale zone ``frame_id`` keeps being used before the zone fails safe and stops masking points. While held, the zone is frozen at its last valid pose in the ``odom_frame_id`` frame, so it stays world-fixed even if the robot moves. Useful to ride out brief detection dropouts of a marker-based zone frame. ``0.0`` means only the transform tolerance applies.
+
+:````.min_height:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double -inf
+ ============== =============================
+
+ Description:
+ Lower bound (in the base frame ``z``) of the height band a point must be within to be masked. Unbounded by default so 2D sources are fully covered.
+
+:````.max_height:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double +inf
+ ============== =============================
+
+ Description:
+ Upper bound (in the base frame ``z``) of the height band a point must be within to be masked. Unbounded by default so 2D sources are fully covered.
+
+:````.enabled:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description:
+ Whether this zone actively masks points. (Can be dynamically set)
+
+:````.visualize:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description:
+ Whether to publish the zone footprint as a ``geometry_msgs/PolygonStamped`` for visualization.
+
+:bond_heartbeat_period:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.25
+ ============== =============================
+
+ Description
+ The lifecycle node bond mechanism publishing period (on the /bond topic). Disabled if inferior or equal to 0.0.
+
+:allow_parameter_qos_overrides:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to allow QoS profiles to be overwritten with parameterized values.
+
+Example
+*******
+
+Here is an example of configuration YAML for the Collision Detector.
+
+.. code-block:: yaml
+
+ collision_detector:
+ ros__parameters:
+ base_frame_id: "base_footprint"
+ odom_frame_id: "odom"
+ transform_tolerance: 0.5
+ source_timeout: 5.0
+ base_shift_correction: True
+ polygons: ["PolygonFront"]
+ PolygonFront:
+ type: "polygon"
+ points: "[[0.3, 0.3], [0.3, -0.3], [0.0, -0.3], [0.0, 0.3]]"
+ action_type: "none"
+ min_points: 4
+ visualize: True
+ polygon_pub_topic: "polygon_front"
+ observation_sources: ["scan", "pointcloud"]
+ scan:
+ source_timeout: 0.2
+ type: "scan"
+ topic: "scan"
+ enabled: True
+ pointcloud:
+ type: "pointcloud"
+ topic: "/intel_realsense_r200_depth/points"
+ transport_type: "raw" # raw or/ with compression (zlib, draco, zstd)
+ min_height: 0.1
+ max_height: 0.5
+ enabled: True
+ exclusion_zones: ["dock"] # references the "dock" zone block below
+ # Exclusion zone blocks are referenced by name from a source's "exclusion_zones" list.
+ dock:
+ enabled: True
+ type: "polygon" # "polygon" or "circle"
+ frame_id: "dock_link" # frame the zone is anchored to; empty -> robot base frame (static)
+ points: "[[0.5, 0.5], [0.5, -0.5], [-0.5, -0.5], [-0.5, 0.5]]" # polygon type only
+ # radius: 0.5 # circle type only (must be > 0)
+ min_height: -1.0 # base-frame z band a point must be within to be masked
+ max_height: 1.0
+ visualize: True # publish the zone footprint as a PolygonStamped
diff --git a/configuration/packages/collision_monitor/configuring-collision-monitor-node.rst b/configuration/packages/collision_monitor/configuring-collision-monitor-node.rst
new file mode 100644
index 0000000000..2088a7c33e
--- /dev/null
+++ b/configuration/packages/collision_monitor/configuring-collision-monitor-node.rst
@@ -0,0 +1,986 @@
+.. _configuring_collision_monitor_node:
+
+Collision Monitor Node
+######################
+
+The Collision Monitor is a node providing an additional level of robot safety.
+It performs several collision avoidance related tasks using incoming data from the sensors, bypassing the costmap and trajectory planners, to monitor for and prevent potential collisions at the emergency-stop level.
+
+This is analogous to safety sensor and hardware features; take in laser scans from a real-time certified safety scanner, detect if there is to be an imminent collision in a configurable bounding box, and either emergency-stop the certified robot controller or slow the robot to avoid such collision.
+However, this node is done at the CPU level with any form of sensor.
+As such, this does not provide hard real-time safety certifications, but uses the same types of techniques with the same types of data for users that do not have safety-rated laser sensors, safety-rated controllers, or wish to use any type of data input (e.g. pointclouds from depth or stereo or range sensors).
+
+This is a useful and integral part of large heavy industrial robots, or robots moving with high velocities, around people or other dynamic agents (e.g. other robots) as a safety mechanism for high-response emergency stopping.
+The costmaps / trajectory planners will handle most situations, but this is to handle obstacles that virtually appear out of no where (from the robot's perspective) or approach the robot at such high speed it needs to immediately stop to prevent collision.
+
+See the package's ``README`` for more complete information. For more information how to bring-up your own Collision Monitor node, please refer to the :ref:`collision_monitor_tutorial` tutorial.
+
+Also, the practical demonstration of Collision Monitor abilities presented at 6th ROS Developers Day 2023, could be found below:
+
+.. raw:: html
+
+
+
+
+
+
+
+
+
+Features
+********
+
+The Collision Monitor uses polygons relative the robot's base frame origin to define "zones".
+Data that fall into these zones trigger an operation depending on the model being used.
+A given instance of the Collision Monitor can have many zones with different models at the same time.
+When multiple zones trigger at once, the most aggressive one is used (e.g. stop > slow 50% > slow 10%).
+
+The following models of safety behaviors are employed by Collision Monitor:
+
+- **Stop model**: Define a zone and a point threshold. If ``min_points`` or more obstacle points appear inside this area, stop the robot until the obstacles will disappear.
+- **Slowdown model**: Define a zone around the robot and slow the maximum speed for a ``slowdown_ratio``, if ``min_points`` or more points will appear inside the area.
+- **Limit model**: Define a zone around the robot and restricts the maximum linear and angular velocities to ``linear_limit`` and ``angular_limit`` values accordingly, if ``min_points`` or more points will appear inside the area.
+- **Approach model**: Using the current robot speed, estimate the time to collision to sensor data. If the time is less than ``time_before_collision`` seconds (0.5, 2, 5, etc...), the robot will slow such that it is now at least ``time_before_collision`` seconds to collision. The effect here would be to keep the robot always ``time_before_collision`` seconds from any collision.
+
+The zones around the robot can take the following shapes:
+
+- Arbitrary user-defined polygon relative to the robot base frame, which can be static in a configuration file or dynamically changing via a topic interface.
+- Robot footprint polygon, which is used in the approach behavior model only. Will use the static user-defined polygon or the footprint topic to allow it to be dynamically adjusted over time.
+- Circle: is made for the best performance and could be used in the cases where the zone or robot footprint could be approximated by round shape.
+- VelocityPolygon: allow switching of polygons based on the command velocity. This is useful for robots to set different safety zones based on their velocity (e.g. a robot that has a larger safety zone when moving at 1.0 m/s than when moving at 0.5 m/s).
+
+All shapes (``Polygon``, ``Circle`` and ``VelocityPolygon``) are derived from base ``Polygon`` class, so without loss of generality they would be called as "polygons".
+Subscribed footprint is also having the same properties as other polygons, but it is being obtained a footprint topic for the Approach Model.
+
+The data may be obtained from different data sources:
+
+- Laser scanners (``sensor_msgs::msg::LaserScan`` messages)
+- PointClouds (``sensor_msgs::msg::PointCloud2`` messages)
+- IR/Sonars (``sensor_msgs::msg::Range`` messages)
+- Costmap (``nav2_msgs::msg::Costmap`` messages)
+
+.. warning::
+
+ **⚠️ when using CostmapSource**
+ Collision Monitor normally **bypasses the costmap** to minimize reaction latency using fresh sensor data.
+ Use at your own caution or when using external costmap sources from derived sources.
+
+Any data source can optionally define one or more **exclusion zones**.
+An exclusion zone is a region that *removes* (masks out) that source's points which fall inside it, before the action polygons are evaluated.
+Unlike the polygons above, an exclusion zone does **not** trigger a behavior, it is a per-source pre-filter.
+A typical use case is ignoring known structure the robot deliberately approaches, such as a charging dock or a conveyor, whose returns would otherwise trip the stop/slowdown zones.
+Another common use case is self-filtering: masking out returns from parts of the robot itself (e.g. arms, mast, bumpers, or trailers) that fall within a sensor's field of view, which would otherwise be mistaken for obstacles. Anchoring the zone to the relevant robot frame keeps the mask aligned with that structure as it moves.
+A zone can be a polygon or circle anchored to an arbitrary ``frame_id`` (e.g. ``dock_link``), so it tracks that frame as the robot moves, with an optional height band for 3D sources.
+The filter is fail-safe: if the zone transform is unavailable, no points are removed, so collision protection is never silently lost.
+Each zone inherits its owning source's ``base_shift_correction`` policy, so the mask and the source points are always transformed under the same assumptions.
+See YAML at the bottom for an example.
+
+
+Parameters
+**********
+
+:enabled:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool True
+ ============== =============================
+
+ Description:
+ Sets the initial state. This can come in handy when the robot is docked/inside any of the zones at startup and the node needs to be disabled then.
+ Please note that is not a dynamic parameter, there's ``/toggle`` service interface
+ and `BT Node `_ to update this state later at runtime.
+
+:base_frame_id:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "base_footprint"
+ ============== =============================
+
+ Description:
+ Robot base frame.
+
+:odom_frame_id:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "odom"
+ ============== =============================
+
+ Description:
+ Which frame to use for odometry.
+
+:cmd_vel_in_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "cmd_vel_smoothed"
+ ============== =============================
+
+ Description:
+ Input ``cmd_vel`` topic with desired robot velocity.
+ Please note, pre-``Jazzy`` this was set to ``cmd_vel_raw`` by default.
+
+:cmd_vel_out_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "cmd_vel"
+ ============== =============================
+
+ Description:
+ Output ``cmd_vel`` topic with output produced by Collision Monitor velocities.
+
+:state_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string ""
+ ============== =============================
+
+ Description:
+ Output the currently activated polygon action type and name. Optional parameter. No publisher will be created if it is unspecified.
+
+:transform_tolerance:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.1
+ ============== =============================
+
+ Description
+ Time with which to post-date the transform that is published, to indicate that this transform is valid into the future.
+
+:source_timeout:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.0
+ ============== =============================
+
+ Description:
+ Maximum time interval in which source data is considered as valid. If no new data is received within this interval, the robot will be stopped. Setting ``source_timeout: 0.0`` disables this blocking mechanism. This parameter can be overridden per observation source.
+
+:base_shift_correction:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool True
+ ============== =============================
+
+ Description:
+ Whether to correct source data towards to base frame movement, considering the difference between current time and latest source time. If enabled, produces more accurate sources positioning in the robot base frame, at the cost of slower performance. This will cause average delays for ``~1/(2*odom_rate)`` per each ``cmd_vel`` calculation cycle. However, disabling this option for better performance is not recommended for the fast moving robots, where during the typical rate of data sources, robot could move unacceptably far. Thus reasonable odometry rates are recommended (~100 hz).
+
+:stop_pub_timeout:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 1.0
+ ============== =============================
+
+ Description:
+ Timeout, after which zero-velocity ceases to be published. It could be used for other overrode systems outside Nav2 are trying to bring the robot out of a state close to a collision, or to allow a standing robot to go into sleep mode.
+
+:polygons:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ vector N/A
+ ============== =============================
+
+ Description:
+ List of zones (stop/slowdown/limit bounding boxes, footprint, approach circle, etc...). Causes an error, if not specialized.
+
+
+:observation_sources:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ vector N/A
+ ============== =============================
+
+ Description:
+ List of data sources (laser scanners, pointclouds, etc...). Causes an error, if not specialized.
+
+:use_realtime_priority:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool false
+ ============== =======
+
+ Description
+ Adds soft real-time prioritization to the controller server to better ensure resources to time sensitive portions of the codebase. This will set the controller's execution thread to a higher priority than the rest of the system (``90``) to meet scheduling deadlines to have less missed loop rates. To use this feature, you use set the following inside of ``/etc/security/limits.conf`` to give userspace access to elevated prioritization permissions: `` soft rtprio 99 hard rtprio 99``
+
+:enable_stamped_cmd_vel:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to use geometry_msgs::msg::Twist or geometry_msgs::msg::TwistStamped velocity data.
+ True uses TwistStamped, false uses Twist.
+ Note: This parameter is default ``false`` in Jazzy or older! Kilted or newer uses ``TwistStamped`` by default.
+
+Polygons parameters
+===================
+
+```` is the corresponding polygon name ID selected for this type.
+
+:````.type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string N/A
+ ============== =============================
+
+ Description:
+ Type of polygon shape. Available values are ``polygon``, ``circle``. Causes an error, if not specialized.
+
+:````.points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string N/A
+ ============== =============================
+
+ Description:
+ Polygon vertices, listed in ``"[[p1.x, p1.y], [p2.x, p2.y], [p3.x, p3.y], ...]"`` format (e.g. ``"[[0.5, 0.25], [0.5, -0.25], [0.0, -0.25], [0.0, 0.25]]"`` for the square in the front). Used for ``polygon`` type. Minimum 3 points for a triangle polygon. If not specified, the collision monitor will use dynamic polygon subscription to ``polygon_sub_topic`` for points in the ``stop``/``slowdown``/``limit`` action types, or footprint subscriber to ``footprint_topic`` for ``approach`` action type.
+
+:````.polygon_sub_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string N/A
+ ============== =============================
+
+ Description:
+ For ``polygon`` type, topic to listen the polygon points from. For ``circle`` type, topic to listen the circle radius from. Applicable for ``stop``/``slowdown``/``limit`` action types. Causes an error if not specified **and** static polygon geometry (using parameter ``points`` for ``polygon`` type or ``radius`` for ``circle`` type) is also not specified. If both static polygon geometry and ``polygon_sub_topic`` are specified, the static parameter takes priority.
+
+:````.footprint_topic:
+
+ ============== ===================================
+ Type Default
+ -------------- -----------------------------------
+ string "local_costmap/published_footprint"
+ ============== ===================================
+
+ Description:
+ Topic to listen the robot footprint from. Applicable only for ``polygon`` type and ``approach`` action type. If both ``points`` and ``footprint_topic`` are specified, the static ``points`` takes priority.
+
+:````.polygon_subscribe_transient_local:
+
+ ============== ===================================
+ Type Default
+ -------------- -----------------------------------
+ bool False
+ ============== ===================================
+
+ Description:
+ QoS durability setting for the incoming polygon or footprint topic subscription.
+
+:````.radius:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double N/A
+ ============== =============================
+
+ Description:
+ Circle radius. Used for ``circle`` type. If not specified, the collision monitor will use dynamic polygon subscription to ``polygon_sub_topic`` for circle radius in the ``stop``/``slowdown``/``limit`` action types.
+
+:````.action_type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string N/A
+ ============== =============================
+
+ Description:
+ Zone behavior model. Available values are ``stop``, ``slowdown``, ``limit``, ``approach``. Causes an error, if not specialized.
+
+:````.min_points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 4
+ ============== =============================
+
+ Description:
+ Minimum number of data readings within a zone to trigger the action. Former ``max_points`` parameter for Humble, that meant the maximum number of data readings within a zone to not trigger the action). ``min_points`` is equal to ``max_points + 1`` value.
+
+:````.trigger_consecutive_points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 1
+ ============== =============================
+
+ Description:
+ Number of consecutive processing cycles with ``points_inside >= min_points`` required to enter the triggered state.
+ A value of ``1`` means trigger in a single processing cycle.
+
+:````.release_consecutive_points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 1
+ ============== =============================
+
+ Description:
+ Number of consecutive processing cycles with ``points_inside < min_points`` required to leave the triggered state.
+ A value of ``1`` means release in a single processing cycle.
+ In practice, values greater than ``1`` can reduce sensor noise flicker while remaining responsive.
+
+:````.slowdown_ratio:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.5
+ ============== =============================
+
+ Description:
+ Robot slowdown (share of its actual speed). Applicable for ``slowdown`` action type.
+
+:````.linear_limit:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.5
+ ============== =============================
+
+ Description:
+ Robot linear speed limit. Applicable for ``limit`` action type.
+
+:````.angular_limit:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.5
+ ============== =============================
+
+ Description:
+ Robot angular speed limit. Applicable for ``limit`` action type.
+
+:````.time_before_collision:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.0
+ ============== =============================
+
+ Description:
+ Time before collision in seconds. Maximum simulation time used in collision prediction. Higher values mean lower performance. Applicable for ``approach`` action type.
+
+:````.simulation_time_step:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.1
+ ============== =============================
+
+ Description:
+ Time iteration step for robot movement simulation during collision prediction. Higher values mean lower prediction accuracy but better performance. Applicable for ``approach`` action type.
+
+:````.visualize:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description:
+ Whether to publish the polygon in a separate topic.
+
+:````.polygon_pub_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string
+ ============== =============================
+
+ Description:
+ Topic name to publish a polygon to. Used only if ``visualize`` is true.
+
+:````.enabled:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool True
+ ============== =============================
+
+ Description:
+ Whether to use this polygon for collision monitoring. (Can be dynamically set)
+
+VelocityPolygon parameters
+==========================
+
+All previous Polygon parameters apply, in addition to the following unique parameters for VelocityPolygon.
+
+:````.holonomic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description:
+ Whether to use holonomic or non-holonomic robot model for collision prediction. For holonomic robot model, the resultant velocity will be used to compare the linear velocity range. Additionally, there will be 2 more parameters, ``direction_start_angle`` and ``direction_end_angle``, to specify the resultant velocity direction.
+
+:````.velocity_polygons:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ vector N/A
+ ============== =============================
+
+ Description:
+ List of sub polygons for switching based on the robot's current velocity. When velocity is covered by multiple sub polygons, the first sub polygon in the list will be used. Causes an error, if not specified.
+
+:``.``.points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ vector N/A
+ ============== =============================
+
+ Description:
+ Polygon vertices, listed in ``"[[p1.x, p1.y], [p2.x, p2.y], [p3.x, p3.y], ...]"`` format (e.g. ``"[[0.5, 0.25], [0.5, -0.25], [0.0, -0.25], [0.0, 0.25]]"`` for the square in the front). Used for ``polygon`` type. Minimum 3 points for a triangle polygon. Causes an error, if not specified.
+
+:``.``.linear_min:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double N/A
+ ============== =============================
+
+ Description:
+ Minimum linear velocity for the sub-polygon. Causes an error, if not specified.
+
+ * **Non-holonomic:** This is the minimum signed velocity along the x-axis (allows negative values for reverse motion).
+ * **Holonomic:** This is the minimum magnitude of the resultant velocity, which must be ``>= 0.0``.
+
+:``.``.linear_max:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double N/A
+ ============== =============================
+
+ Description:
+ Maximum linear velocity for the sub polygon. Causes an error, if not specified.
+
+ * **Non-holonomic:** This is the maximum signed velocity along the x-axis. (allows negative values for reverse motion).
+ * **Holonomic:** This is the maximum magnitude of the resultant velocity, which must be ``>= 0.0``.
+
+:``.``.theta_min:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double N/A
+ ============== =============================
+
+ Description:
+ Minimum angular velocity for the sub polygon. Causes an error, if not specified.
+
+:``.``.theta_max:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double N/A
+ ============== =============================
+
+ Description:
+ Maximum angular velocity for the sub polygon. Causes an error, if not specified.
+
+:``.``.direction_start_angle:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double -PI
+ ============== =============================
+
+ Description:
+ Start angle of the movement direction(for holonomic robot only). Refer to the `Example`_ section for the common configurations. Applicable for `holonomic` mode only.
+
+:``.``.direction_end_angle:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double PI
+ ============== =============================
+
+ Description:
+ End angle of the movement direction(for holonomic robot only). Refer to the `Example`_ section for the common configurations. Applicable for `holonomic` mode only.
+
+Observation sources parameters
+==============================
+
+```` is the corresponding data source name ID selected for this type.
+
+:````.type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "scan"
+ ============== =============================
+
+ Description:
+ Type of polygon shape. Could be ``scan``, ``pointcloud``, ``range``, ``polygon`` or ``costmap``.
+
+:````.transport_type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "raw"
+ ============== =============================
+
+ Description:
+ For ``pointcloud`` data, specify the transport plugin to use:
+
+ * raw: No compression. Default; highest bandwidth usage.
+ * draco: Lossy compression via Google.
+ * zlib: Lossless compression via Zlib compression.
+ * zstd: Lossless compression via Zstd compression.
+
+ See the `known transports `_ for more details.
+
+:````.topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "scan"
+ ============== =============================
+
+ Description:
+ Topic to listen the source data from.
+
+:````.min_height:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.05
+ ============== =============================
+
+ Description:
+ Minimum height the PointCloud projection to 2D space started from. Applicable for ``pointcloud`` type.
+
+:````.max_height:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.5
+ ============== =============================
+
+ Description:
+ Maximum height the PointCloud projection to 2D space ended with. Applicable for ``pointcloud`` type.
+
+:````.use_global_height:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool false
+ ============== =============================
+
+ Description:
+ Set true for pointcloud sources containing a "height" field relative to a real world ground contour. The "height" field will be used for the min and max height checks instead of the "z" field and will not be transformed as it is assumed that height is already global frame referenced. Applicable for ``pointcloud`` type.
+
+:````.min_range:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.0
+ ============== =============================
+
+ Description:
+ Minimum range threshold for PointCloud points. Points closer than this distance (measured as Euclidean distance from sensor origin) will be filtered out before processing. Useful for eliminating noise and invalid readings very close to the sensor. Applicable for ``pointcloud`` type.
+
+:````.obstacles_angle:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double PI / 180 (1 degree)
+ ============== =============================
+
+ Description:
+ Angle increment (in radians) between nearby obstacle points at the range arc. Two outermost points from the field of view are not taken into account (they will always exist regardless of this value). Applicable for ``range`` type.
+
+:````.sampling_distance:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.1
+ ============== =============================
+
+ Description:
+ Internally the polygon is sampled for collision detection. sampling_distance is the distance between sampled points of the polygon. Applicable for ``polygon`` source type.
+
+:````.enabled:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool True
+ ============== =============================
+
+ Description:
+ Whether to use this source for collision monitoring. (Can be dynamically set)
+
+:````.source_timeout:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double (node parameter ``source_timeout`` value)
+ ============== =============================
+
+ Description:
+ Maximum time interval in which source data is considered as valid. If no new data is received within this interval, the robot will be stopped. Setting ``source_timeout: 0.0`` disables this blocking mechanism. Overrides node parameter for each source individually, if desired.
+
+:````.cost_threshold:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 253
+ ============== =============================
+
+ Description:
+ For ``costmap`` sources only. Minimum cell cost (0–255) to be treated as an
+ obstacle. By default this matches inscribed/lethal cells (253–254) and ignores
+ lower-cost cells.
+
+:````.treat_unknown_as_obstacle:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description:
+ For ``costmap`` sources only. If ``true``, cells with cost ``255`` (``NO_INFORMATION``)
+ will also be turned into obstacle points. Set to ``false`` if your costmap has
+ large unknown areas you don’t want to trigger Collision Monitor.
+
+:````.exclusion_zones:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ vector []
+ ============== =============================
+
+ Description:
+ List of exclusion zone name IDs defined for this source. Each name refers to a
+ zone parameter block (see `Exclusion zones parameters`_). Points from this source
+ that fall inside an enabled zone are removed before the action polygons are evaluated.
+
+Exclusion zones parameters
+==========================
+
+```` is a parameter block referenced by name from a source's ``exclusion_zones`` list. Zone names are global across the node.
+Exclusion zones remove (mask out) a source's points and never trigger an action. Each zone inherits the owning source's ``base_shift_correction`` policy.
+
+:````.type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "polygon"
+ ============== =============================
+
+ Description:
+ Type of zone shape. Available values are ``polygon`` and ``circle``.
+
+:````.points:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string ""
+ ============== =============================
+
+ Description:
+ Zone polygon vertices, listed in ``"[[p1.x, p1.y], [p2.x, p2.y], [p3.x, p3.y], ...]"`` format, expressed in ``frame_id``. Used for ``polygon`` type. Minimum 3 points. Causes an error, if invalid for a ``polygon`` zone.
+
+:````.radius:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double N/A
+ ============== =============================
+
+ Description:
+ Circle radius. Used for ``circle`` type. Must be greater than 0. Causes an error, if not specified for a ``circle`` zone.
+
+:````.frame_id:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string (node ``base_frame_id``)
+ ============== =============================
+
+ Description:
+ Frame the zone shape is anchored to and tracked via TF (e.g. ``dock_link``). Leaving it empty, or equal to the base frame, makes a static, robot-relative zone.
+
+:````.frame_hold_timeout:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.0
+ ============== =============================
+
+ Description:
+ Extra time (in seconds) beyond ``transform_tolerance`` that the last known pose of a stale zone ``frame_id`` keeps being used before the zone fails safe and stops masking points. While held, the zone is frozen at its last valid pose in the ``odom_frame_id`` frame, so it stays world-fixed even if the robot moves. Useful to ride out brief detection dropouts of a marker-based zone frame. ``0.0`` means only the transform tolerance applies.
+
+:````.min_height:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double -inf
+ ============== =============================
+
+ Description:
+ Lower bound (in the base frame ``z``) of the height band a point must be within to be masked. Unbounded by default so 2D sources are fully covered.
+
+:````.max_height:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double +inf
+ ============== =============================
+
+ Description:
+ Upper bound (in the base frame ``z``) of the height band a point must be within to be masked. Unbounded by default so 2D sources are fully covered.
+
+:````.enabled:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description:
+ Whether this zone actively masks points. (Can be dynamically set)
+
+:````.visualize:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description:
+ Whether to publish the zone footprint as a ``geometry_msgs/PolygonStamped`` for visualization.
+
+:bond_heartbeat_period:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.25
+ ============== =============================
+
+ Description
+ The lifecycle node bond mechanism publishing period (on the /bond topic). Disabled if inferior or equal to 0.0.
+
+:allow_parameter_qos_overrides:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to allow QoS profiles to be overwritten with parameterized values.
+
+Example
+*******
+
+Here is an example illustrating the common configurations for holonomic robots that cover multiple directions of the resultant velocity:
+
+.. image:: ../images/holonomic_examples.png
+ :height: 2880px
+
+Here is an example of configuration YAML for the Collision Monitor.
+
+.. code-block:: yaml
+
+ collision_monitor:
+ ros__parameters:
+ enabled: True
+ base_frame_id: "base_footprint"
+ odom_frame_id: "odom"
+ cmd_vel_in_topic: "cmd_vel_smoothed"
+ cmd_vel_out_topic: "cmd_vel"
+ state_topic: "collision_monitor_state"
+ transform_tolerance: 0.5
+ source_timeout: 5.0
+ base_shift_correction: True
+ stop_pub_timeout: 2.0
+ enable_stamped_cmd_vel: True # False for Jazzy or older
+ use_realtime_priority: false
+ polygons: ["PolygonStop", "PolygonSlow", "FootprintApproach"]
+ PolygonStop:
+ type: "circle"
+ radius: 0.3
+ action_type: "stop"
+ min_points: 4 # max_points: 3 for Humble
+ visualize: True
+ polygon_pub_topic: "polygon_stop"
+ enabled: True
+ PolygonSlow:
+ type: "polygon"
+ points: "[[1.0, 1.0], [1.0, -1.0], [-0.5, -1.0], [-0.5, 1.0]]"
+ action_type: "slowdown"
+ min_points: 4 # max_points: 3 for Humble
+ slowdown_ratio: 0.3
+ visualize: True
+ polygon_pub_topic: "polygon_slowdown"
+ enabled: True
+ PolygonLimit:
+ type: "polygon"
+ points: "[[0.5, 0.5], [0.5, -0.5], [-0.5, -0.5], [-0.5, 0.5]]"
+ action_type: "limit"
+ min_points: 4 # max_points: 3 for Humble
+ linear_limit: 0.4
+ angular_limit: 0.5
+ visualize: True
+ polygon_pub_topic: "polygon_limit"
+ enabled: True
+ FootprintApproach:
+ type: "polygon"
+ action_type: "approach"
+ footprint_topic: "/local_costmap/published_footprint"
+ time_before_collision: 2.0
+ simulation_time_step: 0.02
+ min_points: 6 # max_points: 5 for Humble
+ visualize: False
+ enabled: True
+ VelocityPolygonStop:
+ type: "velocity_polygon"
+ action_type: "stop"
+ min_points: 6
+ visualize: True
+ enabled: True
+ polygon_pub_topic: "velocity_polygon_stop"
+ velocity_polygons: ["rotation", "translation_forward", "translation_backward", "stopped"]
+ holonomic: false
+ rotation:
+ points: "[[0.3, 0.3], [0.3, -0.3], [-0.3, -0.3], [-0.3, 0.3]]"
+ linear_min: 0.0
+ linear_max: 0.05
+ theta_min: -1.0
+ theta_max: 1.0
+ translation_forward:
+ points: "[[0.35, 0.3], [0.35, -0.3], [-0.2, -0.3], [-0.2, 0.3]]"
+ linear_min: 0.0
+ linear_max: 1.0
+ theta_min: -1.0
+ theta_max: 1.0
+ translation_backward:
+ points: "[[0.2, 0.3], [0.2, -0.3], [-0.35, -0.3], [-0.35, 0.3]]"
+ linear_min: -1.0
+ linear_max: 0.0
+ theta_min: -1.0
+ theta_max: 1.0
+ # This is the last polygon to be checked, it should cover the entire range of robot's velocities
+ # It is used as the stopped polygon when the robot is not moving and as a fallback if the velocity
+ # is not covered by any of the other sub-polygons
+ stopped:
+ points: "[[0.25, 0.25], [0.25, -0.25], [-0.25, -0.25], [-0.25, 0.25]]"
+ linear_min: -1.0
+ linear_max: 1.0
+ theta_min: -1.0
+ theta_max: 1.0
+ observation_sources: ["scan", "pointcloud"]
+ scan:
+ source_timeout: 0.2
+ type: "scan"
+ topic: "/scan"
+ enabled: True
+ pointcloud:
+ type: "pointcloud"
+ topic: "/intel_realsense_r200_depth/points"
+ transport_type: "raw" # raw or/ with compression (zlib, draco, zstd)
+ min_height: 0.1
+ max_height: 0.5
+ min_range: 0.2
+ enabled: True
+ exclusion_zones: ["dock"] # references the "dock" zone block below
+ # Exclusion zone blocks are referenced by name from a source's "exclusion_zones" list.
+ dock:
+ enabled: True
+ type: "polygon" # "polygon" or "circle"
+ frame_id: "dock_link" # frame the zone is anchored to; empty -> robot base frame (static)
+ points: "[[0.5, 0.5], [0.5, -0.5], [-0.5, -0.5], [-0.5, 0.5]]" # polygon type only
+ # radius: 0.5 # circle type only (must be > 0)
+ min_height: -1.0 # base-frame z band a point must be within to be masked
+ max_height: 1.0
+ visualize: True # publish the zone footprint as a PolygonStamped
+ # costmap:
+ # type: "costmap" # relative, respects namespaces
+ # topic: "local_costmap/costmap"
+ # cost_threshold: 254
+ # enabled: True
+ # treat_unknown_as_obstacle: True
diff --git a/configuration/packages/configuring-amcl.rst b/configuration/packages/configuring-amcl.rst
new file mode 100644
index 0000000000..1c17a6432e
--- /dev/null
+++ b/configuration/packages/configuring-amcl.rst
@@ -0,0 +1,581 @@
+.. _configuring_amcl:
+
+AMCL
+####
+
+Source code on Github_.
+
+.. _Github: https://github.com/ros-navigation/navigation2/tree/main/nav2_amcl
+
+AMCL implements the server for taking a static map and localizing the robot within it using an Adaptive Monte-Carlo Localizer.
+
+Parameters
+**********
+
+:alpha1:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 0.2
+ ============== =======
+
+ Description
+ Expected process noise in odometry's rotation estimate from rotation.
+
+:alpha2:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.2
+ ============== ==============
+
+ Description
+ Expected process noise in odometry's rotation estimate from translation.
+
+:alpha3:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.2
+ ============== =============================
+
+ Description
+ Expected process noise in odometry's translation estimate from translation.
+
+:alpha4:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.2
+ ============== =============================
+
+ Description
+ Expected process noise in odometry's translation estimate from rotation.
+
+:alpha5:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.2
+ ============== =============================
+
+ Description
+ For Omni models only: translation noise.
+
+:base_frame_id:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "base_footprint"
+ ============== =============================
+
+ Description
+ Robot base frame.
+
+:beam_skip_distance:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.5
+ ============== =============================
+
+ Description
+ Ignore beams that most particles disagree with in Likelihood field model. Maximum distance to consider skipping for (m).
+
+:beam_skip_error_threshold:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.9
+ ============== =============================
+
+ Description
+ Percentage of beams after not matching map to force full update due to bad convergence.
+
+:beam_skip_threshold:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.3
+ ============== =============================
+
+ Description
+ Percentage of beams required to skip.
+
+:do_beamskip:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description
+ Whether to do beam skipping in Likelihood field model.
+
+:global_frame_id:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "map"
+ ============== =============================
+
+ Description
+ The name of the coordinate frame published by the localization system.
+
+:lambda_short:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.1
+ ============== =============================
+
+ Description
+ Exponential decay parameter for z_short part of model.
+
+:laser_likelihood_max_dist:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.0
+ ============== =============================
+
+ Description
+ Maximum distance to do obstacle inflation on map, for use in likelihood_field model.
+
+:laser_max_range:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 100.0
+ ============== =============================
+
+ Description
+ Maximum scan range to be considered, -1.0 will cause the laser's reported maximum range to be used.
+
+:laser_min_range:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double -1.0
+ ============== =============================
+
+ Description
+ Minimum scan range to be considered, -1.0 will cause the laser's reported minimum range to be used.
+
+:laser_model_type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "likelihood_field"
+ ============== =============================
+
+ Description
+ Which model to use, either beam, likelihood_field, or likelihood_field_prob. Same as likelihood_field but incorporates the beamskip feature, if enabled.
+
+:set_initial_pose:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description
+ Causes AMCL to set initial pose from the initial_pose* parameters instead of waiting for the initial_pose message.
+
+:initial_pose:
+
+ ============== ==================================
+ Type Default
+ -------------- ----------------------------------
+ Pose2D {x: 0.0, y: 0.0, z: 0.0, yaw: 0.0}
+ ============== ==================================
+
+ Description
+ X, Y, Z, and yaw coordinates of initial pose (meters and radians) of robot base frame in global frame.
+
+:max_beams:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 60
+ ============== =============================
+
+ Description
+ How many evenly-spaced beams in each scan to be used when updating the filter.
+
+:max_particles:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 2000
+ ============== =============================
+
+ Description
+ Maximum allowed number of particles.
+
+:min_particles:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 500
+ ============== =============================
+
+ Description
+ Minimum allowed number of particles.
+
+:odom_frame_id:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "odom"
+ ============== =============================
+
+ Description
+ Which frame to use for odometry.
+
+:pf_err:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.05
+ ============== =============================
+
+ Description
+ Particle Filter population error.
+
+:pf_z:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.99
+ ============== =============================
+
+ Description
+ Particle filter population density. 2.33 is the 99% percentile.
+
+:random_seed:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int -1
+ ============== =============================
+
+ Description
+ Seed for the particle filter RNG.
+
+ - ``random_seed >= 0``: seed the RNG with the provided value (repeatable runs).
+ - ``random_seed < 0`` (default): seed the RNG from time (preserves historical behavior).
+
+:recovery_alpha_fast:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.0
+ ============== =============================
+
+ Description
+ Exponential decay rate for the fast average weight filter, used in deciding when to recover by adding random poses. A good value might be 0.1.
+
+:recovery_alpha_slow:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.0
+ ============== =============================
+
+ Description
+ Exponential decay rate for the slow average weight filter, used in deciding when to recover by adding random poses. A good value might be 0.001.
+
+
+:resample_interval:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ int 1
+ ============== =============================
+
+ Description
+ Number of filter updates required before resampling.
+
+:robot_model_type:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "nav2_amcl::DifferentialMotionModel"
+ ============== =============================
+
+ Description
+ The fully-qualified type of the plugin class. Options are "nav2_amcl::DifferentialMotionModel" and "nav2_amcl::OmniMotionModel". Users can also provide their own custom motion model plugin type.
+
+ Note for users of galactic and earlier
+ The models are selectable by string key (valid options: "differential", "omnidirectional") rather than plugins.
+
+:save_pose_rate:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.5
+ ============== =============================
+
+ Description
+ Maximum rate (Hz) at which to store the last estimated pose and covariance to the parameter server, in the variables ~initial_pose_* and ~initial_cov_*. This saved pose will be used on subsequent runs to initialize the filter (-1.0 to disable).
+
+:sigma_hit:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.2
+ ============== =============================
+
+ Description
+ Standard deviation for Gaussian model used in z_hit part of the model.
+
+:tf_broadcast:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool True
+ ============== =============================
+
+ Description
+ Set this to false to prevent amcl from publishing the transform between the global frame and the odometry frame.
+
+:transform_tolerance:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 1.0
+ ============== =============================
+
+ Description
+ Time with which to post-date the transform that is published, to indicate that this transform is valid into the future.
+
+:introspection_mode:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "disabled"
+ ============== =============================
+
+ Description
+ The introspection mode for services and actions. Options are "disabled", "metadata", "contents".
+
+:update_min_a:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.2
+ ============== =============================
+
+ Description
+ Rotational movement required before performing a filter update.
+
+:update_min_d:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.25
+ ============== =============================
+
+ Description
+ Translational movement required before performing a filter update.
+
+:z_hit:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.5
+ ============== =============================
+
+ Description
+ Mixture weight for z_hit part of model, sum of all used z weight must be 1. Beam uses all 4, likelihood model uses z_hit and z_rand..
+
+:z_max:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.05
+ ============== =============================
+
+ Description
+ Mixture weight for z_max part of model, sum of all used z weight must be 1. Beam uses all 4, likelihood model uses z_hit and z_rand.
+
+:z_rand:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.5
+ ============== =============================
+
+ Description
+ Mixture weight for z_rand part of model, sum of all used z weight must be 1. Beam uses all 4, likelihood model uses z_hit and z_rand..
+
+:z_short:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.005
+ ============== =============================
+
+ Description
+ Mixture weight for z_short part of model, sum of all used z weight must be 1. Beam uses all 4, likelihood model uses z_hit and z_rand.
+
+:always_reset_initial_pose:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description
+ Requires that AMCL is provided an initial pose either via topic or initial_pose* parameter (with parameter set_initial_pose: true) when reset. Otherwise, by default AMCL will use the last known pose to initialize.
+
+:scan_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string scan
+ ============== =============================
+
+ Description
+ Laser scan topic to subscribe to.
+
+:map_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string map
+ ============== =============================
+
+ Description
+ Map topic to subscribe to.
+
+:first_map_only:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool False
+ ============== =============================
+
+ Description
+ Allows AMCL to accept maps more than once on the map_topic. This is especially useful when you're using the `LoadMap` service in `map_server`. Prior to Humble, this is ``first_map_only_``.
+
+:bond_heartbeat_period:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.25
+ ============== =============================
+
+ Description
+ The lifecycle node bond mechanism publishing period (on the /bond topic). Disabled if inferior or equal to 0.0.
+
+:allow_parameter_qos_overrides:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to allow QoS profiles to be overwritten with parameterized values.
+
+Example
+*******
+.. code-block:: yaml
+
+ amcl:
+ ros__parameters:
+ alpha1: 0.2
+ alpha2: 0.2
+ alpha3: 0.2
+ alpha4: 0.2
+ alpha5: 0.2
+ base_frame_id: "base_footprint"
+ introspection_mode: "disabled"
+ beam_skip_distance: 0.5
+ beam_skip_error_threshold: 0.9
+ beam_skip_threshold: 0.3
+ do_beamskip: false
+ global_frame_id: "map"
+ lambda_short: 0.1
+ laser_likelihood_max_dist: 2.0
+ laser_max_range: 100.0
+ laser_min_range: -1.0
+ laser_model_type: "likelihood_field"
+ max_beams: 60
+ max_particles: 2000
+ min_particles: 500
+ odom_frame_id: "odom"
+ pf_err: 0.05
+ pf_z: 0.99
+ random_seed: -1
+ recovery_alpha_fast: 0.0
+ recovery_alpha_slow: 0.0
+ resample_interval: 1
+ robot_model_type: "nav2_amcl::DifferentialMotionModel"
+ save_pose_rate: 0.5
+ sigma_hit: 0.2
+ tf_broadcast: true
+ transform_tolerance: 1.0
+ update_min_a: 0.2
+ update_min_d: 0.25
+ z_hit: 0.5
+ z_max: 0.05
+ z_rand: 0.5
+ z_short: 0.05
+ scan_topic: scan
+ map_topic: map
+ set_initial_pose: false
+ always_reset_initial_pose: false
+ first_map_only: false
+ initial_pose:
+ x: 0.0
+ y: 0.0
+ z: 0.0
+ yaw: 0.0
diff --git a/configuration/packages/configuring-behavior-server.rst b/configuration/packages/configuring-behavior-server.rst
new file mode 100644
index 0000000000..3992a18845
--- /dev/null
+++ b/configuration/packages/configuring-behavior-server.rst
@@ -0,0 +1,469 @@
+.. _configuring_behavior_server:
+
+Behavior Server
+###############
+
+Source code on Github_.
+
+.. _Github: https://github.com/ros-navigation/navigation2/tree/main/nav2_behaviors
+
+The Behavior Server implements the server for handling various behavior, such as recoveries and docking, requests and hosting a vector of plugins implementing various C++ behaviors.
+It is also possible to implement independent behavior servers for each custom behavior, but this server will allow multiple behaviors to share resources such as costmaps and TF buffers to lower incremental costs for new behaviors.
+
+Note: the wait recovery behavior has no parameters, the duration to wait is given in the action request.
+Note: pre-Rolling/Humble this was the Recovery server, not behavior server. Launch files, behaviors and tests were all renamed.
+
+Behavior Server Parameters
+**************************
+
+:local_costmap_topic:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ string "local_costmap/costmap_raw"
+ ============== ===========================
+
+ Description
+ Raw costmap topic for collision checking on the local costmap.
+
+:global_costmap_topic:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ string "global_costmap/costmap_raw"
+ ============== ===========================
+
+ Description
+ Raw costmap topic for collision checking on the global costmap.
+
+:local_footprint_topic:
+
+ ============== ===================================
+ Type Default
+ -------------- -----------------------------------
+ string "local_costmap/published_footprint"
+ ============== ===================================
+
+ Description
+ Topic for footprint in the local costmap frame.
+
+:global_footprint_topic:
+
+ ============== ===================================
+ Type Default
+ -------------- -----------------------------------
+ string "global_costmap/published_footprint"
+ ============== ===================================
+
+ Description
+ Topic for footprint in the global costmap frame.
+
+:cycle_frequency:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 10.0
+ ============== =============================
+
+ Description
+ Frequency to run behavior plugins.
+
+:transform_tolerance:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.1
+ ============== =============================
+
+ Description
+ TF transform tolerance.
+
+:local_frame:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "odom"
+ ============== =============================
+
+ Description
+ Local reference frame.
+
+:global_frame:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "map"
+ ============== =============================
+
+ Description
+ Global reference frame.
+
+:robot_base_frame:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "base_link"
+ ============== =============================
+
+ Description
+ Robot base frame.
+
+:introspection_mode:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "disabled"
+ ============== =============================
+
+ Description
+ The introspection mode for services and actions. Options are "disabled", "metadata", "contents".
+
+:behavior_plugins:
+
+ ============== ===============================================
+ Type Default
+ -------------- -----------------------------------------------
+ vector {"spin", "back_up", "drive_on_heading", "wait"}
+ ============== ===============================================
+
+ Description
+ List of plugin names to use, also matches action server names.
+
+ Note
+ Each plugin namespace defined in this list needs to have a :code:`plugin` parameter defining the type of plugin to be loaded in the namespace.
+
+ Example:
+
+ .. code-block:: yaml
+
+ behavior_server:
+ ros__parameters:
+ behavior_plugins: ["spin", "backup", "drive_on_heading", "wait"]
+ spin:
+ plugin: "nav2_behaviors::Spin" # In Iron and older versions, "/" was used instead of "::"
+ backup:
+ plugin: "nav2_behaviors::BackUp" # In Iron and older versions, "/" was used instead of "::"
+ drive_on_heading:
+ plugin: "nav2_behaviors::DriveOnHeading" # In Iron and older versions, "/" was used instead of "::"
+ wait:
+ plugin: "nav2_behaviors::Wait" # In Iron and older versions, "/" was used instead of "::"
+ ..
+
+Default Plugins
+***************
+.. note::
+ In Iron and older versions, "/" was used instead of "::".
+
+When the :code:`behavior_plugins` parameter is not overridden, the following default plugins are loaded:
+
+ ================== =====================================================
+ Namespace Plugin
+ ------------------ -----------------------------------------------------
+ "spin" "nav2_behaviors::Spin"
+ ------------------ -----------------------------------------------------
+ "backup" "nav2_behaviors::BackUp"
+ ------------------ -----------------------------------------------------
+ "drive_on_heading" "nav2_behaviors::DriveOnHeading"
+ ------------------ -----------------------------------------------------
+ "wait" "nav2_behaviors::Wait"
+ ================== =====================================================
+
+Spin Behavior Parameters
+************************
+
+Spin distance is given from the action request
+
+:simulate_ahead_time:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.0
+ ============== =============================
+
+ Description
+ Time to look ahead for collisions (s).
+
+:max_rotational_vel:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 1.0
+ ============== =============================
+
+ Description
+ Maximum rotational velocity (rad/s).
+
+:min_rotational_vel:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.4
+ ============== =============================
+
+ Description
+ Minimum rotational velocity (rad/s).
+
+:rotational_acc_lim:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 3.2
+ ============== =============================
+
+ Description
+ maximum rotational acceleration (rad/s^2).
+
+:enable_stamped_cmd_vel:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to use geometry_msgs::msg::Twist or geometry_msgs::msg::TwistStamped velocity data.
+ True uses TwistStamped, false uses Twist.
+ Note: This parameter is default ``false`` in Jazzy or older! Kilted or newer uses ``TwistStamped`` by default.
+
+
+BackUp Behavior Parameters
+**************************
+
+Backup distance, speed and time_allowance is given from the action request.
+
+:simulate_ahead_time:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.0
+ ============== =============================
+
+ Description
+ Time to look ahead for collisions (s).
+
+:enable_stamped_cmd_vel:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to use geometry_msgs::msg::Twist or geometry_msgs::msg::TwistStamped velocity data.
+ True uses TwistStamped, false uses Twist.
+ Note: This parameter is default ``false`` in Jazzy or older! Kilted or newer uses ``TwistStamped`` by default.
+
+:backup.acceleration_limit:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.5
+ ============== =============================
+
+ Description
+ Maximum acceleration limit (m/s^2). This parameter limits the rate at which speed increases when moving backward.
+
+:backup.deceleration_limit:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double -2.5
+ ============== =============================
+
+ Description
+ Maximum deceleration limit (m/s^2). Negative value. This parameter limits the rate at which speed decreases when moving backward.
+
+:backup.minimum_speed:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.10
+ ============== =============================
+
+ Description
+ Minimum speed to move, the deadband velocity of the robot behavior (m/s). Positive value.
+
+DriveOnHeading Behavior Parameters
+**********************************
+
+DriveOnHeading distance, speed and time_allowance is given from the action request.
+
+:simulate_ahead_time:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.0
+ ============== =============================
+
+ Description
+ Time to look ahead for collisions (s).
+
+:enable_stamped_cmd_vel:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to use geometry_msgs::msg::Twist or geometry_msgs::msg::TwistStamped velocity data.
+ True uses TwistStamped, false uses Twist.
+ Note: This parameter is default ``false`` in Jazzy or older! Kilted or newer uses ``TwistStamped`` by default.
+
+:bond_heartbeat_period:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.25
+ ============== =============================
+
+ Description
+ The lifecycle node bond mechanism publishing period (on the /bond topic). Disabled if inferior or equal to 0.0.
+
+:allow_parameter_qos_overrides:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to allow QoS profiles to be overwritten with parameterized values.
+
+:drive_on_heading.acceleration_limit:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.5
+ ============== =============================
+
+ Description
+ Maximum acceleration limit (m/s^2).
+
+:drive_on_heading.deceleration_limit:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double -2.5
+ ============== =============================
+
+ Description
+ Maximum deceleration limit (m/s^2). Negative value.
+
+:drive_on_heading.minimum_speed:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.10
+ ============== =============================
+
+ Description
+ Minimum speed to move, the deadband velocity of the robot behavior (m/s). Positive value.
+
+AssistedTeleop Behavior Parameters
+**********************************
+
+AssistedTeleop time_allowance is given in the action request
+
+:projection_time:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 1.0
+ ============== =============================
+
+ Description
+ Time to look ahead for collisions (s).
+
+:simulation_time_step:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.1
+ ============== =============================
+
+ Description
+ Time step for projections (s).
+
+:cmd_vel_teleop:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string cmd_vel_teleop
+ ============== =============================
+
+ Description
+ Topic to listen for teleop messages.
+
+:enable_stamped_cmd_vel:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to use geometry_msgs::msg::Twist or geometry_msgs::msg::TwistStamped velocity data.
+ True uses TwistStamped, false uses Twist.
+ Note: This parameter is default ``false`` in Jazzy or older! Kilted or newer uses ``TwistStamped`` by default.
+
+Example
+*******
+.. code-block:: yaml
+
+ behavior_server:
+ ros__parameters:
+ local_costmap_topic: local_costmap/costmap_raw
+ local_footprint_topic: local_costmap/published_footprint
+ global_costmap_topic: global_costmap/costmap_raw
+ global_footprint_topic: global_costmap/published_footprint
+ cycle_frequency: 10.0
+ behavior_plugins: ["spin", "backup", "drive_on_heading", "wait", "assisted_teleop"]
+ spin:
+ plugin: "nav2_behaviors::Spin" # In Iron and older versions, "/" was used instead of "::"
+ backup:
+ plugin: "nav2_behaviors::BackUp" # In Iron and older versions, "/" was used instead of "::"
+ drive_on_heading:
+ plugin: "nav2_behaviors::DriveOnHeading" # In Iron and older versions, "/" was used instead of "::"
+ wait:
+ plugin: "nav2_behaviors::Wait" # In Iron and older versions, "/" was used instead of "::"
+ assisted_teleop:
+ plugin: "nav2_behaviors::AssistedTeleop" # In Iron and older versions, "/" was used instead of "::"
+ local_frame: odom
+ global_frame: map
+ robot_base_frame: base_link
+ transform_tolerance: 0.1
+ simulate_ahead_time: 2.0
+ max_rotational_vel: 1.0
+ min_rotational_vel: 0.4
+ rotational_acc_lim: 3.2
+ enable_stamped_cmd_vel: true # default false in Jazzy or older
diff --git a/configuration/packages/configuring-bt-navigator.rst b/configuration/packages/configuring-bt-navigator.rst
new file mode 100644
index 0000000000..9e65f53d8c
--- /dev/null
+++ b/configuration/packages/configuring-bt-navigator.rst
@@ -0,0 +1,515 @@
+.. _configuring_bt_navigator:
+
+Behavior-Tree Navigator
+#######################
+
+Source code on Github_.
+
+.. _Github: https://github.com/ros-navigation/navigation2/tree/main/nav2_bt_navigator
+
+The BT Navigator (Behavior Tree Navigator) module implements the NavigateToPose, NavigateThroughPoses, and other task interfaces.
+It is a Behavior Tree-based implementation of navigation that is intended to allow for flexibility
+in the navigation task and provide a way to easily specify complex robot behaviors, including recovery.
+
+Consider checking out the :ref:`using_groot` tutorial for using Groot to visualize and modify behavior trees.
+
+Make sure to review all parameters for non-default navigator plugins not discussed on this page (e.g. ``CoverageNavigator`` or custom additions).
+
+Parameters
+**********
+
+:navigators:
+
+ ============== ============================================================
+ Type Default
+ -------------- ------------------------------------------------------------
+ vector {'navigate_to_pose', 'navigate_through_poses'}
+ ============== ============================================================
+
+ Description
+ New to Iron: Plugins for navigator types implementing the ``nav2_core::BehaviorTreeNavigator`` interface.
+ They implement custom action servers with custom interface definitions and use that data to populate and process behavior tree navigation requests. Plugin classes are defined under the same namespace, see examples below. Defaults correspond to the ``NavigateToPoseNavigator`` and ``NavigateThroughPosesNavigator`` navigators.
+
+:default_nav_to_pose_bt_xml:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Path to the default behavior tree XML description for ``NavigateToPose``, see :ref:`configuring_behavior_tree_xml` for details on this file.
+ This parameter used to be ``default_bt_xml_filename`` pre-Galactic.
+ You can use substitution to specify file path like ``$(find-pkg-share my_package)/behavior_tree/my_nav_to_pose_bt.xml``. However, if left empty, the default behavior tree XML will be loaded from the ``nav2_bt_navigator`` package.
+
+
+:default_nav_through_poses_bt_xml:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string N/A
+ ====== =======
+
+ Description
+ Path to the default behavior tree XML description for ``NavigateThroughPoses``, see :ref:`configuring_behavior_tree_xml` for details on this file. New to Galactic after ``NavigateThroughPoses`` was added.
+ You can use substitution to specify file path like ``$(find-pkg-share my_package)/behavior_tree/my_nav_through_poses_bt.xml``. However, if left empty, the default behavior tree XML will be loaded from the ``nav2_bt_navigator`` package.
+
+
+:always_reload_bt_xml:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool false
+ ====== =======
+
+ Description
+ Always load the requested behavior tree XML description, regardless of the name of the currently active XML.
+
+:bt_log_idle_transitions:
+
+ ====== =======
+ Type Default
+ ------ -------
+ bool true
+ ====== =======
+
+ Description
+ Whether to log idle (no state change) transitions in the behavior tree to the ``/behavior_tree_log`` topic and console output. When ``false``, only state changes are logged, reducing topic and console noise. When ``true`` (default), all tick transitions including idle ones are published.
+
+:plugin_lib_names:
+
+ ============== ==========================================================
+ Type Default
+ -------------- ----------------------------------------------------------
+ vector [""]
+ ============== ==========================================================
+
+ Description
+ List of behavior tree node shared libraries. All Nav2 BT libraries are automatically included for you, so this only needs to include your new custom plugins (new to Jazzy).
+
+:bt_loop_duration:
+
+ ==== =======
+ Type Default
+ ---- -------
+ int 10
+ ==== =======
+
+ Description
+ Duration (in milliseconds) for each iteration of BT execution.
+
+:filter_duration:
+
+ ====== =======
+ Type Default
+ ------ -------
+ double 0.3
+ ====== =======
+
+ Description
+ Duration (secs) over which robot velocity should be smoothed.
+
+:default_server_timeout:
+
+ ==== =======
+ Type Default
+ ---- -------
+ int 20
+ ==== =======
+
+ Description
+ Default timeout value (in milliseconds) for a BT action node to wait for acknowledgement from an action server.
+ This value will be overwritten for a BT node if the input port "server_timeout" is provided.
+
+:default_cancel_timeout:
+
+ ==== =======
+ Type Default
+ ---- -------
+ int 50
+ ==== =======
+
+ Description
+ Default timeout (in milliseconds) for BT action node cancellation requests during node halt.
+ This value will be overwritten for a BT node if the input port "cancel_timeout" is provided.
+
+:wait_for_service_timeout:
+
+ ==== =======
+ Type Default
+ ---- -------
+ int 1000
+ ==== =======
+
+ Description
+ Default timeout value (in milliseconds) for an Action or Service BT nodes to wait for acknowledgement from an service or action server on BT initialization (e.g. ``wait_for_action_server(timeout)``).
+ This value will be overwritten for a BT node if the input port "wait_for_service_timeout" is provided.
+
+:introspection_mode:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "disabled"
+ ============== =============================
+
+ Description
+ The introspection mode for services and actions. Options are "disabled", "metadata", "contents".
+
+:transform_tolerance:
+
+ ====== ======= =======
+ Type Default Unit
+ ------ ------- -------
+ double 0.1 seconds
+ ====== ======= =======
+
+ Description
+ TF transform tolerance.
+
+:global_frame:
+
+ ====== ========
+ Type Default
+ ------ --------
+ string map
+ ====== ========
+
+ Description
+ Reference frame.
+
+:robot_base_frame:
+
+ ====== =========
+ Type Default
+ ------ ---------
+ string base_link
+ ====== =========
+
+ Description
+ Robot base frame.
+
+:odom_topic:
+
+ ====== =========
+ Type Default
+ ------ ---------
+ string odom
+ ====== =========
+
+ Description
+ Topic on which odometry is published
+
+:error_code_name_prefixes:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ vector ["assisted_teleop",
+ "backup",
+ "compute_path",
+ "dock_robot",
+ "drive_on_heading",
+ "follow_path",
+ "nav_thru_poses",
+ "nav_to_pose",
+ "spin",
+ "route",
+ "undock_robot",
+ "wait"]
+ ============== ===========================
+
+ Description
+ For Kilted and newer: List of of error code name prefixes to be appended with '_error_code' and '_error_msg' and searched for during aborted navigator error processing.
+
+:error_code_names:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ vector ["compute_path_error_code",
+ "follow_path_error_code"]
+ ============== ===========================
+
+ Description
+ For Jazzy and older: List of of error codes to compare.
+
+:bond_heartbeat_period:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.25
+ ============== =============================
+
+ Description
+ The lifecycle node bond mechanism publishing period (on the /bond topic). Disabled if inferior or equal to 0.0.
+
+:allow_parameter_qos_overrides:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to allow QoS profiles to be overwritten with parameterized values.
+
+:bt_search_directories:
+
+ ============== ==================================================
+ Type Default
+ -------------- --------------------------------------------------
+ vector $(find-pkg-share nav2_bt_navigator)/behavior_trees
+ ============== ==================================================
+
+ Description
+ List of directories that hosts behavior trees XML files. Used to register all behavior trees and subtrees.
+
+:allow_navigator_preemption:
+
+ ============== ==================================================
+ Type Default
+ -------------- --------------------------------------------------
+ bool false
+ ============== ==================================================
+
+ Description
+ Controls whether a new navigation goal can preempt a currently active navigator. If set to false, if a navigator is already running and a new goal arrives for a different navigator, the new goal is rejected. If set to true, the new goal signals the active navigator to stop, waits for it to finish, then hands control over to the new navigator.
+
+:navigator_preemption_timeout:
+
+ ============== ==================================================
+ Type Default
+ -------------- --------------------------------------------------
+ int 500
+ ============== ==================================================
+
+ Description
+ Only relevant when ``allow_navigator_preemption`` is true. Sets the maximum time (in ms) to wait for the currently active navigator to stop. If the active navigator doesn't finish within this timeout, the new goal is rejected.
+
+NavigateToPose Parameters
+*************************
+
+:````.goal_blackboard_id:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string "goal"
+ ====== =======
+
+ Description
+ Blackboard variable to use to supply the goal to the behavior tree for ``NavigateToPose``. Should match ports of BT XML file.
+
+:````.path_blackboard_id:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string "path"
+ ====== =======
+
+ Description
+ Blackboard variable to get the path from the behavior tree for ``NavigateToPose`` feedback. Should match port names of BT XML file.
+
+:````.tracking_feedback_blackboard_id:
+
+ ====== ===================
+ Type Default
+ ------ -------------------
+ string "tracking_feedback"
+ ====== ===================
+
+ Description
+ Blackboard variable to get the tracking feedback from the behavior tree for ``NavigateToPose`` feedback. Should match port names of BT XML file.
+
+:````.enable_groot_monitoring:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool False
+ ============== =======
+
+ Description
+ Whether to enable Groot2 monitoring for this navigator.
+
+:````.groot_server_port:
+
+ ==== =======
+ Type Default
+ ---- -------
+ int 1667
+ ==== =======
+
+ Description
+ The port number for the Groot2 server. Note: In Groot2, you only need to specify the server port value, not the publisher port, as it is always the server port +1. Therefore, in this case, to use another navigator, the next available port would be 1669.
+
+:````.search_window:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.0
+ ============== =============================
+
+ Description
+ How far (in meters) along the path the searching algorithm will look for the closest point.
+
+NavigateThroughPoses Parameters
+*******************************
+
+:````.goals_blackboard_id:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string "goals"
+ ====== =======
+
+ Description
+ Blackboard variable to use to supply the goals to the behavior tree for ``NavigateThroughPoses``. Should match ports of BT XML file.
+
+:````.path_blackboard_id:
+
+ ====== =======
+ Type Default
+ ------ -------
+ string "path"
+ ====== =======
+
+ Description
+ Blackboard variable to get the path from the behavior tree for ``NavigateThroughPoses`` feedback. Should match port names of BT XML file.
+
+:````.tracking_feedback_blackboard_id:
+
+ ====== ===================
+ Type Default
+ ------ -------------------
+ string "tracking_feedback"
+ ====== ===================
+
+ Description
+ Blackboard variable to get the tracking feedback from the behavior tree for ``NavigateThroughPoses`` feedback. Should match port names of BT XML file.
+
+:````.waypoint_statuses_blackboard_id:
+
+ ====== ===================
+ Type Default
+ ------ -------------------
+ string "waypoint_statuses"
+ ====== ===================
+
+ Description
+ Blackboard variable to get the statuses of waypoints from the behavior tree for ``NavigateThroughPoses`` feedback/result. Should match ports of BT XML file.
+
+:````.enable_groot_monitoring:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool False
+ ============== =======
+
+ Description
+ Whether to enable Groot2 monitoring for this navigator.
+
+:````.groot_server_port:
+
+ ==== =======
+ Type Default
+ ---- -------
+ int 1669
+ ==== =======
+
+ Description
+ The port number for the Groot2 server. Note: In Groot2, you only need to specify the server port value, not the publisher port, as it is always the server port +1. Therefore, in this case, to use another navigator, the next available port would be 1671.
+
+:````.search_window:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.0
+ ============== =============================
+
+ Description
+ How far (in meters) along the path the searching algorithm will look for the closest point.
+
+Example
+*******
+.. code-block:: yaml
+
+ bt_navigator:
+ ros__parameters:
+ global_frame: map
+ robot_base_frame: base_link
+ transform_tolerance: 0.1
+ filter_duration: 0.3
+ default_server_timeout: 20
+ default_cancel_timeout: 50
+ introspection_mode: "disabled"
+ default_nav_to_pose_bt_xml: replace/with/path/to/bt.xml # or $(find-pkg-share my_package)/behavior_tree/my_nav_to_pose_bt.xml
+ default_nav_through_poses_bt_xml: replace/with/path/to/bt.xml # or $(find-pkg-share my_package)/behavior_tree/my_nav_through_poses_bt.xml
+ always_reload_bt_xml: false
+ bt_log_idle_transitions: true
+ goal_blackboard_id: goal
+ goals_blackboard_id: goals
+ path_blackboard_id: path
+ waypoint_statuses_blackboard_id: waypoint_statuses
+ navigators: ['navigate_to_pose', 'navigate_through_poses']
+ bt_search_directories:
+ - $(find-pkg-share nav2_bt_navigator)/behavior_trees
+ navigate_to_pose:
+ plugin: "nav2_bt_navigator::NavigateToPoseNavigator" # In Iron and older versions, "/" was used instead of "::"
+ enable_groot_monitoring: false
+ groot_server_port: 1667
+ search_window: 2.0
+ navigate_through_poses:
+ plugin: "nav2_bt_navigator::NavigateThroughPosesNavigator" # In Iron and older versions, "/" was used instead of "::"
+ enable_groot_monitoring: false
+ groot_server_port: 1669
+ search_window: 2.0
+ plugin_lib_names:
+ - nav2_compute_path_to_pose_action_bt_node
+ - nav2_follow_path_action_bt_node
+ - nav2_back_up_action_bt_node
+ - nav2_spin_action_bt_node
+ - nav2_wait_action_bt_node
+ - nav2_clear_costmap_service_bt_node
+ - nav2_is_stuck_condition_bt_node
+ - nav2_is_stopped_condition_bt_node
+ - nav2_goal_reached_condition_bt_node
+ - nav2_initial_pose_received_condition_bt_node
+ - nav2_goal_updated_condition_bt_node
+ - nav2_reinitialize_global_localization_service_bt_node
+ - nav2_rate_controller_bt_node
+ - nav2_distance_controller_bt_node
+ - nav2_speed_controller_bt_node
+ - nav2_recovery_node_bt_node
+ - nav2_pipeline_sequence_bt_node
+ - nav2_persistent_sequence_bt_node
+ - nav2_pause_resume_controller_bt_node
+ - nav2_round_robin_node_bt_node
+ - nav2_transform_available_condition_bt_node
+ - nav2_time_expired_condition_bt_node
+ - nav2_distance_traveled_condition_bt_node
+ - nav2_single_trigger_bt_node
+ error_code_name_prefixes:
+ - assisted_teleop
+ - backup
+ - compute_path
+ - dock_robot
+ - drive_on_heading
+ - follow_path
+ - nav_thru_poses
+ - nav_to_pose
+ - spin
+ - route
+ - undock_robot
+ - wait
diff --git a/configuration/packages/configuring-bt-xml.rst b/configuration/packages/configuring-bt-xml.rst
new file mode 100644
index 0000000000..4c52b98060
--- /dev/null
+++ b/configuration/packages/configuring-bt-xml.rst
@@ -0,0 +1,170 @@
+.. _configuring_behavior_tree_xml:
+
+Behavior Tree XML Nodes
+#######################
+
+The nav2_behavior_tree_ package provides several navigation-specific nodes that are pre-registered and can be included in Behavior Trees.
+
+.. _nav2_behavior_tree: https://github.com/ros-navigation/navigation2/tree/main/nav2_behavior_tree
+
+Check this introduction_ to learn how behavior trees work and the difference between actions, conditions, controls and decorators.
+
+.. _introduction: https://www.behaviortree.dev/docs/learn-the-basics/BT_basics
+
+Consider checking out the :ref:`using_groot` tutorial for using Groot to visualize and modify behavior trees.
+
+Action Plugins
+**************
+
+.. toctree::
+ :maxdepth: 1
+
+ bt-plugins/actions/Wait.rst
+ bt-plugins/actions/Spin.rst
+ bt-plugins/actions/BackUp.rst
+ bt-plugins/actions/DriveOnHeading.rst
+ bt-plugins/actions/AssistedTeleop.rst
+ bt-plugins/actions/ComputePathToPose.rst
+ bt-plugins/actions/ComputeRoute.rst
+ bt-plugins/actions/ComputeAndTrackRoute.rst
+ bt-plugins/actions/FollowPath.rst
+ bt-plugins/actions/NavigateToPose.rst
+ bt-plugins/actions/ClearEntireCostmap.rst
+ bt-plugins/actions/ClearCostmapExceptRegion.rst
+ bt-plugins/actions/ClearCostmapAroundRobot.rst
+ bt-plugins/actions/ClearCostmapAroundPose.rst
+ bt-plugins/actions/ReinitializeGlobalLocalization.rst
+ bt-plugins/actions/TruncatePath.rst
+ bt-plugins/actions/TruncatePathLocal.rst
+ bt-plugins/actions/PlannerSelector.rst
+ bt-plugins/actions/ControllerSelector.rst
+ bt-plugins/actions/SmootherSelector.rst
+ bt-plugins/actions/GoalCheckerSelector.rst
+ bt-plugins/actions/ProgressCheckerSelector.rst
+ bt-plugins/actions/PathHandlerSelector.rst
+ bt-plugins/actions/NavigateThroughPoses.rst
+ bt-plugins/actions/ComputePathThroughPoses.rst
+ bt-plugins/actions/ComputeCoveragePath.rst
+ bt-plugins/actions/CancelCoverage.rst
+ bt-plugins/actions/RemovePassedGoals.rst
+ bt-plugins/actions/RemoveInCollisionGoals.rst
+ bt-plugins/actions/CancelControl.rst
+ bt-plugins/actions/CancelBackUp.rst
+ bt-plugins/actions/CancelSpin.rst
+ bt-plugins/actions/CancelWait.rst
+ bt-plugins/actions/CancelDriveOnHeading.rst
+ bt-plugins/actions/CancelAssistedTeleop.rst
+ bt-plugins/actions/CancelComputeAndTrackRoute.rst
+ bt-plugins/actions/Smooth.rst
+ bt-plugins/actions/GetPoseFromPath.rst
+ bt-plugins/actions/DockRobot.rst
+ bt-plugins/actions/UndockRobot.rst
+ bt-plugins/actions/ConcatenatePaths.rst
+ bt-plugins/actions/GetCurrentPose.rst
+ bt-plugins/actions/AppendGoalPoseToGoals.rst
+ bt-plugins/actions/ExtractRouteNodesAsGoals.rst
+ bt-plugins/actions/GetNextFewGoals.rst
+ bt-plugins/actions/ToggleCollisionMonitor.rst
+ bt-plugins/actions/FollowObject.rst
+ bt-plugins/actions/CancelFollowObject.rst
+ bt-plugins/actions/ValidatePath.rst
+ bt-plugins/actions/CheckPoseOccupancy.rst
+ bt-plugins/actions/CheckStopStatus.rst
+
+Condition Plugins
+*****************
+
+.. toctree::
+ :maxdepth: 1
+
+ bt-plugins/conditions/GoalReached.rst
+ bt-plugins/conditions/TransformAvailable.rst
+ bt-plugins/conditions/DistanceTraveled.rst
+ bt-plugins/conditions/GoalUpdated.rst
+ bt-plugins/conditions/GlobalUpdatedGoal.rst
+ bt-plugins/conditions/InitialPoseReceived.rst
+ bt-plugins/conditions/IsGoalNearby.rst
+ bt-plugins/conditions/IsStuck.rst
+ bt-plugins/conditions/TimeExpired.rst
+ bt-plugins/conditions/IsBatteryLow.rst
+ bt-plugins/conditions/IsWithinPathTrackingBounds.rst
+ bt-plugins/conditions/PathExpiringTimer.rst
+ bt-plugins/conditions/AreErrorCodesPresent.rst
+ bt-plugins/conditions/WouldAControllerRecoveryHelp.rst
+ bt-plugins/conditions/WouldAPlannerRecoveryHelp.rst
+ bt-plugins/conditions/WouldASmootherRecoveryHelp.rst
+ bt-plugins/conditions/WouldARouteRecoveryHelp.rst
+ bt-plugins/conditions/IsBatteryCharging.rst
+ bt-plugins/conditions/ArePosesNear.rst
+
+Control Plugins
+***************
+
+.. toctree::
+ :maxdepth: 1
+
+ bt-plugins/controls/PipelineSequence.rst
+ bt-plugins/controls/RoundRobin.rst
+ bt-plugins/controls/RecoveryNode.rst
+ bt-plugins/controls/NonblockingSequence.rst
+ bt-plugins/controls/PersistentSequence.rst
+ bt-plugins/controls/PauseResumeController.rst
+
+Decorator Plugins
+*****************
+
+.. toctree::
+ :maxdepth: 1
+
+ bt-plugins/decorators/RateController.rst
+ bt-plugins/decorators/DistanceController.rst
+ bt-plugins/decorators/SpeedController.rst
+ bt-plugins/decorators/GoalUpdater.rst
+ bt-plugins/decorators/PathLongerOnApproach.rst
+ bt-plugins/decorators/SingleTrigger.rst
+ bt-plugins/decorators/GoalUpdatedController.rst
+
+Example
+*******
+
+This Behavior Tree replans the global path periodically at 1 Hz and it also has
+recovery actions.
+
+.. code-block:: xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/configuration/packages/configuring-collision-monitor.rst b/configuration/packages/configuring-collision-monitor.rst
new file mode 100644
index 0000000000..c4e3300b22
--- /dev/null
+++ b/configuration/packages/configuring-collision-monitor.rst
@@ -0,0 +1,22 @@
+.. _configuring_collision_monitor:
+
+Collision Monitor
+#################
+
+Source code and ``README`` with design, explanations, and metrics can be found on Github_.
+
+.. _Github: https://github.com/ros-navigation/navigation2/tree/main/nav2_collision_monitor
+
+The ``nav2_collision_monitor`` package contains nodes providing an additional level of robot safety, namely the Collision Monitor and the Collision Detector.
+The Collision Monitor is a node providing an additional level of robot safety. It performs several collision avoidance related tasks using incoming data from the sensors, bypassing the costmap and trajectory planners, to monitor for and prevent potential collisions at the emergency-stop level.
+The Collision Detector works similarly to the Collision Monitor, but does not affect the robot's velocity. It will only inform that data from the configured sources has been detected within the configured polygons via a message to a topic.
+
+Provided Nodes
+****************
+The nodes listed below are inside the ``nav2_collision_monitor`` package. See the pages for individual configuration information.
+
+.. toctree::
+ :maxdepth: 1
+
+ collision_monitor/configuring-collision-monitor-node.rst
+ collision_monitor/configuring-collision-detector-node.rst
diff --git a/configuration/packages/configuring-constrained-smoother.rst b/configuration/packages/configuring-constrained-smoother.rst
new file mode 100644
index 0000000000..185df1977f
--- /dev/null
+++ b/configuration/packages/configuring-constrained-smoother.rst
@@ -0,0 +1,289 @@
+.. _configuring_constrained_smoother:
+
+Constrained smoother
+####################
+
+Source code on Github_.
+
+.. _Github: https://github.com/ros-navigation/navigation2/tree/main/nav2_constrained_smoother
+
+.. _`RoboTech Vision`: https://robotechvision.com/
+
+A smoother plugin for nav2_smoother based on the original deprecated smoother in nav2_smac_planner and put into operational state by `RoboTech Vision`_.
+Suitable for applications which need planned global path to be pushed away from obstacles and/or for Reeds-Shepp motion models. It optimizes for path length, smoothness, distance from obstacles, and curvature in a large Ceres-based optimization program.
+
+.. _`TruncatePathLocal BT Node`: bt-plugins/actions/TruncatePathLocal.html
+
+Important note: Constrained smoother uses a rather heavy optimization algorithm and thus is suggested to be used on a periodically truncated path.
+`TruncatePathLocal BT Node`_ can be used for achieving a proper path length and DistanceController BT Node can be used for achieving periodicity.
+
+Following image depicts how Constrained Smoother can improve quality of an input path (cyan, generated by an outdated version of Smac Planner, intentionally not configured optimally to highlight the power of the smoother),
+increasing its smoothness and distance from obstacles. Resulting path is marked by green color. Note: last few path poses are not smoothed since TruncatePathLocal is used on this path.
+
+.. image:: images/constrained_smoother/constrained_smoother.png
+ :height: 593px
+ :width: 698px
+ :align: center
+
+Smoother Server Parameters
+**************************
+
+:reversing_enabled:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ bool true
+ ============== ===========================
+
+ Description
+ Whether to detect forward/reverse direction and cusps. Should be set to false for paths without orientations assigned
+
+:path_downsampling_factor:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ int 1
+ ============== ===========================
+
+ Description
+ Every n-th node of the path is taken for optimization. Useful for speed-up
+
+:path_upsampling_factor:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ int 1
+ ============== ===========================
+
+ Description
+ Upsampling factor for refining. 0 - path remains downsampled (see ``path_downsampling_factor``), 1 - path is upsampled back to original granularity using cubic bezier, 2... - more upsampling
+
+:keep_start_orientation:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ bool true
+ ============== ===========================
+
+ Description
+ Whether to prevent the start orientation from being smoothed
+
+:keep_goal_orientation:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ bool true
+ ============== ===========================
+
+ Description
+ Whether to prevent the goal orientation from being smoothed
+
+:minimum_turning_radius:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ double 0.4
+ ============== ===========================
+
+ Description
+ Minimum turning radius the robot can perform. Can be set to 0.0 (or w_curve can be set to 0.0 with the same effect) for diff-drive/holonomic robots
+
+:w_curve:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ double 30.0
+ ============== ===========================
+
+ Description
+ Weight to enforce minimum_turning_radius
+
+:w_dist:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ double 0.0
+ ============== ===========================
+
+ Description
+ Weight to bind path to original as optional replacement for cost weight
+
+:w_smooth:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ double 2000000.0
+ ============== ===========================
+
+ Description
+ Weight to maximize smoothness of path
+
+:w_cost:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ double 0.015
+ ============== ===========================
+
+ Description
+ Weight to steer robot away from collision and cost
+
+:w_cost_cusp_multiplier:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ double 3.0
+ ============== ===========================
+
+ Description
+ Option to use higher weight during forward/reverse direction change, helping optimizer to converge or add an extra obstacle avoidance at these problematic segments.
+ Following image depicts improvement of the path with ``w_cost_cusp_multiplier`` (green) compared to one without it (purple). Original path has cyan color.
+
+ .. image:: images/constrained_smoother/w_cost_cusp_multiplier.png
+ :height: 429px
+ :width: 282px
+ :align: center
+
+:cusp_zone_length:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ double 2.5
+ ============== ===========================
+
+ Description
+ Length of the section around cusp in which nodes use ``w_cost_cusp_multiplier`` (w_cost rises gradually inside the zone towards the cusp point, whose costmap weight eqals w_cost*w_cost_cusp_multiplier)
+
+:cost_check_points:
+
+ =============== ===========================
+ Type Default
+ --------------- ---------------------------
+ array of double []
+ =============== ===========================
+
+ Description
+ Points in robot frame to grab costmap values from. Format: [x1, y1, weight1, x2, y2, weight2, ...].
+
+ IMPORTANT: Requires much higher number of optimizer iterations to actually improve the path. Use only if you really need it (highly elongated/asymmetric robots)
+
+ Following image depicts how two cost check points can be used to improve cost awareness of a rectangular robot.
+
+ .. image:: images/constrained_smoother/cost_check_points.png
+ :height: 284px
+ :width: 176px
+ :align: center
+
+:optimizer.max_iterations:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ int 100
+ ============== ===========================
+
+ Description
+ Maximum number of optimizer iterations
+
+:optimizer.debug_optimizer:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ bool false
+ ============== ===========================
+
+ Description
+ Whether to print optimizer debug info
+
+:optimizer.linear_solver_type:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ string "SPARSE_NORMAL_CHOLESKY"
+ ============== ===========================
+
+ Description
+ Linear solver type to be used by optimizer. Valid values are ``SPARSE_NORMAL_CHOLESKY`` and ``DENSE_QR``
+
+:optimizer.gradient_tol:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ bool 1e-10
+ ============== ===========================
+
+ Description
+ Gradient tolerance optimization termination criterion
+
+:optimizer.fn_tol:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ bool 1e-7
+ ============== ===========================
+
+ Description
+ Function tolerance optimization termination criterion
+
+:optimizer.param_tol:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ bool 1e-15
+ ============== ===========================
+
+ Description
+ Parameter tolerance optimization termination criterion
+
+Example
+*******
+.. code-block:: yaml
+
+ smoother_server:
+ ros__parameters:
+ smoother_plugins: ["SmoothPath"]
+
+ SmoothPath:
+ plugin: "nav2_constrained_smoother/ConstrainedSmoother"
+ reversing_enabled: true # whether to detect forward/reverse direction and cusps. Should be set to false for paths without orientations assigned
+ path_downsampling_factor: 3 # every n-th node of the path is taken. Useful for speed-up
+ path_upsampling_factor: 1 # 0 - path remains downsampled, 1 - path is upsampled back to original granularity using cubic bezier, 2... - more upsampling
+ keep_start_orientation: true # whether to prevent the start orientation from being smoothed
+ keep_goal_orientation: true # whether to prevent the gpal orientation from being smoothed
+ minimum_turning_radius: 0.40 # minimum turning radius the robot can perform. Can be set to 0.0 (or w_curve can be set to 0.0 with the same effect) for diff-drive/holonomic robots
+ w_curve: 0.5 # weight to enforce minimum_turning_radius
+ w_dist: 0.0 # weight to bind path to original as optional replacement for cost weight
+ w_smooth: 3.0e+3 # weight to maximize smoothness of path
+ w_cost: 0.000045 # weight to steer robot away from collision and cost
+
+ # Parameters used to improve obstacle avoidance near cusps (forward/reverse movement changes)
+ w_cost_cusp_multiplier: 3.0 # option to use higher weight during forward/reverse direction change which is often accompanied with dangerous rotations
+ cusp_zone_length: 2.5 # length of the section around cusp in which nodes use w_cost_cusp_multiplier (w_cost rises gradually inside the zone towards the cusp point, whose costmap weight eqals w_cost*w_cost_cusp_multiplier)
+
+ # Points in robot frame to grab costmap values from. Format: [x1, y1, weight1, x2, y2, weight2, ...]
+ # IMPORTANT: Requires much higher number of iterations to actually improve the path. Uncomment only if you really need it (highly elongated/asymmetric robots)
+ # cost_check_points: [-0.185, 0.0, 1.0]
+
+ optimizer:
+ max_iterations: 70 # max iterations of smoother
+ debug_optimizer: false # print debug info
+ gradient_tol: 50.0
+ fn_tol: 1.0e-15
+ param_tol: 1.0e-20
diff --git a/configuration/packages/configuring-controller-server.rst b/configuration/packages/configuring-controller-server.rst
new file mode 100644
index 0000000000..83993a1302
--- /dev/null
+++ b/configuration/packages/configuring-controller-server.rst
@@ -0,0 +1,369 @@
+.. _configuring_controller_server:
+
+Controller Server
+#################
+
+Source code on Github_.
+
+.. _Github: https://github.com/ros-navigation/navigation2/tree/main/nav2_controller
+
+The Controller Server implements the server for handling the controller requests for the stack and host a map of plugin implementations.
+It will take in path and plugin names for controller, progress checker and goal checker to use and call the appropriate plugins.
+It also hosts the local costmap.
+
+Parameters
+**********
+
+:controller_frequency:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 20.0
+ ============== =======
+
+ Description
+ Frequency to run controller (Hz).
+
+:costmap_update_timeout:
+
+ ============== ========
+ Type Default
+ -------------- --------
+ double 0.3
+ ============== ========
+
+ Description
+ The timeout value (seconds) for the costmap to be fully updated before a control effort can be computed.
+
+:use_realtime_priority:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool false
+ ============== =======
+
+ Description
+ Adds soft real-time prioritization to the controller server to better ensure resources to time sensitive portions of the codebase. This will set the controller's execution thread to a higher priority than the rest of the system (``90``) to meet scheduling deadlines to have less missed loop rates. To use this feature, you use set the following inside of ``/etc/security/limits.conf`` to give userspace access to elevated prioritization permissions: `` soft rtprio 99 hard rtprio 99``
+
+:publish_zero_velocity:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool true
+ ============== =======
+
+ Description
+ Whether to publish a zero velocity command on goal exit. This is useful for stopping the robot when a goal terminates.
+
+:controller_plugins:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ vector ['FollowPath']
+ ============== ==============
+
+ Description
+ List of mapped names for controller plugins for processing requests and parameters.
+
+ Note
+ Each plugin namespace defined in this list needs to have a :code:`plugin` parameter defining the type of plugin to be loaded in the namespace.
+
+ Example:
+
+ .. code-block:: yaml
+
+ controller_server:
+ ros__parameters:
+ controller_plugins: ["FollowPath"]
+ FollowPath:
+ plugin: "dwb_core::DWBLocalPlanner"
+ ..
+
+:progress_checker_plugins:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ vector ["progress_checker"]
+ ============== ==============
+
+ Description
+ Mapped name for progress checker plugin for checking progress made by robot. Formerly ``progress_checker_plugin`` for Humble and older with a single string plugin.
+
+ Note
+ The plugin namespace defined needs to have a :code:`plugin` parameter defining the type of plugin to be loaded in the namespace.
+
+ Example:
+
+ .. code-block:: yaml
+
+ controller_server:
+ ros__parameters:
+ progress_checker_plugins: ["progress_checker"] # progress_checker_plugin: "progress_checker" For Humble and older
+ progress_checker:
+ plugin: "nav2_controller::SimpleProgressChecker"
+ ..
+
+:goal_checker_plugins:
+
+ ============== ================
+ Type Default
+ -------------- ----------------
+ vector ["goal_checker"]
+ ============== ================
+
+ Description
+ Mapped name for goal checker plugin for checking goal is reached. When the number of the plugins is more than 2, each :code:`FollowPath` action needs to specify the goal checker plugin name with its :code:`goal_checker_id` field.
+
+ Note
+ The plugin namespace defined needs to have a :code:`plugin` parameter defining the type of plugin to be loaded in the namespace.
+
+ Example:
+
+ .. code-block:: yaml
+
+ controller_server:
+ ros__parameters:
+ goal_checker_plugins: ["goal_checker"]
+ goal_checker:
+ plugin: "nav2_controller::SimpleGoalChecker"
+
+:path_handler_plugins:
+
+ ============== ================
+ Type Default
+ -------------- ----------------
+ vector ["PathHandler"]
+ ============== ================
+
+ Description
+ Mapped name for path handler plugin for processing path from the planner. When the number of the plugins is more than 2, each :code:`FollowPath` action needs to specify the path handler plugin name with its :code:`path_handler_id` field.
+
+ Note
+ The plugin namespace defined needs to have a :code:`plugin` parameter defining the type of plugin to be loaded in the namespace.
+
+ Example:
+
+ .. code-block:: yaml
+
+ controller_server:
+ ros__parameters:
+ path_handler_plugins: ["PathHandler"]
+ path_handler:
+ plugin: "nav2_controller::FeasiblePathHandler"
+
+
+:min_x_velocity_threshold:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.0001
+ ============== =============================
+
+ Description
+ The controller server filters the velocity portion of the odometry messages received before sending them to the controller plugin.
+ Odometry values below this threshold (in m/s) will be set to 0.0.
+
+:min_y_velocity_threshold:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.0001
+ ============== =============================
+
+ Description
+ The controller server filters the velocity portion of the odometry messages received before sending them to the controller plugin.
+ Odometry values below this threshold (in m/s) will be set to 0.0. For non-holonomic robots
+
+:min_theta_velocity_threshold:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.0001
+ ============== =============================
+
+ Description
+ The controller server filters the velocity portion of the odometry messages received before sending them to the controller plugin.
+ Odometry values below this threshold (in rad/s) will be set to 0.0.
+
+:failure_tolerance:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.0
+ ============== =============================
+
+ Description
+ The maximum duration in seconds the called controller plugin can fail (i.e. the :code:`computeVelocityCommands` function of the plugin throwing an exception) before the :code:`nav2_msgs::action::FollowPath` action fails.
+ Setting it to the special value of -1.0 makes it infinite, 0 to disable, and any positive value for the appropriate timeout.
+
+:speed_limit_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "speed_limit"
+ ============== =============================
+
+ Description
+ Speed limiting topic name to subscribe. This could be published by Speed Filter (please refer to :ref:`speed_filter` configuration page). You can also use this without the Speed Filter as well if you provide an external server to publish `these messages `_.
+
+:odom_topic:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "odom"
+ ============== =============================
+
+ Description
+ Topic to get instantaneous measurement of speed from.
+
+:odom_duration:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ double 0.3
+ ============== ===========================
+
+ Description
+ Time (s) to buffer odometry commands to estimate the robot speed.
+
+:enable_stamped_cmd_vel:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to use geometry_msgs::msg::Twist or geometry_msgs::msg::TwistStamped velocity data.
+ True uses TwistStamped, false uses Twist.
+ Note: This parameter is default ``false`` in Jazzy or older! Kilted or newer uses ``TwistStamped`` by default.
+
+:bond_heartbeat_period:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.25
+ ============== =============================
+
+ Description
+ The lifecycle node bond mechanism publishing period (on the /bond topic). Disabled if inferior or equal to 0.0.
+
+:introspection_mode:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "disabled"
+ ============== =============================
+
+ Description
+ The introspection mode for services and actions. Options are "disabled", "metadata", "contents".
+
+:allow_parameter_qos_overrides:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to allow QoS profiles to be overwritten with parameterized values.
+
+:search_window:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 2.0
+ ============== =============================
+
+ Description
+ How far (in meters) along the path the searching algorithm will look for the closest point.
+
+Provided Plugins
+****************
+ The plugins listed below are inside the ``nav2_controller`` namespace.
+
+.. toctree::
+ :maxdepth: 1
+
+ nav2_controller-plugins/simple_progress_checker.rst
+ nav2_controller-plugins/pose_progress_checker.rst
+ nav2_controller-plugins/axis_goal_checker.rst
+ nav2_controller-plugins/adaptive_tolerance_goal_checker.rst
+ nav2_controller-plugins/simple_goal_checker.rst
+ nav2_controller-plugins/stopped_goal_checker.rst
+ nav2_controller-plugins/position_goal_checker.rst
+ nav2_controller-plugins/feasible_path_handler.rst
+
+Default Plugins
+***************
+
+When the :code:`progress_checker_plugins`, :code:`goal_checker_plugin`, :code:`path_handler_plugin` or :code:`controller_plugins` parameters are not overridden, the following default plugins are loaded:
+
+ ================== =====================================================
+ Namespace Plugin
+ ------------------ -----------------------------------------------------
+ "progress_checker" "nav2_controller::SimpleProgressChecker"
+ ------------------ -----------------------------------------------------
+ "goal_checker" "nav2_controller::SimpleGoalChecker"
+ ------------------ -----------------------------------------------------
+ "path_handler" "nav2_controller::FeasiblePathHandler"
+ ------------------ -----------------------------------------------------
+ "FollowPath" "dwb_core::DWBLocalPlanner"
+ ================== =====================================================
+
+Example
+*******
+.. code-block:: yaml
+
+ controller_server:
+ ros__parameters:
+ controller_frequency: 20.0
+ costmap_update_timeout: 0.3
+ min_x_velocity_threshold: 0.001
+ min_y_velocity_threshold: 0.5
+ min_theta_velocity_threshold: 0.001
+ failure_tolerance: 0.3
+ odom_topic: "odom"
+ odom_duration: 0.3
+ progress_checker_plugins: ["progress_checker"] # progress_checker_plugin: "progress_checker" For Humble and older
+ goal_checker_plugins: ["goal_checker"] # goal_checker_plugin: "goal_checker" For Galactic and older
+ path_handler_plguins: ["PathHandler"]
+ controller_plugins: ["FollowPath"]
+ progress_checker:
+ plugin: "nav2_controller::SimpleProgressChecker"
+ required_movement_radius: 0.5
+ movement_time_allowance: 10.0
+ goal_checker:
+ plugin: "nav2_controller::SimpleGoalChecker"
+ xy_goal_tolerance: 0.25
+ yaw_goal_tolerance: 0.25
+ path_length_tolerance: 1.0
+ stateful: True
+ PathHandler:
+ plugin: "nav2_controller::FeasiblePathHandler"
+ prune_distance: 2.0
+ enforce_path_inversion: True
+ enforce_path_rotation: False
+ inversion_xy_tolerance: 0.2
+ inversion_yaw_tolerance: 0.4
+ minimum_rotation_angle: 0.785
+ reject_unit_path: False
+ FollowPath:
+ plugin: "dwb_core::DWBLocalPlanner"
diff --git a/configuration/packages/configuring-costmaps.rst b/configuration/packages/configuring-costmaps.rst
new file mode 100644
index 0000000000..99174afda8
--- /dev/null
+++ b/configuration/packages/configuring-costmaps.rst
@@ -0,0 +1,494 @@
+.. _configuring_cosmaps:
+
+Costmap 2D
+##########
+
+Source code on Github_.
+
+.. _Github: https://github.com/ros-navigation/navigation2/tree/main/nav2_costmap_2d
+
+The Costmap 2D package implements a 2D grid-based costmap for environmental representations and a number of sensor processing plugins (AI outputs, depth sensor obstacle buffering, semantic information, etc).
+It is used in the planner and controller servers for creating the space to check for collisions or higher cost areas to negotiate around.
+
+Costmap2D ROS Parameters
+************************
+
+:always_send_full_costmap:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool False
+ ============== =======
+
+ Description
+ Whether to send the full costmap on every update instead of only incremental updates.
+
+:introspection_mode:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "disabled"
+ ============== =============================
+
+ Description
+ The introspection mode for services and actions. Options are "disabled", "metadata", "contents".
+
+:allow_parameter_qos_overrides:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to allow QoS profiles to be overwritten with parameterized values.
+
+:footprint_padding:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 0.01
+ ============== =======
+
+ Description
+ Amount to pad footprint (m).
+
+:footprint:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ vector "[]"
+ ============== =======
+
+ Description
+ Ordered set of footprint points passed in as a string, must be closed set. For example, the following defines a square base with side lengths of 0.2 meters `footprint: "[ [0.1, 0.1], [0.1, -0.1], [-0.1, -0.1], [-0.1, 0.1] ]"`. Note that this can also be adjusted over time using the costmap's ``~/footprint`` topic, which will update the polygon over time as needed due to changes in the robot's state, such as movement of an attached manipulator, picking up a pallet, or other actions that adjust a robot's shape. If this parameter is set, ``isPathValid`` will do full collision checking.
+
+:global_frame:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ string "map"
+ ============== =======
+
+ Description
+ Reference frame.
+
+:height:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ int 5
+ ============== =======
+
+ Description
+ Height of costmap (m).
+
+:width:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ int 5
+ ============== =======
+
+ Description
+ Width of costmap (m).
+
+:lethal_cost_threshold:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ int 100
+ ============== =======
+
+ Description
+ Minimum cost of an occupancy grid map to be considered a lethal obstacle.
+
+:map_vis_z:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 0.0
+ ============== =======
+
+ Description
+ The height of the map used for visualization, helping to avoid RViz flickering issues (e.g., at -0.008).
+
+:origin_x:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 0.0
+ ============== =======
+
+ Description
+ X origin of the costmap relative to width (m).
+
+:origin_y:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 0.0
+ ============== =======
+
+ Description
+ Y origin of the costmap relative to height (m).
+
+:publish_frequency:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 1.0
+ ============== =======
+
+ Description
+ Frequency (Hz) at which the costmap is published to a topic.
+ Higher values provide more frequent updates for visualization and debugging but increase bandwidth usage.
+
+:resolution:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 0.1
+ ============== =======
+
+ Description
+ Resolution of each cell (pixel) in the costmap, in meters.
+ Smaller values increase map accuracy and obstacle detail but require more computation.
+ Larger values reduce computational load but may miss fine obstacles.
+
+:robot_base_frame:
+
+ ============== ===========
+ Type Default
+ -------------- -----------
+ string "base_link"
+ ============== ===========
+
+ Description
+ Robot base frame.
+
+:robot_radius:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 0.1
+ ============== =======
+
+ Description
+ Robot radius to use, if footprint coordinates not provided. If this parameter is set, ``isPathValid`` will do circular collision checking.
+
+:subscribe_to_stamped_footprint:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool False
+ ============== =======
+
+ Description
+ If true, the costmap will subscribe to PolygonStamped footprint messages instead of Polygon messages. This allows the footprint to include timestamp and frame information, which can be useful for applications that need temporally-aware footprint data.
+
+:rolling_window:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool False
+ ============== =======
+
+ Description
+ If true, the costmap moves with the robot, maintaining a local view centered around it.
+ This is typically used for local costmaps.
+ If false, the costmap remains fixed in the global frame.
+
+:track_unknown_space:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool False
+ ============== =======
+
+ Description
+ If false, treats unknown space as free space, else as unknown space.
+
+:transform_tolerance:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 0.3
+ ============== =======
+
+ Description
+ TF transform tolerance.
+
+:initial_transform_timeout:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 60.0
+ ============== =======
+
+ Description
+ Time to wait for the transform from robot base frame to global frame to become available. If exceeded, the configuration stage is aborted.
+
+:trinary_costmap:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool True
+ ============== =======
+
+ Description
+ If occupancy grid map should be interpreted as only 3 values (free, occupied, unknown) or with its stored values.
+
+:unknown_cost_value:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ int 255
+ ============== =======
+
+ Description
+ Cost of unknown space if tracking it.
+
+:inscribed_obstacle_cost_value:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ int 99
+ ============== =======
+
+ Description
+ The OccupancyGrid values that represents ``INSCRIBED_INFLATED_OBSTACLE`` during costmap conversion operations.
+
+:update_frequency:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ double 5.0
+ ============== =======
+
+ Description
+ Costmap update frequency.
+
+:use_maximum:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ bool False
+ ============== =======
+
+ Description
+ Whether to use the maximum cost when combining multiple costmap layers.
+ If true, the highest cost is preserved, ensuring obstacles are not overwritten.
+ If false, newer layers may override previous cost values.
+
+:plugins:
+
+ ============== =====================================================
+ Type Default
+ -------------- -----------------------------------------------------
+ vector {"static_layer", "obstacle_layer", "inflation_layer"}
+ ============== =====================================================
+
+ Description
+ List of mapped plugin names for parameter namespaces and names.
+
+ Note
+ Each plugin namespace defined in this list needs to have a :code:`plugin` parameter defining the type of plugin to be loaded in the namespace.
+
+ Example:
+
+ .. code-block:: yaml
+
+ local_costmap:
+ ros__parameters:
+ plugins: ["obstacle_layer", "voxel_layer", "inflation_layer"]
+ obstacle_layer:
+ plugin: "nav2_costmap_2d::ObstacleLayer"
+ voxel_layer:
+ plugin: "nav2_costmap_2d::VoxelLayer"
+ inflation_layer:
+ plugin: "nav2_costmap_2d::InflationLayer"
+ ..
+
+:filters:
+
+ ============== =======
+ Type Default
+ -------------- -------
+ vector {}
+ ============== =======
+
+ Description
+ List of mapped costmap filter names for parameter namespaces and names.
+
+ Note
+ Costmap filters are also loadable plugins just as ordinary costmap layers. This separation is made to avoid plugin and filter interference and places these filters on top of the combined layered costmap. As with plugins, each costmap filter namespace defined in this list needs to have a :code:`plugin` parameter defining the type of filter plugin to be loaded in the namespace.
+
+ Example:
+
+ .. code-block:: yaml
+
+ local_costmap:
+ ros__parameters:
+ filters: ["keepout_filter", "speed_filter"]
+ keepout_filter:
+ plugin: "nav2_costmap_2d::KeepoutFilter"
+ speed_filter:
+ plugin: "nav2_costmap_2d::SpeedFilter"
+ ..
+
+Default Plugins
+***************
+
+When the :code:`plugins` parameter is not overridden, the following default plugins are loaded:
+
+ ================= =====================================================
+ Namespace Plugin
+ ----------------- -----------------------------------------------------
+ "static_layer" "nav2_costmap_2d::StaticLayer"
+ ----------------- -----------------------------------------------------
+ "obstacle_layer" "nav2_costmap_2d::ObstacleLayer"
+ ----------------- -----------------------------------------------------
+ "inflation_layer" "nav2_costmap_2d::InflationLayer"
+ ================= =====================================================
+
+Plugin Parameters
+*****************
+
+.. toctree::
+ :maxdepth: 1
+
+ costmap-plugins/static.rst
+ costmap-plugins/inflation.rst
+ costmap-plugins/inflation_legacy.rst
+ costmap-plugins/asymmetric_inflation.rst
+ costmap-plugins/obstacle.rst
+ costmap-plugins/voxel.rst
+ costmap-plugins/range.rst
+ costmap-plugins/denoise.rst
+ costmap-plugins/plugin_container.rst
+
+Costmap Filters Parameters
+**************************
+
+.. toctree::
+ :maxdepth: 1
+
+ costmap-plugins/keepout_filter.rst
+ costmap-plugins/speed_filter.rst
+ costmap-plugins/binary_filter.rst
+ costmap-plugins/zone_parameter_filter.rst
+
+Example
+*******
+.. code-block:: yaml
+
+ global_costmap:
+ global_costmap:
+ ros__parameters:
+ footprint_padding: 0.03
+ update_frequency: 1.0
+ publish_frequency: 1.0
+ transform_tolerance: 0.1
+ global_frame: map
+ robot_base_frame: base_link
+ robot_radius: 0.22 # radius set and used, so no footprint points
+ resolution: 0.05
+ plugins: ["static_layer", "obstacle_layer", "voxel_layer", "inflation_layer"]
+ obstacle_layer:
+ plugin: "nav2_costmap_2d::ObstacleLayer"
+ enabled: True
+ observation_sources: scan
+ footprint_clearing_enabled: true
+ max_obstacle_height: 2.0
+ combination_method: 1
+ scan:
+ topic: /scan
+ obstacle_max_range: 2.5
+ obstacle_min_range: 0.0
+ raytrace_max_range: 3.0
+ raytrace_min_range: 0.0
+ max_obstacle_height: 2.0
+ min_obstacle_height: 0.0
+ clearing: True
+ marking: True
+ data_type: "LaserScan"
+ inf_is_valid: false
+ voxel_layer:
+ plugin: "nav2_costmap_2d::VoxelLayer"
+ enabled: True
+ footprint_clearing_enabled: true
+ max_obstacle_height: 2.0
+ publish_voxel_map: True
+ origin_z: 0.0
+ z_resolution: 0.05
+ z_voxels: 16
+ unknown_threshold: 15
+ mark_threshold: 0
+ observation_sources: pointcloud
+ combination_method: 1
+ pointcloud: # no frame set, uses frame from message
+ topic: /intel_realsense_r200_depth/points
+ max_obstacle_height: 2.0
+ min_obstacle_height: 0.0
+ obstacle_max_range: 2.5
+ obstacle_min_range: 0.0
+ raytrace_max_range: 3.0
+ raytrace_min_range: 0.0
+ clearing: True
+ marking: True
+ data_type: "PointCloud2"
+ transport_type: "raw" # raw or/ with compression (zlib, draco, zstd)
+ static_layer:
+ plugin: "nav2_costmap_2d::StaticLayer"
+ map_subscribe_transient_local: True
+ enabled: true
+ subscribe_to_updates: true
+ inflation_layer:
+ plugin: "nav2_costmap_2d::InflationLayer"
+ enabled: true
+ inflation_radius: 0.55
+ cost_scaling_factor: 1.0
+ inflate_unknown: false
+ inflate_around_unknown: true
+ always_send_full_costmap: True
+ introspection_mode: "disabled"
+
+
+ local_costmap:
+ local_costmap:
+ ros__parameters:
+ update_frequency: 5.0
+ publish_frequency: 2.0
+ global_frame: odom
+ robot_base_frame: base_link
+ rolling_window: true
+ width: 3
+ height: 3
+ resolution: 0.05
+ introspection_mode: "disabled"
diff --git a/configuration/packages/configuring-coverage-server.rst b/configuration/packages/configuring-coverage-server.rst
new file mode 100644
index 0000000000..83be7ab7aa
--- /dev/null
+++ b/configuration/packages/configuring-coverage-server.rst
@@ -0,0 +1,259 @@
+.. _configuring_coverage_server:
+
+Coverage Server
+###############
+
+Source code on Github_.
+
+.. _Github: https://github.com/open-navigation/opennav_coverage
+
+The Coverage Server in ``opennav_coverage`` implements the server for handling the complete-coverage planning requests of a given field or zone set in cartesian or GPS coordinates using the Fields2Cover library.
+It can also compute coverage route and plans using a precomputed set of rows using the ``opennav_row_coverage`` server.
+It is within the ``opennav_coverage`` project, not within Nav2 directly, but is planned for a longer-term integration once a few key features are available in Fields2Cover. If you wish to contribute to this effort, please let a maintainer know!
+
+Note: All ``default_`` prefixed parameters can be overwritten in the action request field. When modes are not set in the Action goal, the defaults are utilized.
+
+Parameters
+**********
+
+:coordinates_in_cartesian_frame:
+
+ ============== ========
+ Type Default
+ -------------- --------
+ bool true
+ ============== ========
+
+ Description
+ Whether or not requests coming into the server will be in cartesian (e.g. meters) or GPS coordinates. If GPS, they are automatically converted into UTM frame (for meters) to compute the coverage paths, then converted back into GPS for the client.
+
+:robot_width:
+
+ ============== ========
+ Type Default
+ -------------- --------
+ double 2.1
+ ============== ========
+
+ Description
+ The robot's width in meters.
+
+:operation_width:
+
+ ============== ========
+ Type Default
+ -------------- --------
+ double 2.5
+ ============== ========
+
+ Description
+ The robot's operational width (cleaning, planting, etc) for computing coverage swath distances
+
+:min_turning_radius:
+
+ ============== ========
+ Type Default
+ -------------- --------
+ double 0.4
+ ============== ========
+
+ Description
+ The robot's minimum turning radius for computing paths connecting route swaths (m)
+
+:linear_curv_change:
+
+ ============== ========
+ Type Default
+ -------------- --------
+ double 2.0
+ ============== ========
+
+ Description
+ The robot's maximum linear curvature change for computing paths connecting route swaths (1/m^2)
+
+:default_allow_overlap:
+
+ ============== ========
+ Type Default
+ -------------- --------
+ bool false
+ ============== ========
+
+ Description
+ Whether, by default, to allow overlapping of the last row in the coverage plan to obtain coverage at the far edge. Only for ``opennav_coverage``.
+
+:default_headland_type:
+
+ ============== ==========
+ Type Default
+ -------------- ----------
+ string "CONSTANT"
+ ============== ==========
+
+ Description
+ The default headland generation method. Constant is the only valid method currently. Only for ``opennav_coverage``.
+
+:default_headland_width:
+
+ ============== ==========
+ Type Default
+ -------------- ----------
+ double 2.0
+ ============== ==========
+
+ Description
+ The default headland width to remove from the field or zone from coverage planning. Only for ``opennav_coverage``.
+
+:default_swath_type:
+
+ ============== ===============
+ Type Default
+ -------------- ---------------
+ string "LENGTH"
+ ============== ===============
+
+ Description
+ Objective to use to score swath generation candidates at different angles when using ``BRUTE_FORCE`` swath angle type. Options: ``LENGTH``, ``COVERAGE``, ``NUMBER`` for ``opennav_coverage``. Option: ``OFFSET``, ``CENTER``, ``ROWSARESWATHS`` for ``opennav_row_coverage``.
+ Note that ``Coverage`` takes 10x longer than others.
+
+:default_swath_angle_type:
+
+ ============== ===============
+ Type Default
+ -------------- ---------------
+ double 1.7e-2
+ ============== ===============
+
+ Description
+ Mode to use for generating swaths. Need to find optimal angle by the swath generator objectives, if not given. Options: ``BRUTE_FORCE``, ``SET_ANGLE``. Only for ``opennav_coverage``.
+
+:default_step_angle:
+
+ ============== ===============
+ Type Default
+ -------------- ---------------
+ double 1.7e-2
+ ============== ===============
+
+ Description
+ The angular step size to try to find the optimal angle for route objective, when using ``BRUTE_FORCE`` swath angle type. Default is 1 deg in rad units. Only for ``opennav_coverage``.
+
+:default_swath_angle:
+
+ ============== ===============
+ Type Default
+ -------------- ---------------
+ double N/A
+ ============== ===============
+
+ Description
+ The optimal angle for route objective, when using ``SET_ANGLE`` swath angle type. Default is 1 deg in rad units. Only for ``opennav_coverage``.
+
+:default_route_type:
+
+ ============== ===============
+ Type Default
+ -------------- ---------------
+ string "BOUSTROPHEDON"
+ ============== ===============
+
+ Description
+ Default order when computing routes to order swaths. Options: ``BOUSTROPHEDON``, ``SNAKE``, ``SPIRAL``, ``CUSTOM``
+
+:default_custom_order:
+
+ ============== ========
+ Type Default
+ -------------- --------
+ vector N/A
+ ============== ========
+
+ Description
+ The default custom swath order for the route planner in the ``CUSTOM`` mode. The length of this custom order must be ``>= swaths.size()``. Only relevant when using the ``CUSTOM`` Route Type.
+
+:default_spiral_n:
+
+ ============== ===============
+ Type Default
+ -------------- ---------------
+ int 4
+ ============== ===============
+
+ Description
+ Default number of swaths to skip and double back on to create a spiral pattern in the route. Only relevant when using the ``SPIRAL`` Route Type. ``SNAKE`` is a special case when Spiral N = 2.
+
+
+:default_path_continuity_type:
+
+ ============== ============
+ Type Default
+ -------------- ------------
+ string "CONTINUOUS"
+ ============== ============
+
+ Description
+ Default continuity type when computing paths to connect routes together. Options ``DISCONTINUOUS``, ``CONTINUOUS``.
+
+:default_path_type:
+
+ ============== ============
+ Type Default
+ -------------- ------------
+ string "DUBIN"
+ ============== ============
+
+ Description
+ Default type when computing paths to connect routes together using curves. Options: ``DUBIN``, ``REEDS_SHEPP``.
+
+:default_turn_point_distance:
+
+ ============== ============
+ Type Default
+ -------------- ------------
+ double 0.1
+ ============== ============
+
+ Description
+ Distance between points on the plan and route for sending back in paths (e.g. 0.1m). This impacts the density of the output turn paths and the overall nav paths.
+
+:default_offset:
+
+ ============== ============
+ Type Default
+ -------------- ------------
+ double 0.0
+ ============== ============
+
+ Description
+ Offset to use for computing swaths from annotated rows. Only for ``opennav_row_coverage``.
+
+:order_ids:
+
+ ============== ============
+ Type Default
+ -------------- ------------
+ bool 0.0
+ ============== ============
+
+ Description
+ For ``opennav_row_coverage``, whether to reorder the parsed rows in the order of their ``id`` s.
+
+Example
+*******
+.. code-block:: yaml
+
+ coverage_server:
+ ros__parameters:
+ coordinates_in_cartesian_frame: true
+ robot_width: 2.1
+ operation_width: 2.5
+ min_turning_radius: 0.4
+ linear_curv_change: 2.0
+ default_allow_overlap: true
+ default_headland_width: 0.5
+ default_path_continuity_type: "CONTINUOUS"
+ default_path_type: "DUBINS"
+ default_route_type: "BOUSTROPHEDON"
+ default_swath_angle_type: "BRUTE_FORCE"
+ default_swath_type: "LENGTH"
+ default_turn_point_distance: 0.1
diff --git a/configuration/packages/configuring-docking-server.rst b/configuration/packages/configuring-docking-server.rst
new file mode 100644
index 0000000000..44a472f7f2
--- /dev/null
+++ b/configuration/packages/configuring-docking-server.rst
@@ -0,0 +1,763 @@
+.. _configuring_docking_server:
+
+Docking Server
+##############
+
+Source code on Github_.
+
+.. _Github: https://github.com/open-navigation/opennav_docking
+
+The Docking Server in ``opennav_docking`` implements a server for docking and undocking a robot.
+This can be from Charging stations (i.e. docks) or non-charging docking locations such as the end of a conveyor belt or a pallet.
+It uses plugin `dock` implementations for a particular platform to enable the framework to generalize to robots of many different kinematic models, charging methods, sensor modalities, charging-type, and so on.
+It can also handle a database of many different docking locations and dock models to handle a heterogeneous environment.
+This task server is designed be called by an application BT or autonomy application to dock once completed with tasks or battery is low -- not within the navigate-to-pose action itself (though `undock` may be called from inside navigate actions!).
+
+Thanks to NVIDIA for sponsoring this Docking Server package!
+
+Parameters
+**********
+
+:controller_frequency:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 50.0
+ ============== ==============
+
+ Description
+ Control frequency (Hz) for vision-control loop.
+
+:initial_perception_timeout:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 5.0
+ ============== ==============
+
+ Description
+ Timeout (s) to wait to obtain initial perception of the dock.
+
+:wait_charge_timeout:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 5.0
+ ============== ==============
+
+ Description
+ Timeout (s) to wait to see if charging starts after docking.
+
+:dock_approach_timeout:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 30.0
+ ============== ==============
+
+ Description
+ Timeout (s) to attempt vision-control approach loop.
+
+:undock_linear_tolerance:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.05
+ ============== ==============
+
+ Description
+ Tolerance (m) to exit the undocking control loop at staging pose.
+
+:undock_angular_tolerance:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.05
+ ============== ==============
+
+ Description
+ Angular tolerance (rad) to exit undocking loop at staging pose.
+
+:rotation_angular_tolerance:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.05
+ ============== ==============
+
+ Description
+ Angular tolerance (rad) to exit the rotation loop when rotate_to_dock is enabled.
+
+:max_retries:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ int 3
+ ============== ==============
+
+ Description
+ Maximum number of retries to attempt.
+
+:base_frame:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ string "base_link"
+ ============== ==============
+
+ Description
+ Robot's base frame for control law.
+
+:fixed_frame:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ string "odom"
+ ============== ==============
+
+ Description
+ Fixed frame to use, recommended to be a smooth odometry frame **not** map.
+
+:odom_topic:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ string "odom"
+ ============== ==============
+
+ Description
+ The topic to use for the odometry data when rotate_to_dock is enabled.
+
+:odom_duration:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ double 0.3
+ ============== ===========================
+
+ Description
+ Time (s) to buffer odometry commands to estimate the robot speed.
+
+:dock_backwards:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ bool false
+ ============== ==============
+
+ Description
+ Whether the robot is docking with the dock forward or backward in motion. This parameter is deprecated. Use the dock plugin's ``dock_direction`` parameter instead.
+
+:dock_prestaging_tolerance:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.5
+ ============== ==============
+
+ Description
+ L2 distance in X,Y,Theta from the staging pose to bypass navigation.
+
+:dock_plugins:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ vector N/A
+ ============== ==============
+
+ Description
+ A set of dock plugins to load.
+
+:dock_database:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ string N/A
+ ============== ==============
+
+ Description
+ The filepath to the dock database to use for this environment. Use ``docks`` or this param.
+
+
+:docks:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ vector N/A
+ ============== ==============
+
+ Description
+ Instead of `dock_database`, the set of docks specified in the params file itself. Use ``dock_database`` or this param.
+
+:navigator_bt_xml:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ string ""
+ ============== ==============
+
+ Description
+ BT XML to use for Navigator, if non-default.
+
+:introspection_mode:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ string "disabled"
+ ============== =============================
+
+ Description
+ The introspection mode for services and actions. Options are "disabled", "metadata", "contents".
+
+:allow_parameter_qos_overrides:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ bool true
+ ============== =============================
+
+ Description
+ Whether to allow QoS profiles to be overwritten with parameterized values.
+
+:controller.k_phi:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 3.0
+ ============== ==============
+
+ Description
+ Ratio of the rate of change of angle relative to distance from the target. Much be > 0.
+
+:controller.k_delta:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 2.0
+ ============== ==============
+
+ Description
+ Higher values result in converging to the target more quickly.
+
+:controller.beta:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.4
+ ============== ==============
+
+ Description
+ Parameter to reduce linear velocity proportional to path curvature. Increasing this linearly reduces the velocity (v(t) = v_max / (1 + beta * \|curv\|^lambda)).
+
+:controller.lambda:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 2.0
+ ============== ==============
+
+ Description
+ Parameter to reduce linear velocity proportional to path curvature. Increasing this exponentially reduces the velocity (v(t) = v_max / (1 + beta * \|curv\|^lambda)).
+
+:controller.v_linear_min:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.1
+ ============== ==============
+
+ Description
+ Minimum velocity for approaching dock.
+
+:controller.v_linear_max:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.24
+ ============== ==============
+
+ Description
+ Maximum velocity for approaching dock.
+
+:controller.v_angular_max:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.75
+ ============== ==============
+
+ Description
+ Maximum angular velocity for approaching dock.
+
+:controller.slowdown_radius:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.25
+ ============== ==============
+
+ Description
+ Radius to end goal to commense slow down.
+
+:controller.deceleration_max:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 2.5
+ ============== ==============
+
+ Description
+ Maximum deceleration (m/s²) used to compute a velocity limit based on distance to the goal.
+
+:controller.rotate_to_heading_angular_vel:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 1.0
+ ============== ==============
+
+ Description
+ Angular velocity (rad/s) to rotate to the goal heading when rotate_to_dock is enabled.
+
+:controller.rotate_to_heading_max_angular_accel:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 3.2
+ ============== ==============
+
+ Description
+ Maximum angular acceleration (rad/s^2) to rotate to the goal heading when rotate_to_dock is enabled.
+
+:controller.use_collision_detection:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ bool true
+ ============== ==============
+
+ Description
+ Whether to use collision detection to avoid obstacles.
+
+:controller.costmap_topic:
+
+ ============== ===========================
+ Type Default
+ -------------- ---------------------------
+ string "local_costmap/costmap_raw"
+ ============== ===========================
+
+ Description
+ Raw costmap topic for collision checking.
+
+:controller.footprint_topic:
+
+ ============== ===================================
+ Type Default
+ -------------- -----------------------------------
+ string "local_costmap/published_footprint"
+ ============== ===================================
+
+ Description
+ Topic for footprint in the costmap frame.
+
+:controller.transform_tolerance:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.1
+ ============== =============================
+
+ Description
+ Time with which to post-date the transform that is published, to indicate that this transform is valid into the future.
+
+:controller.projection_time:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 1.0
+ ============== =============================
+
+ Description
+ Time to look ahead for collisions (s).
+
+:controller.simulation_time_step:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.1
+ ============== =============================
+
+ Description
+ Time step for projections (s).
+
+:controller.dock_collision_threshold:
+
+ ============== =============================
+ Type Default
+ -------------- -----------------------------
+ double 0.3
+ ============== =============================
+
+ Description
+ Distance (m) from the dock pose to ignore collisions, i.e. the robot will not check for collisions within this distance from the dock pose, as the robot will make contact with the dock. Set to ``0.0`` when physical contact is not made with a dock.
+
+
+Note: ``dock_plugins`` and either ``docks`` or ``dock_database`` are required.
+
+
+SimpleChargingDock Parameters
+*****************************
+
+Simple Charging Dock is a provided charging dock plugin that can handle many docks and common techniques.
+
+:.staging_x_offset:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double -0.7
+ ============== ==============
+
+ Description
+ Staging pose offset forward (negative) of dock pose (m).
+
+:.staging_yaw_offset:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.0
+ ============== ==============
+
+ Description
+ Staging pose angle relative to dock pose (rad). If ``dock_direction`` is set to "backward", this angle must be faced in the opposite direction of the dock pose. However, if ``rotate_to_dock`` is enabled, this angle must be facing the same direction as the dock pose because the robot will rotate to the dock pose after detection.
+
+:.use_battery_status:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ bool true
+ ============== ==============
+
+ Description
+ Whether to use the battery state message or ``isDocked()`` for ``isCharging()``.
+
+:.use_external_detection_pose:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ bool false
+ ============== ==============
+
+ Description
+ Whether to use external detection topic for dock or use the databases' pose.
+
+:.detector_service_name:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ string ""
+ ============== ==============
+
+ Description
+ Optional ``std_srvs/Trigger`` service invoked when detection starts or stops via ``startDetectionProcess`` / ``stopDetectionProcess`` if detection method accepts a service call to start and stop.
+
+:.detector_service_timeout:
+
+ ============== ==================
+ Type Default
+ -------------- ------------------
+ double 5.0
+ ============== ==================
+
+ Description
+ Timeout (s) to wait for ``detector_service_name`` to become available and respond.
+
+:.subscribe_toggle:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ bool false
+ ============== ==============
+
+ Description
+ When true, subscribe to ``detected_dock_pose`` only while detection is active; otherwise keep the subscription persistent.
+
+
+:.external_detection_timeout:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 1.0
+ ============== ==============
+
+ Description
+ Timeout (s) at which if the newest detection update does not meet to fail.
+
+
+:.external_detection_translation_x:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double -0.20
+ ============== ==============
+
+ Description
+ X offset from detected pose for docking pose (m).
+
+:.external_detection_translation_y:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.0
+ ============== ==============
+
+ Description
+ Y offset from detected pose for docking pose (m).
+
+:.external_detection_rotation_yaw:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.0
+ ============== ==============
+
+ Description
+ Yaw offset from detected pose for docking pose (rad).
+
+:.external_detection_rotation_pitch:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 1.57
+ ============== ==============
+
+ Description
+ Pitch offset from detected pose for docking pose (rad). Note: The external detection rotation angles are setup to work out of the box with Apriltags detectors in `image_proc` and `isaac_ros`.
+
+:.external_detection_rotation_roll:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double -1.57
+ ============== ==============
+
+ Description
+ Roll offset from detected pose for docking pose (rad). Note: The external detection rotation angles are setup to work out of the box with Apriltags detectors in `image_proc` and `isaac_ros`.
+
+:.filter_coef:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.1
+ ============== ==============
+
+ Description
+ Dock external detection method filtering algorithm coefficient.
+
+:.charging_threshold:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.5
+ ============== ==============
+
+ Description
+ Threshold of current in battery state above which ``isCharging() = true``.
+
+:.use_stall_detection:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ bool false
+ ============== ==============
+
+ Description
+ Whether or not to use stall detection for ``isDocked()`` or positional threshold.
+
+:.stall_joint_names:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ vector N/A
+ ============== ==============
+
+ Description
+ Names in ``joint_states`` topic of joints to track.
+
+:.stall_velocity_threshold:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 1.0
+ ============== ==============
+
+ Description
+ The joint velocity below which to trigger ``isDocked() = true``.
+
+:.stall_effort_threshold:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 1.0
+ ============== ==============
+
+ Description
+ Current or motor effort in joint state to trigger ``isDocked() = true``.
+
+:.docking_threshold:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ double 0.05
+ ============== ==============
+
+ Description
+ If not using stall detection, the pose threshold to the docking pose where ``isDocked() = true``.
+
+:.dock_direction:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ string "forward"
+ ============== ==============
+
+ Description
+ Whether the robot is docking with the dock forward or backward in motion. This is the replacement for the deprecated ``dock_backwards`` parameter. Options are "forward" or "backward".
+
+:.rotate_to_dock:
+
+ ============== ==============
+ Type Default
+ -------------- --------------
+ bool false
+ ============== ==============
+
+ Description
+ Enables backward docking without requiring a sensor for detection during the final approach. When enabled, the robot approaches the staging pose facing forward with sensor coverage for dock detection; after detection, it rotates and backs into the dock using only the initially detected pose for dead reckoning. In the undocking phase, the robot will move forward to the staging pose and then rotate to the original heading. This may also be paired with sensor detection in the reverse direction as well if available.
+
+ Note: This parameter is only valid when the ``dock_direction`` is set to "backward".
+
+Example
+*******
+.. code-block:: yaml
+
+ docking_server:
+ ros__parameters:
+ controller_frequency: 50.0
+ initial_perception_timeout: 5.0
+ wait_charge_timeout: 5.0
+ dock_approach_timeout: 30.0
+ undock_linear_tolerance: 0.05
+ undock_angular_tolerance: 0.1
+ max_retries: 3
+ base_frame: "base_link"
+ fixed_frame: "odom"
+ odom_topic: "odom"
+ odom_duration: 0.3
+ dock_backwards: false # Deprecated, use dock_direction in plugin
+ dock_prestaging_tolerance: 0.5
+ introspection_mode: "disabled"
+
+ # Types of docks
+ dock_plugins: ['nova_carter_dock']
+ nova_carter_dock:
+ plugin: 'opennav_docking::SimpleChargingDock' # Also 'opennav_docking::SimpleNonChargingDock'
+ docking_threshold: 0.05
+ staging_x_offset: -0.7
+ use_external_detection_pose: true
+ detector_service_name: '/detector/toggle'
+ detector_service_timeout: 5.0
+ subscribe_toggle: true
+ use_battery_status: false # true
+ use_stall_detection: false
+ rotate_to_dock: false
+
+ external_detection_timeout: 1.0
+ external_detection_translation_x: -0.18
+ external_detection_translation_y: 0.0
+ external_detection_rotation_roll: -1.57
+ external_detection_rotation_pitch: -1.57
+ external_detection_rotation_yaw: 0.0
+ filter_coef: 0.1
+ dock_direction: "forward" # "backward"
+
+ # Dock instances
+ docks: ['home_dock']
+ home_dock:
+ type: 'nova_carter_dock'
+ frame: map
+ pose: [0.0, 0.0, 0.0]
+ id: 'c67f50cb-e152-4720-85cc-5eb20bd85ce8'
+
+ controller:
+ k_phi: 3.0
+ k_delta: 2.0
+ v_linear_min: 0.15
+ v_linear_max: 0.15
+ v_angular_max: 0.75
+ slowdown_radius: 0.25
+ deceleration_max: 2.5
+ rotate_to_heading_angular_vel: 1.0
+ rotate_to_heading_max_angular_accel: 3.2
+ use_collision_detection: true
+ costmap_topic: "local_costmap/costmap_raw"
+ footprint_topic: "local_costmap/published_footprint"
+ transform_tolerance: 0.1
+ projection_time: 1.0
+ simulation_time_step: 0.1
+ dock_collision_threshold: 0.3
diff --git a/configuration/packages/configuring-dwb-controller.rst b/configuration/packages/configuring-dwb-controller.rst
new file mode 100644
index 0000000000..066f565b8a
--- /dev/null
+++ b/configuration/packages/configuring-dwb-controller.rst
@@ -0,0 +1,118 @@
+.. _configuring_dwb_controller:
+
+DWB Controller
+##############
+
+Source code on Github_.
+
+.. _Github: https://github.com/ros-navigation/navigation2/tree/main/nav2_dwb_controller
+
+The DWB controller is the default controller. It is a fork of `David Lu's
+controller `_
+modified for ROS 2 using the Dynamic Window Approach.
+
+Controller
+**********
+.. toctree::
+ :maxdepth: 1
+
+ dwb-params/controller.rst
+ dwb-params/iterator.rst
+ dwb-params/kinematic.rst
+ dwb-params/visualization.rst
+
+Plugins
+*******
+
+The plugins listed below are inside the ``dwb_plugins`` namespace.
+
+.. toctree::
+ :maxdepth: 1
+
+ dwb-plugins/limited_accel_generator.rst
+ dwb-plugins/standard_traj_generator.rst
+
+
+Trajectory Critics
+******************
+
+The trajectory critics listed below are inside the ``dwb_critics`` namespace.
+
+.. toctree::
+ :maxdepth: 1
+
+ trajectory_critics/base_obstacle.rst
+ trajectory_critics/goal_align.rst
+ trajectory_critics/goal_dist.rst
+ trajectory_critics/obstacle_footprint.rst
+ trajectory_critics/oscillation.rst
+ trajectory_critics/path_align.rst
+ trajectory_critics/path_dist.rst
+ trajectory_critics/prefer_forward.rst
+ trajectory_critics/rotate_to_goal.rst
+ trajectory_critics/twirling.rst
+
+Example
+*******
+.. code-block:: yaml
+
+ controller_server:
+ ros__parameters:
+ # controller server parameters (see Controller Server for more info)
+ controller_frequency: 20.0
+ min_x_velocity_threshold: 0.001
+ min_y_velocity_threshold: 0.5
+ min_theta_velocity_threshold: 0.001
+ progress_checker_plugins: ["progress_checker"] # progress_checker_plugin: "progress_checker" For Humble and older
+ goal_checker_plugins: ["goal_checker"]
+ controller_plugins: ["FollowPath"]
+ progress_checker:
+ plugin: "nav2_controller::SimpleProgressChecker"
+ required_movement_radius: 0.5
+ movement_time_allowance: 10.0
+ goal_checker:
+ plugin: "nav2_controller::SimpleGoalChecker"
+ xy_goal_tolerance: 0.25
+ yaw_goal_tolerance: 0.25
+ stateful: True
+ # DWB controller parameters
+ FollowPath:
+ plugin: "dwb_core::DWBLocalPlanner"
+ debug_trajectory_details: True
+ min_vel_x: 0.0
+ min_vel_y: 0.0
+ max_vel_x: 0.26
+ max_vel_y: 0.0
+ max_vel_theta: 1.0
+ min_speed_xy: 0.0
+ max_speed_xy: 0.26
+ min_speed_theta: 0.0
+ acc_lim_x: 2.5
+ acc_lim_y: 0.0
+ acc_lim_theta: 3.2
+ decel_lim_x: -2.5
+ decel_lim_y: 0.0
+ decel_lim_theta: -3.2
+ vx_samples: 20
+ vy_samples: 5
+ vtheta_samples: 20
+ sim_time: 1.7
+ linear_granularity: 0.05
+ angular_granularity: 0.025
+ xy_goal_tolerance: 0.25
+ path_length_tolerance: 1.0
+ trans_stopped_velocity: 0.25
+ short_circuit_trajectory_evaluation: True
+ limit_vel_cmd_in_traj: False
+ stateful: True
+ critics: ["RotateToGoal", "Oscillation", "BaseObstacle", "GoalAlign", "PathAlign", "PathDist", "GoalDist"]
+ BaseObstacle.scale: 0.02
+ PathAlign.scale: 32.0
+ GoalAlign.scale: 24.0
+ PathAlign.forward_point_distance: 0.1
+ GoalAlign.forward_point_distance: 0.1
+ PathDist.scale: 32.0
+ GoalDist.scale: 24.0
+ RotateToGoal.scale: 32.0
+ RotateToGoal.slowing_factor: 5.0
+ RotateToGoal.lookahead_time: -1.0
diff --git a/configuration/packages/configuring-following-server.rst b/configuration/packages/configuring-following-server.rst
new file mode 100644
index 0000000000..1e87453c8a
--- /dev/null
+++ b/configuration/packages/configuring-following-server.rst
@@ -0,0 +1,247 @@
+.. _configuring_following_server:
+
+Following Server
+################
+
+Source code on Github_.
+
+.. _Github: https://github.com/ros-navigation/navigation2/tree/main/nav2_following/opennav_following
+
+The Following Server in ``opennav_following`` implements a server for following dynamic objects from a detection topic or specific reference frame.
+This server allows the robot to follow and maintain a determined distance from a detected object or specific frame,
+using topic-based detection techniques or coordinate frame tracking.
+The server is designed to be called by a BT application or autonomy application to follow moving objects.
+
+.. raw:: html
+
+