简单说下原理:就是用Grid(2D/3D)的形式建地图;局部匹配直接建模成一个非线性优化问题,利用IMU提供一个比较靠谱的初值;后端用Graph来优化,用分支定界算法来加速;2D和3D的问题统一在一个框架下解决。(引用知乎--邵天兰)
由于cartographer的局部匹配算法,以及优化算法效果惊人,所以尽管在只使用激光的前提下都能得出不错的效果,以下配置加入了里程计信息,IMU信息也是可以作为一个可选项加入。
这里只需要创建三个文件:
1、在cartographer_ros/launch下新建 backpack_rplidar.launch文件
backpack_2d.urdf:主要存储了imu,以及水平雷达,竖直型雷达一些配置信息,默认就可以
robot_state_publisher:主要用来处理各种坐标的包,不做更改
是把 /echoes 的话题重映射到 /horizontal_laser_2d
2、在 cartographer_ros/configuration_files下新建backpack_2d_rplidar.lua
include "map_builder.lua"
options = {
map_builder = MAP_BUILDER,
map_frame = "map",
tracking_frame = "base_link",
published_frame = "base_link",
odom_frame = "odom",
provide_odom_frame = true,
use_odometry_data = false,
use_constant_odometry_variance = false,
constant_odometry_translational_variance = 0.,
constant_odometry_rotational_variance = 0.,
use_horizontal_laser = true,
use_horizontal_multi_echo_laser = false,
horizontal_laser_min_range = 0.3,
horizontal_laser_max_range = 8.,
horizontal_laser_missing_echo_ray_length = 0.,
num_lasers_3d = 0,
lookup_transform_timeout_sec = 0.2,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
}
MAP_BUILDER.use_trajectory_builder_2d = true
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
SPARSE_POSE_GRAPH.optimization_problem.huber_scale = 1e2
return options
这里主要包含了机器人上使用到的传感器信息,以及扫描的距离信息等,可以根据自己的机器人进行配置
3、cartographer_ros/launch下新建demo_rplidar_2d.launch
重新编译工作空间,至此goole建图的配置信息基本完成
二、建图:
1、启动小车
2、启动雷达
3、启动键盘
4、启动Google建图 roslaunch cartographer_ros backpack_rpidar_2d.launch
5、保存地图 rosservice call /finish_trajectory "map" 此处会报错,可能是因为官方自带API进行了更改,但是并不影响保存地图,地图会保存在.ros的
隐藏文件下。可以在输入rosservice call /finish_trajectory后按TAB键根据提示输入地图名称
这是对大约1000平的楼层进行建图的效果,由于建图速度较快,每个位置只走一次,所以有的地方会出现了一些歪曲。
下面是建图过程以及使用cartographer进行导航的视频 点击打开链接