sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build
mkdir -p carto_ws/src
cd carto_ws
wstool init src # 会在carto_ws文件夹下生成一个src文件和 .rosinstall文件
cartographer、cartographer_ros、ceres_solver 包
在 carto_ws/src 路径下,
(1) 对于ceres_solver包, 需要1.13.0版本的, 否则后面编译会出现很多问题. ceres_solve 包是一个非线性优化库.
wget ceres-solver.org/ceres-solver-1.13.0.tar.gz
tar xvf ceres-solver-1.13.0.tar.gz
cd ceres-solver-1.13.0
mkdir build
cd build
cmake ..
make // 编译
sudo make install //安装, 完成之后即安装好了ceres-solver.
(2) 拉取 cartographer 和 cartographer_ros 包文件
git clone https://github.com/cartographer-project/cartographer.git
git clone https://github.com/cartographer-project/cartographer_ros.git

abseil-cpp依赖.在 carto_ws/ 路径下
执行这个脚本命令 src/cartographer/scripts/install_abseil.sh 下载和安装, 或者使用如下的所有命令下载和安装, 因为这个脚本命令里的内容就是下面的所有命令.
git clone https://github.com/abseil/abseil-cpp.git
cd abseil-cpp
git checkout d902eb869bcfacc1bad14933ed9af4bed006d481
mkdir build
cd build
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_PREFIX=/usr/local/stow/absl ..
ninja
sudo ninja install
sudo apt-get install stow
cd /usr/local/stow
sudo stow absl

sudo rosdep init #(注意这里可以跳过,不然有可能会报错,如果我们装ROS的时候已经初始化过, 则无需再初始化)
rosdep update #(如果之前配置ros环境已经执行过,可以不用再次执行)
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
此处执行 rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y 可能会报错, 此处忘记截自己的图片了, 用了别人的, 报错内容大致一样的.

解决的办法是: 需要删除或者注释在cartographer 包下(不是那个cartographer_ros包)package.xml文件里的 , 然后再重新执行 rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y 命令.

前提是要完成上面的准备工作和解决报错内容之后, 才能进行编译.
在 carto_ws/ 路径下:
catkin_make_isolated --install --use-ninja
source install_isolated/setup.bash # 添加到环境变量, 和ROS的 source devel/setup.bash 类似.
全部编译成功后的结果如下图所示:

编译成功生成的文件夹是下面三个红框中的文件:

wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
source install_isolated/setup.bash
提示: 如果出现下面的报错说明是没有添加工作环境变量的.
RLException: [demo_backpack_2d.launch] is neither a launch file in package [cartographer_ros] nor is [cartographer_ros] a launch file name The traceback for the exception was written to the log file
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag
成功运行launch文件之后的rviz截图:


在一个终端执行建图命令:
# 执行建图命令:
source install_isolated/setup.bash
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=/home/wsy/data/wu_outdoor/cartographer/cartographer_paper_deutsches_museum.bag
再打开另一个终端, cartographer保存地图方式, 执行保存图片命令:
# 1 完成轨迹,不再接受数据.
rosservice call /finish_trajectory 0
# 2 序列化保存当前状态, 生成一个 mymap.pbstream 文件.
rosservice call /write_state "{filename: '/home/wsy/Pictures/mymap.pbstream'}"
# 3 将pbstream文件转化为pgm和yaml文件.
rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=/home/wsy/Pictures/mymap -pbstream_filename=/home/wsy/Pictures/mymap.pbstream -resolution=0.05

protocol 需要proto3+版本以上的. 一般18.04Ubuntu ROS melodic系统的话已经是proto3以上的了. 但是如果编译过程中如果出现proto版本相关错误的话, 可以执行这个脚本 src/cartographer/scripts/install_proto3.sh 安装.
而 Ubuntu 16 / ROS Kinetic必须输入该脚本命令安装: src/cartographer/scripts/install_proto3.sh.