[Nav2] New Complete Coverage Planning Capabilities!

Hi there - your friendly neighborhood navigator here with exciting news!

Complete Coverage Navigator, Server, Behavior Tree, and Demo!

In close partnership with Bonsai Robotics, there is a brand new, major feature available to the ROS Community! Complete Coverage Navigator, Server, Behavior Tree, and Demo!


This server it built using the fabulous Fields2Cover library enabling modular coverage algorithms to be composed for a complete application. This server wraps it - with the ability to be extended with new features from F2C or new capabilities within the server itself - as a Nav2 Task Server analogous to the Planner Server used for point-to-point navigation in Nav2.

That means you can visualize the paths, call the action to obtain a result, and so forth as a drop-in replacement for coverage-style tasks easily! How about a demo?

This video shows a full simulation where:

  • The navigation system is brought up without a planner server at all, only the coverage server
  • The CoverageNavigator is invoked using a nav2_simple_commander style API to perform a navigation task for complete coverage of a given field
  • The BT XML is configured to call the coverage server and then naively provide the path to the Controller Server running the RPP controller. This uses new BT nodes for the Coverage Server also included in this work!
  • And presto!

The server can provide you with the specific swath-row and turn-path components separated so you can perform operations in the rows separate of those of the turns (e.g. for agricultural tooling, perhaps). It can also provide the full sequence as a nav_msgs/Path for simple following for cleaning tasks or testing like shown above. The field parameters are fully reconfigurable via the Action goal, default parameters set on bringup, or using dynamic parameters all.

It has 90%+ unit test coverage and great documentation you can see in the repo below! Documentation on Coverage Server — Nav2 1.0.0 documentation available now!

Hey Friendly Neighborhood Navigator man, why is this not in Nav2 itself?

Great question, my curious inquirer. There are three major reasons:

  1. The Fields2Cover library is very powerful, but missing some important advanced features that I feel are necessary to consider this a “complete” solution to the problem sufficiently to be used for all ‘normal’ coverage applications. You can read more about what’s missing in the README, but the highlights are around the final-touches. I would love your help from the community to tackle some of these so that we can!

  2. Fields2Cover is currently not available in binary formats and must be built from source. That may change shortly, but for the moment, that means it would block Nav2 otherwise from binary release jobs passing successfully, so a temporary separation is required.

  3. As part of the launch of Open Navigation LLC, the rootin-tootin best place for all your navigation and navigation accessories, we want to start supplying additional advanced features from partnerships with companies, organizations, and researchers worldwide. Some of these features may be WIP for long stretches, licensed restrictively, or sufficiently complex and specialized that merging them into Nav2 itself would cause some headaches or misunderstandings with the community.

As such, it makes sense for us to start a trend of having users check out our GitHub Organization for these things that may be more appropriate to live in Open Navigation’s domain than Nav2/ros-planning. I hope that makes sense, but if anyone has concerns about this, I’m happy to chat about it.

PS Please thank Bonsai Robotics for their commendable donation to the ROS community! Bonsai is hiring here.

Special thanks to @emersonknapp for his awesome ros-tooling work which made setting up CI a breeze using Github Actions!


Hello! This is very exciting indeed. I am trying to understand how to run the opennav_coverage and I really don’t get it. I have completed the nav2 installation and played a bit with the given robot/example though! Any quick words about how to get it running in order to import a field and get the path?! Thanks a lot in advance!! :slight_smile:

Check out the python scripts of the demo and the behavior trees! You should be easily able to track down where the polygons and/or field row descriptions are stored. The README also contains alot of great information!

OK I started by cloning the opnennav_coverage git repository and now I will re-read the readme… thanks a lot for the quick reply!

Hi, I’m new to ROS2 and Nav2. I also have a lot of trouble trying to use opennav_coverage to plan a coverage path for my pre-generated map with slam_toolbox. I have tried reading the python script and README but I still don’t know what to do. Could you please give me a little more detail? Thank you.