What is Move Base Flex
Move Base Flex is a navigation stack that is an extension of the Move Base navigation stack, with a lot of great features. The package allows us to easily load/unload planners and controllers on the fly, and even run multiple planning algorithms concurrently. The code base is highly flexible and modular, which makes it perfect for our application.
In a nutshell, this package handles all the interactions between the planner, the controller (which is what they call their local planner) and recovery behaviors, and also provides action server for sending and keeping track of goals. These are supposed to be implemented as classes and are dynamically loaded/unloaded in the memory using the ROS pluginlib.
What all do we need to implement
These classes are purely abstract. We need to make our own global planner, local planner and recovery classes that inherit from these classes, and implement the pure virtual functions of these classes.
In addition to this, the abstract_navigation_server is also a pure abstract class. This is the main class that runs the entire navigation stack. We need to make our own navigation server class that inherits from the abstract_navigation_server and implement the pure virtual functions of these classes.
There are abstract classes for controlling the planner, controller, and recovery execution as well, but these are not pure abstract classes, and their functions have already been implemented by move_base_flex. However, if we want to change the way our planner, controller, and recovery behaviors execute and tie in with our navigation server, we can inherit from these classes and implement those functions that we want to change.
After all this is done, we can write a simple node that instantiates the navigation server class we implemented, and the rest will be taken care of by the package.
To know more about the blocks that have to be implemented, go to the pages below:
- Navigation Server Class
- Plugin Classes
- Planner
- Controller
- Recovery Behavior
- Execution Classes
- Planner Execution Class
- Controller Execution Class
- Recovery Execution Class
You can also look at the experimental implementations of these classes. My experimental plugins just make dummy plans and give dummy velocity commands. The mbf_experimental_nav package has the implementations for the the Navigation Server Class (called ExperimentalNavigationServer) and the implementations for the experimental plugins is in the mbf_experimental_core package (having ExperimentalPlanner, ExperimentalController and ExperimentalRecovery classes).