Tutorial: Navigation¶
Once you have Fetch or Freight running, you can start navigating. Fetch and Freight ship with configurations for using the ROS Navigation Stack. A number of tutorials related to navigation can be found in the documentation on the ROS Wiki.
Running Navigation in Gazebo Simulation¶
To run navigation in simulation, launch the navigation launch file
from the fetch_gazebo_demo
package:
>$ roslaunch fetch_gazebo_demo fetch_nav.launch
Running Navigation on a Real Robot¶
When running navigation on a robot, first you will need to build a map,
See the next section for a how-to. Then you will need to supply the map
to the navigation launch file from the fetch_navigation
package:
>$ roslaunch fetch_navigation fetch_nav.launch map_file:=/path/to/map.yaml
Building A Map¶
The launch file for navigation in Gazebo depends on a pre-built map of the environment. In order to use navigation in the real world, you will need to first build a map of your environment:
>$ roslaunch fetch_navigation build_map.launch
Once you launch build_map, you will want to tele-operate the robot the robot around and build the map, which can be visualized in RVIZ.
Note
The build_map.launch file is not intended to be run at the same time as fetch_nav.launch
While driving the robot around, you can view the map in RVIZ. Once you are happy with the map, you can save the map:
>$ rosrun map_server map_saver -f <map_directory/map_name>
The map saver will create two files in the specified
map_directory
. The directory must already exist.
The two files are map_name.pgm and map_name.yaml.
The first is the map in a .pgm
image format, and
the second is a YAML file that specifies metadata for the image.
These files can then be served by the map_server:
>$ rosrun map_server map_server <map.yaml>
The fetch_nav.launch file used above launches an instance of map_server. It has three arguments which control the behavior:
Argument |
Meaning |
---|---|
map_file |
YAML file containing map metadata |
map_keepout_file |
Additional YAML file containing metadata for a keepout map |
use_keepout |
Whether to load and use a keepout map (default: False) |
You can either pass the arguments from the command line, like:
>$ roslaunch fetch_navigation fetch_nav.launch map_file:=/path/to/map.yaml
Or create a new launch file in your own package which includes launch file and passes in arguments:
<launch>
<include file="$(find fetch_navigation)/launch/fetch_nav.launch" >
<arg name="map_file" value="$(find my_package)/maps/my_map.yaml" />
<arg name="map_keepout_file" value="$(find my_package)/maps/my_keepout_map.yaml" />
<arg name="use_keepout" value="true" />
</include>
</launch>
The “keepout” map can be created by copying the YAML file of your saved map,
editing the name of the .pgm
file and then copying the .pgm
file.
You can then open the .pgm
file in an image editor, such as GIMP, and
black out areas that you do not want the robot to drive through. This must be
done in a separate map that is only used for planning so that the edits do
not disturb the functionality of localization (AMCL).
Sending Waypoints¶
The easiest way to send a goal to the navigation stack is using RVIZ and the
2D Nav Goal
button. See the tutorial on using RVIZ with navigation in the RVIZ
documentation
However, you probably want to program your robot. There is a
tutorial
on commanding the robot with C++. For examples in Python, look at the demo.py
code in the fetch_gazebo_demo
package.