Navigation in ROS2
Map building in ROS2
A map is a picture of the area in which the robot is working. A map is used by the robot to plan and localize its trajectories. An occupancy grid map is what a map is in ROS. In plain English, each map cell represents an obstacle by having a certain value. We require a robot with LIDAR, odometry, and the robot environment in order to create a map.
SLAM Simultaneous Localization and Mapping (SLAM) will locate the robot while also making a map. SLAM algorithms are used to make maps of uncharted environments while simultaneously being aware of where the robot is. Cartographer and SLAM-Toolbox are two excellent SLAMs for ROS2.
Cartographer
Cartographer (https://opensource.google/projects/cartographer) is a system that offers real-time simultaneous localization and mapping (SLAM) in 2D and 3D across numerous platforms and sensor configurations. Google creates cartographer, and they have been mapping building interiors using Google Street View.
Cartographer ros is a ROS wrapper for cartographer that enables integration with ROS (https://google-cartographer-ros.readthedocs.io/en/latest/). This is fantastic since you can utilize only the pre-built packages and precisely configure them for your robot. In this unit, this procedure is detailed.
This section will describe the robot's launch file for the cartographer. The primary advantage of a launch file is the ability to launch many nodes from a single file and set a node-specific parameter. The parameters may be supplied in the launch file or loaded from a YAML file. We must launch two nodes in order to launch "cartographer."
1. Launch of the cartographer_node
- The cartographer_node is provided by the package cartographer_ros
- The executable is called cartographer_node
- The parameters it requires are: 1. use_sim_time : is a boolean indicating whether the node must synchronize its time with the simulation
The arguments are: 1. configuration_directory : the directory where to find the configuration files 2. configuration_basename : the config file name
package='cartographer_ros' executable='cartographer_node', name='cartographer_node', output='screen', parameters=[{'use_sim_time': True}], arguments=['-configuration_directory', cartographer_config_dir, '-configuration_basename', configuration_basename]
- Create a new package in ros2_ws workspace named cartographer_slam inside the src/ directory.
- Create launch & config directories at ros2_ws/src/cartographer_slam
- Write a launch file to launch cartographer with the name cartographer.launch.py where the two nodes are launched
- Create an LUA file named cartographer.lua in the config directory with the following config parameters:
- Compile everything
- Launch your program
- code
- ros2 launch cartographer_slam cartographer.launch.py
- Launch RVIZ to see the map being created. You will configure RVIZ to show the data you want to control
- Add the map display in RVIZ and configure it to see the map you are generating
You must launch an executable named map saver, which launches a map saver node from nav2 map server, in order to save the map you've made. When saving the map, call the node inside the directory.
cd ~/ros2_ws/src/cartographer_slam/config ros2 run nav2_map_server map_saver_cli -f turtlebot_area
Note:: Never invoke the map saver before closing the Cartographer node. If not, you will lose the map you made.
The command to save will produce two files: The map is represented by the occupancy grid image in the name.pgm file. The name.yaml file gives information about the map's resolution.
Example of YAML File of the Map.
image: turtlebot_area.pgm mode: trinary resolution: 0.05 origin: [-5.9, -5.22, 0] negate: 0 occupied_thresh: 0.65 free_thresh: 0.25
image: Name of the file containing the image of the generated map.
resolution: Resolution of the map (in meters/pixel).
origin: Coordinates of the lower-left pixel on the map. These coordinates are given in 2D (x, y, z). The third value indicates rotation. If there is no rotation, the value will be 0.
occupied_thresh: Pixels with a value greater than this value will be considered an occupied zone (marked as an obstacle)
free_thresh: Pixels with a value smaller than this will be considered a completely free zone.
negate: Inverts the colors of the map. By default, white means completely free, and black means completely occupied.
Map_server
Nav2_lifecycle_manager
Data required to launch each node:-
- For the launch of the map_server node
These are the fields you need to indicate in the node launch:
The map_server is provided by the package nav2_map_server
The executable is called map_server
The parameters it requires are:
- use_sim_time : is a boolean indicating if the map_server must synchronize its time with the simulation.
- yaml_filename : is the complete path to the map yaml file.
package='nav2_map_server', executable='map_server', name='map_server', output='screen', parameters=[{'use_sim_time': True}, {'yaml_filename':map_file} ]),
- For the launch of the lifecycle_manager node
- This node manages the lifecycle of nodes involved in navigation
- The lifecycle_manager is provided by package nav2_lifecycle_manager.
- The executable is called lifecycle_manager.
- Parameters required:
- use_sim_time : is a boolean indicating whether the map_server must synchronize its time with the simulation
- autostart : is a boolean that indicates if the lifecycle manager has to start when launched.
- node_names : is a list with the names of the nodes that the lifecycle manager has to take care of. So far, only the map_server
package='nav2_lifecycle_manager', executable='lifecycle_manager', name='lifecycle_manager_mapper', output='screen', parameters=[{'use_sim_time': True}, {'autostart': True}, {'node_names': ['map_server']}])
Steps for creating a map_server launch file:
- Create a map_server package in ros2_ws
- Create a launch directory inside that package, with a launch file named nav2_map_server.launch.py
- In the launch file, include the launch of the two nodes required to have a map server running:
- Map_server
- Nav2_lifecycle_manager
- Create a config directory inside that package and put inside it the map files you generated.
- Launch the map server loading the map in the config directory, and visualize the map in RVIZ.
Localization of a Robot in an Environment
Knowing one's location in relation to their surroundings is referred to as localization. In your situation, the robot needs to be aware of its location and orientation in relation to its surroundings, i.e. the world map that was made in the previous unit. This is referred to as a robot's "position." AMCL(Adaptive Monte-Carlo Localization)., an extremely reliable localization algorithm in ROS. For a robot moving in two dimensions, t is a probabilistic localization mechanism. It employs Dieter Fox's adaptive (or KLD-sampling) Monte Carlo localization method, which uses a particle filter to compare a robot's pose to a predetermined map. When someone publishes a transform between the /map frame and the /odom frame, a ROS robot is located. This implies that the robot's /odom frame is aware of its position in relation to the /map frame. As a result of its direct connection to the /odom frame through its /base link frame, the robot is aware of its location on the map. When everything is in order, that transform is published by the AMCL. We'll examine how to set up AMCL to publish that transformation.
How to do localization in ROS2
You need to launch three nodes:
- The map server provides the map to the localization algorithm
- The localization algorithm
- The life cycle manager
1. Launch of the map_server node
These are the fields you need to indicate in the node launch:
- The map_server is provided by the package nav2_map_server
- The executable is called map_server
- The parameters it requires are:
- use_sim_time : is a boole
- use_sim_time : is a boolean indicating if the map_server must synchronize its time with the simulation.
- yaml_filename : is the complete path to the map yaml file