【SLAM】Cartographer的配置和运行

 官方文档:Cartographer — Cartographer documentation

1、依赖安装(Ubuntu20.04)

 链接:https://pan.baidu.com/s/150mTzN5t_rkMUIuaj8vmIw  提取码:wxa1 

./auto-carto-build.sh

使用脚本一键安装~

2、拉取源码

这里使用的源码是基于李想老师注释的源码~

源码路径:https://github.com/xiangli0608/cartographer_detailed_comments_ws

mkdir carto_ws
cd carto_ws
git clone https://github.com/xiangli0608/cartographer_detailed_comments_ws.git

编译:

cd cartographer_detailed_comments_ws 
./catkin_make.sh

 编译了4个package包:

  • cartographer
  • cartographer_ros
    • cartographer_ros
    • cartographer_ros_msgs
    • cartographer_rviz

设置环境路径:

sudo vim ~/.bashrc

# 在最后面放入(绝对路径)
source /home/robot/Documents/learn_repo/carto_ws/cartographer_detailed_comments_ws/install_isolated/setup.bash

小技巧:(在vim里面点G,可以跳转到最后一行)

注意:本工程文件只能使用catkin_make.sh 脚本文件进行编译,不能直接用catkin_make

当不需要修改cartographer源码的时候,可以直接把cartographer_ros 放在工作空间进行catkin_make编译(因为cartographer源码已经安装到系统里,作为一个安装库)

3、运行(2D建图)

新建一个 bagfiles 文件,在home目录下(后面也可以修改launch文件中bag路径信息)

cd ~
mkdir bagfiles

将下载好的数据集bag文件放入这个文件夹中!

可以修改这里的数据集的路径:

# 查看系统环境是否生效
rospack profile

运行:(2D建图) 

roslaunch cartographer_ros lx_rs16_2d_outdoor.launch 

 以上的建图使用的Submaps进行查看,也可以用map进行查看:

查看map话题是谁发布的: 

rostopic info /map

 

 4、保存地图(2D地图)

保存地图:(方式1)

rosrun map_server map_saver -f map 

 

(方式2:)使用工程里面的脚本文件finish_slam_2d.sh

./finish_slam_2d.sh 

我们可以看到,它保存在了home目录下,创建了一个文件夹,这个路径其实是可以修改脚本文件

5、运行(纯定位模式)

roslaunch cartographer_ros lx_rs16_2d_outdoor_localization.launch

纯定位模式相比刚刚的建图其实就是加载已建立的地图后,再跑一下bag包进行建图

而我们可以发现其实地图还是稍微有点变化的,这对于导航是不利的,因此我们可以通过map_server,把已建立的地图加载出来,通过map的话题发布出来即可

6、运行(3D建图)

roslaunch cartographer_ros lx_rs16_3d.launch 

7、保存地图(3D地图)

 ./finish_slam_3d.sh 

生成 pbstream 文件

7、使用asset生成ros格式的2d栅格地图

roslaunch cartographer_ros assets_writer_2d.launch 

读取urdf文件、bag包、pbstream文件,最终生成一个map.pgm

8、使用asset生成ros格式的3d栅格地图

roslaunch cartographer_ros assets_writer_3d.launch 

生成了一个b3_1.pcd文件 

pcl_viewer b3_1.pcd  

安装:

sudo apt install pcl-tools

按4,可以实现点云通过不同高度赋予颜色

9、使用landmark

roslaunch cartographer_ros landmark_mir_100.launch

10、配置lua文件

  • tracking_frame
    • 有imu的link就设置为imu_link
    • 没有就设置成base_link

  • published_frame
    • cartographer发布的tf的最下边一个坐标系,bag包中tf树的最上边的一个坐标系

  • provide_odom_frame
    • 是否提供里程计
    • 如果bag包中有里程计的坐标系,这个就是false
    • 如果没有,就根据需要决定是否提供里程计坐标系(纯建图,有没有odom无所谓)
  • use_pose_extrapolator

    • 设置为false

  • use_odometry

    • 是否使用里程计的传感器数据,如果为true,tf树中一定要存在odom坐标系

  • num_laser_scans/num_point_clouds

    • 是否使用单线雷达,和多线雷达,使用一个则为1,不使用则为0,可以同时为1,不可以同时为0(可以使用多个单线雷达或者多个多线雷达)

  • TRAJECTORY_BUILDER_2D.use_imu_data

    • 是否使用IMU,如果用IMU,tracking_frame一定要设置为imu_link

  • TRAJECTORY_BUILDER_2D.min_z

    • 点云的最小z的范围

    • 单线点云不能设置大于0的值(或者不设置)

    • 多线点云这个值要大于0

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,                        -- map_builder.lua的配置信息
  trajectory_builder = TRAJECTORY_BUILDER,          -- trajectory_builder.lua的配置信息

  map_frame = "map",                                -- 地图坐标系的名字
  tracking_frame = "imu_link",                      -- 将所有传感器数据转换到这个坐标系下
  published_frame = "odom",                         -- tf: map -> odom
  odom_frame = "odom",                              -- 里程计的坐标系名字
  provide_odom_frame = false,                       -- 是否提供odom的tf, 如果为true,则tf树为map->odom->footprint
  publish_frame_projected_to_2d = false,            -- 是否将坐标系投影到平面上
  use_pose_extrapolator = false,

  use_odometry = false,                             -- 是否使用里程计,如果使用要求一定要有odom的tf
  use_nav_sat = false,                              -- 是否使用gps /fix
  use_landmarks = false,                            -- 是否使用landmark

  num_laser_scans = 0,                              -- 是否使用单线激光数据
  num_multi_echo_laser_scans = 0,                   -- 是否使用multi_echo_laser_scans数据 多回声波雷达
  num_subdivisions_per_laser_scan = 1,              -- 1帧数据被分成几次处理,一般为1
  num_point_clouds = 1,                             -- 是否使用点云数据

  lookup_transform_timeout_sec = 0.2,               -- 查找tf时的超时时间
  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.use_imu_data = true
TRAJECTORY_BUILDER_2D.min_z = 0.1                    -- 雷达数据z轴的最小值,低于该值过滤掉


return options

猜你喜欢

转载自blog.csdn.net/qq_42108414/article/details/134011177