# Implementing a boustrophedon algorithm in a given room with obstacles

I have a mobile robot which is navigating around a room, I already have the map of the room. I am using the navigation_stack of ROS. I am using rotary encoders for odometry. I am fusing the data from Rotary encoders and IMU using robot_pose_ekf. I am using amcl for localization and move_base for planning.

Now, I have to write a Complete coverage Path planning algorithm and I am following this paper and I would like to ask what is the best way to generate the Boustrophedon path (simple forward and backward motions) in a cell (can be rectangular, trapezium, etc.) with no obstacles? I read a paper where they use different templates and combine them in a certain way to come up with the Boustrophedon path. Is there any other way by which we can generate the boustrophedon path? If someone can suggest how to implement it in ROS, that will be great.

I implemented something like this in College:

https://github.com/Auburn-Automow/au_automow_common/tree/master/automow_planning

Basically we just passed the vertices of the boustrophedon path as goals to move_base. Here's a video of a bag file being played back:

Here's the class paper we did for the planner:

https://github.com/ashgti/elect6350/tree/master/final_project

Maybe something in there will give you some ideas. In our case we didn't need to do much cell decomposition in the competition, and instead we relied on the obstacle avoidance of move_base, but in our paper we did show our implementation working with more complex scenarios:

https://github.com/ashgti/elect6350/blob/master/final_project/images/obstacle.pdf

The thing I took away from the experience was that move_base is great for eventually getting from point A to point B and avoiding obstacles along the way, but it was very hard to tune it to follow the path our planner had come up with. As you can imagine when mowing grass you want to follow the path as closely as possible, diverging only when absolutely necessary to avoid obstacles. This was hard to accomplish with move_base.

So YMMV, but move_base is at least a starting place. Hopefully some of the stuff I linked will be useful. Good luck!