7. RTAB-Map 3D mapping navigation

wiki: http://wiki.ros.org/rtabmap_ros

7.1. Introduction

This package is a ROS function package for RTAB Map, an RGB-D SLAM method based on a global loop closure detector with real-time constraints. This package can be used to generate 3D point clouds of environments and create 2D occupancy raster maps for navigation.

Overview

As can be seen from the above figure, Monte Carlo positioning amcl is not required. RTAB Map has its own positioning function; if used, it will cause repeated positioning and positioning failure. When using RTAB Map to navigate the core framework, the initialized map is provided by RTAB Map, not map_server.

7.2. Map construction and use

Note: When building a map, the slower the speed, the better the effect (note that the rotation speed should be slower). If the speed is too fast, the effect will be poor.

According to different models, you only need to set the purchased model in [.bashrc], X1 (normal four-wheel drive) X3 (Mailun) Take X3 as an example

Open the [.bashrc] file

Find the [ROBOT_TYPE] parameters and modify the corresponding car model

7.2.1. Start

Start the underlying driver command (robot side)

<PI5 needs to open another terminal to enter the same docker container

image-20240408144126098

Command to start mapping or navigation (robot side)

Start visualization (virtual machine)

Keyboard control node (virtual machine)

7.2.2. Map construction

After starting according to the above method, choose any method to control the mapping (handle control is recommended); the slower the speed when constructing the map, the better the effect (especially the angular speed); the robot will cover the area to be mapped and the map will be as closed as possible.

image-20220228113707763

When the map construction is completed, directly [ctrl+c] exit the map construction node, and the system will automatically save the map. The default saving path of the map is [~/.ros/rtabmap.db].

View tf tree

rtabframes

Node view

rtabrosgraph

As can be seen from the above figure, the information that the [rtabmap] node needs to subscribe to: radar data, camera data, and tf data.

7.3. Navigation and obstacle avoidance

Note: [R2] on the remote control handle has the function of canceling the target point.

Start the underlying driver command (robot side)

Command to start mapping or navigation (robot side)

Start visualization (virtual machine)

Keyboard control node (virtual machine)

When the navigation mode is turned on, the system automatically loads the 2D raster map. It cannot directly load the 3D map and needs to be loaded manually.

image-20220228113955497

Load the three-dimensional map (1, 2, 3), 4 is to add the rviz debugging tool.

image-20220228114110223

At this time, you can manually add [MarkerArray] to facilitate multi-point navigation and observation, and adjust [rviz] display parameters according to needs, such as the size of lidar points.

7.3.1. Single-point navigation

7.3.2. Multi-point navigation

7.3.3. Parameter configuration

After starting the navigation function, open the dynamic parameter adjustment tool, adjust according to your own needs, and observe the robot's motion status until the effect is optimal. Record the current parameters and modify them to the corresponding dwa_local_planner_params.yaml file under the yahboomcar_nav function package.

image-20220223154728183

Looking at the yahboomcar_navigation.launch file, we can see that the navigation parameters are modified in the move_base.launch file under the yahboomcar_rtabmap_nav function package.

Find the move_base.launch file and open the example file as follows. It can be modified and replaced according to your needs. At this time, [DWA Planner] is selected and the [DWA] file is loaded.

Note: When using the DWA planner, the difference between an omnidirectional car and a differential car lies in whether the speed in the Y direction is 0. There are clear comments in it, which can be modified according to the actual situation.

Enter the dwa_local_planner_params.yaml file under the yahboomcar_nav function package. Some parameters are as follows:

Other parameter files can be opened, combined with comments and courseware, and modified according to your own needs.

7.4, node rtabmap

This is the master node for this package. It is a wrapper around the RTAB mapping core library. Here, when loop closure is detected, the map is incrementally built and optimized. The node's online output is this map, which contains the latest data added to the map. The default location of the RTAB map database is [.ros/rtabmap.db], and the workspace is also set to [.ros].

7.4.1. Subscribe to topics

NameTypeParse
odomnav_msgs/OdometryOdometry. If the parameter subscribe_depth or subscribe_stereo is true; and odom_frame_id is not set, this is a required parameter.
rgb/imagesensor_msgs/ImageRGB/monocular image.
rgb/camera_infosensor_msgs/CameraInfoRGB camera parameters.
depth/imagesensor_msgs/ImageDepth image.
scansensor_msgs/LaserScanSingle line laser.
scan_cloudsensor_msgs/PointCloud2Laser scanning point cloud stream.
left/image_rectsensor_msgs/ImageLeft eye correction image.
left/camera_infosensor_msgs/CameraInfoLeft eye camera parameters.
right/image_rectsensor_msgs/ImageRight eye correction image.
right/camera_infosensor_msgs/CameraInfoRight eye camera parameters.
goalgeometry_msgs/PoseStampedPlan a path to achieve this goal using the current online map.
rgbd_imagertabmap_ros/RGBDImageRGB-D sync image, only if subscribe_rgbd is true.

7.4.2. Publishing topics

NameTypeParse
infortabmap_ros/Infortabmap information.
mapDatartabmap_ros/MapDatartabmap's graph and latest node data.
mapGraphrtabmap_ros/MapGraphrtabmap’s graph
grid_mapnav_msgs/OccupancyGridMap occupancy grid generated by laser scanning.
proj_mapnav_msgs/OccupancyGridDeprecated, use /grid_map instead of Grid/FromDepth=true
cloud_mapsensor_msgs/PointCloud2A 3D point cloud generated from a local raster.
cloud_obstaclessensor_msgs/PointCloud2Generate a 3D point cloud of obstacles from a local mesh.
cloud_groundsensor_msgs/PointCloud2A 3D ground point cloud generated from a local raster.
scan_mapsensor_msgs/PointCloud23D point cloud generated by 2D scan or 3D scan.
labelsvisualization_msgs/MarkerArrayConvenient way to display graph labels in RVIZ.
global_pathnav_msgs/PathThe planning pose of the global path. Published only once per planned path.
local_pathnav_msgs/PathPlan the future local pose corresponding to the global path. Published every time the map is updated.
goal_reachedstd_msgs/BoolPlan status message whether the goal was successfully achieved.
goal_outgeometry_msgs/PoseStampedPlan the current metric goal sent from rtabmap's topology planner. For example, you can connect to move_base via move_base_simple/goal.
octomap_fulloctomap_msgs/OctomapGet octomap. Only available if rtabmap_ros is built with octomap.
octomap_binaryoctomap_msgs/OctomapGet octomap. Only available if rtabmap_ros is built with octomap.
octomap_occupied_spacesensor_msgs/PointCloud2Point cloud of octomap occupied space (obstacles and ground). Only available if rtabmap_ros is built with octomap.
octomap_obstaclessensor_msgs/PointCloud2Point cloud of obstacles on octomap. Only available if rtabmap_ros is built with octomap.
octomap_groundsensor_msgs/PointCloud2Point cloud of octomap. Only available if rtabmap_ros is built with octomap.
octomap_empty_spacesensor_msgs/PointCloud2The empty point cloud of octomap. Only available if rtabmap_ros is built with octomap.
octomap_gridnav_msgs/OccupancyGridProject an octomap into a 2D occupancy grid map. Only available if rtabmap_ros is built with octomap.

7.4.3, Service

NameTypeParse
get_maprtabmap_ros/GetMapCall this service to get a standard 2D occupancy grid.
get_map_datartabmap_ros/GetMapCall this service to get map data.
publish_maprtabmap_ros/PublishMapCall this service to publish map data.
list_labelsrtabmap_ros/ListLabelsGet the current labels of the graph.
update_parametersstd_srvs/EmptyThe node will be updated with the current parameters of the rosparam server.
resetstd_srvs/EmptyDelete the map.
pausestd_srvs/EmptyPause mapping.
resumestd_srvs/EmptyResume mapping.
trigger_new_mapstd_srvs/EmptyWill start a new map.
backupstd_srvs/EmptyBack up the database to "database_path.back" (default ~/.ros/rtabmap.db.back).
set_mode_localizationstd_srvs/EmptySet pure localization mode.
set_mode_mappingstd_srvs/EmptySet mapping mode.
set_labelrtabmap_ros/SetLabelSet the label to the latest node or the specified node.
set_goalrtabmap_ros/SetGoalPlan and set topology goals.
octomap_fulloctomap_msgs/GetOctomapGet octomap. Only available when rtabmap_ros is built with octomap
octomap_binaryoctomap_msgs/GetOctomapGet octomap. Only available when rtabmap_ros is built with octomap

7.4.4. Parameters

nametypedefault valueparse
subscribe_depthbooltrueSubscribe to depth image
subscribe_scanboolfalseSubscribe to lidar data
subscribe_scan_cloudboolfalseSubscribe to laser 3D point cloud
subscribe_stereoboolfalseSubscribe to stereo images
subscribe_rgbdboolfalseSubscribe to rgbd_image topic
frame_idstringbase_linkThe frame to connect to the mobile base.
map_frame_idstringmapThe coordinate system attached to the map.
odom_frame_idstring‘ ’The coordinate system attached to the odometer.
odom_tf_linear_variancedouble0.001When using odom_frame_id, the first 3 values of the diagonal of the 6x6 covariance matrix are set to this value.
odom_tf_angular_variancedouble0.001When using odom_frame_id, the last 3 values of the 6x6 covariance matrix diagonal are set to this value
queue_sizeint10Message queue size per synchronization topic.
publish_tfbooltruePublish TF from /map to /odom.
tf_delaydouble0.05 
tf_prefixstring‘ ‘The prefix to be added to the generated tf.
wait_for_transformbooltrueThe wait for the transform while the tf transform is still unavailable (the maximum wait time for the transform is seconds).
wait_for_transform_durationdouble0.1The waiting time of wait_for_transform.
config_pathstring‘ ’Path to the configuration file containing RTAB mapping parameters. Parameters set in the startup file will override parameters in the configuration file.
database_pathstring.ros/rtabmap.dbThe path of the rtabmap database.
gen_scanboolfalseGenerate a laser scan from a depth image (using the middle horizontal line of the depth image). Not generated if subscribe_scan or subscribe_scan_cloud is true.
gen_scan_max_depthdouble4.0The maximum depth of the generated laser scan.
approx_syncboolfalseSynchronize using the approximate time of the input message. If false, note that the odometry input must have exactly the same timestamp as the input image
rgbd_camerasint1Number of RGB-D cameras to use (when subscribe_rgbd is true). Currently, up to 4 cameras can be synced simultaneously.
use_action_for_goalboolfalseuse actionlib sends the metric target to move_base.
odom_sensor_syncboolfalseAdjust the image and scan pose relative to the odometry pose for each node added to the graph.
gen_depthboolfalseGenerate a depth image from the scanned cloud projection to the RGB camera, taking into account the displacement of the RGB camera based on odometry and lidar frames.
gen_depth_decimationint1Reduce the image size of the received camera information (create a smaller depth image)
gen_depth_fill_holes_sizeint0Fill empty pixels to this size. Interpolates values from adjacent depth values. 0 means disabled.
gen_depth_fill_iterationsdouble0.1Maximum depth error to interpolate (m).
gen_depth_fill_holes_errorint1Number of iterations to fill holes.
map_filter_radiusdouble0.0Load data for only one node in the filter radius (using the latest data) up to the filter angle (map filter angle).
map_filter_angledouble30.0The angle to use when filtering nodes before creating the map. Reference map_filter_radius
map_cleanupbooltrueIf there are no map cloud maps, raster maps, or project maps subscribed to, clear the corresponding data.
latchbooltrueIf true, the last message posted on the map topic will be saved.
map_always_updatebooltrueAlways update the occupancy raster map
map_empty_ray_tracingbooltruePerform ray tracing to fill the unknown space of invalid 2D scan rays (assuming invalid rays are infinite). Only used if map_always_update is also true.

7.4.5, tf conversion

what is needed:

which provided:

map → odom

7.5, node rtabmapviz

This node starts the visual interface of RTAB-Map. It is a wrapper for the RTAB-MapGUI library. Its purpose is the same as rviz, but with specific options for RTAB-Map.

RGB-D Mapping

7.5.1. Subscribe to topics

NameTypeParse
odomnav_msgs/OdometryOdometry. Required if the parameters subscribe_depth or subscribe_stereo are true and odom_frame_id is not set.
rgb/imagesensor_msgs/ImageRGB/monocular image. If the parameter subscribe_stereo is true, this option is not required (left/image_rect is used instead).
rgb/camera_infosensor_msgs/CameraInfoRGB camera metadata. If the parameter subscribe_stereo is true, this option is not required (left/camera_info is used instead).
depth/imagesensor_msgs/ImageRegister depth image. Required if parameter subscribe_depth is true.
scansensor_msgs/LaserScanLaser scan stream. Required if parameter subscribe_scan is true.
scan_cloudsensor_msgs/PointCloud2Laser scan stream. Required if parameter subscribe_scan_cloud is true.
left/image_rectsensor_msgs/ImageLeft eye correction image. Required if parameter subscribe_stereo is true.
left/camera_infosensor_msgs/CameraInfoLeft eye camera parameters. Required if parameter subscribe_stereo is true.
right/image_rectsensor_msgs/ImageRight corrected image. Required if parameter subscribe_stereo is true.
right/camera_infosensor_msgs/CameraInfoRight eye camera parameters. Required if parameter subscribe_stereo is true.
odom_infortabmap_ros/OdomInfoRequired if the parameter subscribe_odom_info is true.
infortabmap_ros/InfoStatistical information of rtabmap.
mapDatartabmap_ros/MapDatartabmap’s chart and latest node data.
rgbd_imagertabmap_ros/RGBDImageRGB-D synchronized image, only when subscribe_rgbd is true.

7.5.2. Parameter configuration

nametypedefault valueparse
subscribe_depthboolfalseSubscribe to depth image
subscribe_scanboolfalseSubscribe to lidar data
subscribe_scan_cloudboolfalseSubscribe to the laser scanning point cloud.
subscribe_stereoboolfalseSubscribe to stereo images.
subscribe_odom_infoboolfalseSubscribe to odom information messages.
subscribe_rgbdboolfalseSubscribe to rgbd_image topic.
frame_idstringbase_linkThe coordinate system connected to the mobile base.
odom_frame_idstring‘ ’The coordinate system of the odometer. If empty, rtabmapviz will subscribe to the odom topic to get odometry. If set, gets the odometer from tf.
tf_prefixstring‘ ‘The prefix to be added to the generated tf.
wait_for_transformboolfalseWait for a transform (up to 1 second) when the tf transform is still not available.
queue_sizeint10Message queue size per synchronization topic.
rgbd_camerasint1Number of RGB-D cameras to use (when subscribe_rgbd is true). Currently, up to 4 cameras can be synced simultaneously.

7.5.3. Required tf conversion