Skip to content

Commit ee4b6e8

Browse files
committed
[skip ci] publish latest
Signed-off-by: fmrico <fmrico@gmail.com>
1 parent f91449d commit ee4b6e8

11 files changed

Lines changed: 127 additions & 125 deletions

File tree

346 KB
Loading

_images/plugin_combinations.png

109 KB
Loading

_images/plugin_combinations_2.png

49.4 KB
Loading

_sources/design/index.rst.txt

Lines changed: 69 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Core Design and Architecture
55

66
**EasyNav** is designed with three core principles in mind: modularity, real-time performance, and extensibility. Its architecture separates concerns into well-defined components, making it both easy to adapt and efficient to execute.
77

8-
.. image:: ../images/easynav_simple_design.png
8+
.. image:: ../images/easynav_simple_design_v2.png
99
:align: center
1010
:alt: EasyNav architecture diagram
1111

@@ -23,71 +23,22 @@ EasyNav runs within a single process that hosts a ROS 2 **Lifecycle Node** calle
2323

2424
- **Controller Node**: Generates velocity commands to follow the planned path. Its functionality is encapsulated in a plugin, which outputs either ``Twist`` or ``TwistStamped`` messages depending on configuration.
2525

26+
An EasyNav application is built by combining multiple plugins from the different EasyNav components. Typical configurations may include combinations such as the following:
2627

27-
NavState: The Shared Blackboard
28-
===============================
29-
30-
A key architectural component of EasyNav is the **NavState**, a shared *blackboard* that holds all the internal state information required by the navigation system.
31-
32-
Each module in EasyNav—such as the Localizer, Planner, or Controller—reads its inputs from the NavState and writes its outputs back to it. This central structure replaces the need for internal ROS 2 communications between modules.
33-
34-
The motivation behind using a shared blackboard is to:
35-
36-
- **Avoid ROS 2 topic-based communication internally**, reducing unnecessary overhead and complexity.
37-
- **Improve real-time determinism**, as data access becomes local and predictable.
38-
- **Simplify integration and debugging**, by consolidating all system-relevant information in a single place.
39-
40-
The NavState contains data such as:
41-
42-
- the robot's estimated pose,
43-
- the current navigation goal,
44-
- planned paths,
45-
- velocity commands,
46-
- perception data,
47-
- and diagnostic or meta-state information.
48-
49-
By inspecting the NavState at runtime, developers gain full visibility into the internal state of EasyNav at any given moment. This approach not only improves transparency, but also enables advanced tooling for monitoring, introspection, and explainability.
50-
51-
Future versions of EasyNav may include graphical or CLI-based tools to explore and trace the NavState over time.
52-
53-
54-
Real-Time Execution Model
55-
=========================
56-
57-
Another key feature of EasyNav is its emphasis on **real-time performance**. The navigation system is designed to react with strict timing constraints, minimizing latency from perception to action.
58-
59-
To achieve this, EasyNav separates execution into two distinct control loops:
60-
61-
- **Real-Time Cycle**
62-
This loop is optimized for minimal end-to-end latency. Its goal is to process new sensor data and update the robot’s motion commands as quickly as possible. It includes:
63-
64-
- perception input processing,
65-
- pose prediction via odometry,
66-
- and velocity command generation (e.g., ``Twist`` or ``TwistStamped``).
67-
68-
- **Non-Real-Time Cycle**
69-
This loop handles operations where occasional execution delays are tolerable. Tasks in this loop include:
70-
71-
- map updates,
72-
- localization corrections based on perception (e.g., particle filter resampling),
73-
- and path planning.
74-
75-
.. image:: ../images/easynav_design.png
28+
.. image:: ../images/plugin_combinations.png
7629
:align: center
77-
:alt: EasyNav architecture diagram with the Real-Time and Non-Real-Time cycles.
78-
79-
80-
Each EasyNav module is configured with a frequency for both real-time and non-real-time cycles. These are specified in the parameters as `rt_freq` and `freq`, respectively.
30+
:alt: Plugin combinations
8131

82-
Additionally, when new perception data is received, the real-time cycle is **triggered immediately**, allowing the system to respond as fast as possible and minimize perception-to-action latency.
32+
This figure illustrates several possible plugin compositions. The key aspect is ensuring that the selected plugins are compatible with one another. For example, if a maps manager based on costmaps is chosen, the remaining plugins must either support this representation or operate independently of it. In practice, the localizer and planner are usually tightly coupled to the representation defined by the maps manager, whereas the controller tends to be more independent, since it typically relies on route formats that are relatively standardized.
8333

84-
This dual-cycle model balances **responsiveness** with **computational stability**, ensuring critical actions happen with deterministic timing while less urgent tasks are scheduled opportunistically.
34+
It is also possible to use *Dummy* plugins. Each component provides one in case you want to build an application that does not require that specific functionality. For example, a person-following application may not need either a map or a localizer, while an outdoor navigation application may rely on GPS for localization and simply plan a straight-line path to the target.
8535

8636

87-
Plugin Configuration
88-
====================
37+
.. image:: ../images/plugin_combinations_2.png
38+
:align: center
39+
:alt: Alternative plugin combinations
8940

90-
Let us examine the parameter file used in the *Getting Started* section. Each node loads its corresponding plugin by name. The following example shows how plugins are declared for each module:
41+
These plugin combinations are defined in the single EasyNav configuration file, where the plugins for each component and their execution frequencies are specified.
9142

9243
.. code-block:: yaml
9344
@@ -158,7 +109,7 @@ Let us examine the parameter file used in the *Getting Started* section. Each no
158109
use_sim_time: true
159110
position_tolerance: 0.1
160111
angle_tolerance: 0.05
161-
112+
162113
Each node declares one or more plugin types (e.g., `simple`) that can be dynamically selected. The plugin name (e.g., `easynav_simple_controller/SimpleController`) must match the name registered in the plugin system.
163114

164115
This design allows for easy experimentation with different algorithms or system behaviors simply by modifying configuration files—without changing any source code.
@@ -226,3 +177,61 @@ Below is an example configuration using dummy plugins for all components, effect
226177
angle_tolerance: 0.05
227178
228179
This configuration is especially useful for testing system integration, message flow, and user interfaces without requiring sensor data or a simulated robot. You can later replace dummy plugins with functional ones as needed.
180+
181+
182+
NavState: The Shared Blackboard
183+
===============================
184+
185+
A key architectural component of EasyNav is the **NavState**, a shared *blackboard* that holds all the internal state information required by the navigation system.
186+
187+
Each module in EasyNav—such as the Localizer, Planner, or Controller—reads its inputs from the NavState and writes its outputs back to it. This central structure replaces the need for internal ROS 2 communications between modules.
188+
189+
The motivation behind using a shared blackboard is to:
190+
191+
- **Avoid ROS 2 topic-based communication internally**, reducing unnecessary overhead and complexity.
192+
- **Improve real-time determinism**, as data access becomes local and predictable.
193+
- **Simplify integration and debugging**, by consolidating all system-relevant information in a single place.
194+
195+
The NavState contains data such as:
196+
197+
- the robot's estimated pose,
198+
- the current navigation goal,
199+
- planned paths,
200+
- velocity commands,
201+
- perception data,
202+
- and diagnostic or meta-state information.
203+
204+
By inspecting the NavState at runtime, developers gain full visibility into the internal state of EasyNav at any given moment. This approach not only improves transparency, but also enables advanced tooling for monitoring, introspection, and explainability.
205+
206+
Future versions of EasyNav may include graphical or CLI-based tools to explore and trace the NavState over time.
207+
208+
209+
Real-Time Execution Model
210+
=========================
211+
212+
Another key feature of EasyNav is its emphasis on **real-time performance**. The navigation system is designed to react with strict timing constraints, minimizing latency from perception to action.
213+
214+
To achieve this, EasyNav separates execution into two distinct control loops:
215+
216+
- **Real-Time Cycle**
217+
This loop is optimized for minimal end-to-end latency. Its goal is to process new sensor data and update the robot’s motion commands as quickly as possible. It includes:
218+
219+
- perception input processing,
220+
- pose prediction via odometry,
221+
- and velocity command generation (e.g., ``Twist`` or ``TwistStamped``).
222+
223+
- **Non-Real-Time Cycle**
224+
This loop handles operations where occasional execution delays are tolerable. Tasks in this loop include:
225+
226+
- map updates,
227+
- localization corrections based on perception (e.g., particle filter resampling),
228+
- and path planning.
229+
230+
Each EasyNav module is configured with a frequency for both real-time and non-real-time cycles. These are specified in the parameters as `rt_freq` and `freq`, respectively.
231+
232+
Additionally, when new perception data is received, the real-time cycle is **triggered immediately**, allowing the system to respond as fast as possible and minimize perception-to-action latency.
233+
234+
This dual-cycle model balances **responsiveness** with **computational stability**, ensuring critical actions happen with deterministic timing while less urgent tasks are scheduled opportunistically.
235+
236+
237+

_sources/getting_started/index.rst.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ To get started with **EasyNav**, we will use a simple example: a Turtlebot2 robo
1111

1212
.. code-block:: bash
1313
14-
sudo apt install ros-${ROS_DISTRO}-easynav-system
14+
sudo apt install ros-${ROS_DISTRO}-easynav-system ros-${ROS_DISTRO}-easynav-tools
1515
1616
2. From sources:
1717

@@ -31,12 +31,10 @@ To get started with **EasyNav**, we will use a simple example: a Turtlebot2 robo
3131

3232
.. code-block:: bash
3333
34-
git clone --recursive https://github.com/EasyNavigation/EasyNavigation.git
3534
git clone https://github.com/EasyNavigation/easynav_simple_stack.git
3635
git clone https://github.com/EasyNavigation/easynav_playground_kobuki.git
3736
git clone https://github.com/EasyNavigation/easynav_indoor_testcase.git
3837
39-
- The `EasyNavigation` repository contains the core framework of EasyNav.
4038
- The `easynav_simple_stack` repository provides a collection of plugins for a basic navigation stack. This stack is characterized by its use of a 2D occupancy grid, where each cell can be either free (`0`) or occupied (`1`).
4139
- The `easynav_playground_kobuki` repository includes everything needed to simulate a Turtlebot2 robot, also known as Kobuki.
4240
- The `easynav_indoor_testcase` repository provides you with maps and param files for some test cases.

0 commit comments

Comments
 (0)