SLAM(同步定位与地图构建),是指运动物体根据传感器的信息,一边计算自身位置,一边构建环境地图的过程,解决机器人等在未知环境下运动时的定位与地图构建问题。激光SLAM所需要的传感器一般有激光雷达(Lidar)、惯性测量单元(IMU)、里程计(Odometry)。由于 IMU 具有较高的角速度测量精度,相比IMU里程计具有较高的局部位置测量精度,一般用IMU计算角度信息,里程计计算位置信息,配合激光雷达进行SLAM过程。

Cartographer是google的工程师开发的一个用于室内实时建图的SLAM解决方案。总体上可以看作是由局部地图更新和全局回环检测两个部分构成。 在局部地图更新过程中,通过最优位姿估计,把激光扫描数据插入到当前维护的子图(submap)中。。
这次我们使用的是纯雷达建图指不依靠IMU或者里程计信息,只使用雷达的深度点云进行建图

使用的工具:激光雷达rplidar_X3+ubuntu20.04+ROS noetic版本(雷达选择其他品牌也可以)

1.启动激光雷达

x3雷达使用
雷达启动参考上面教程,这里我们只执行启动程序:

roslaunch ydlidar_ros_driver X2.launch

2.修改revo_lds.lua文件

文件路径:~/catkin_google_ws/src/cartographer_ros/cartographer_ros/configuration_files/revo_lds.lua

记得提前备份修改的文件,然后将下面代码复制,替换即可,
-- Copyright 2016 The Cartographer Authors
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--      http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
  map_builder = MAP_BUILDER,
  trajectory_builder = TRAJECTORY_BUILDER,
  map_frame = "map",
  tracking_frame = "laser_frame",
  published_frame = "laser_frame",
  odom_frame = "odom",
  provide_odom_frame = true,
  publish_frame_projected_to_2d = false,
  use_pose_extrapolator = true,
  use_odometry = false,
  use_nav_sat = false,
  use_landmarks = false,
  num_laser_scans = 1,
  num_multi_echo_laser_scans = 0,
  num_subdivisions_per_laser_scan = 1,
  num_point_clouds = 0,
  lookup_transform_timeout_sec = 0.2,
  submap_publish_period_sec = 0.3,
  pose_publish_period_sec = 5e-3,
  trajectory_publish_period_sec = 30e-3,
  rangefinder_sampling_ratio = 1.,
  odometry_sampling_ratio = 1.,
  fixed_frame_pose_sampling_ratio = 1.,
  imu_sampling_ratio = 1.,
  landmarks_sampling_ratio = 1.,
}

MAP_BUILDER.use_trajectory_builder_2d = true

TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10.
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1

POSE_GRAPH.optimization_problem.huber_scale = 1e2
POSE_GRAPH.optimize_every_n_nodes = 35
POSE_GRAPH.constraint_builder.min_score = 0.65

return options

3.修改demo_revo_lds.launch文件

文件路径:~/catkin_google_ws/src/cartographer_ros/cartographer_ros/launch/demo_revo_lds.launch

<!--
  Copyright 2016 The Cartographer Authors

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->


<launch>
  <param name="/use_sim_time" value="true" />

  <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename revo_lds.lua"
      output="screen">
    <remap from="scan" to="scan" />
  </node>

  <node name="rviz" pkg="rviz" type="rviz" required="true"
      args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />" 
</launch>

复制粘贴即可

修改完之后,回到cartographer_ws 目录下再次编译:

catkin_make_isolated --install --use-ninja

编译完成后进行测试

1.启动雷达节点
roslaunch ydlidar_ros_driver X2.launch
2.运行cartographer
roslaunch cartographer_ros demo_revo_lds.launch

然后在rviz中可以看到地图数据

然后我们添加话题,移动雷达就可以看到位置移动轨迹

至此纯雷达slam就大功告成了!!!