1.更新和安装相关工具
sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build
2.初始化工作空间
mkdir -p carto_ws/src
cd carto_ws
wstool init src # 会在carto_ws文件夹下生成一个src文件和 .rosinstall文件
3.下载3个重要包:
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
4.安装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
5.初始化及安装
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文件里的<depend>libabsl-dev</depend>
, 然后再重新执行 rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
命令.
6.编译.
前提是要完成上面的准备工作和解决报错内容之后, 才能进行编译.
在 carto_ws/
路径下:
catkin_make_isolated --install --use-ninja
source install_isolated/setup.bash # 添加到环境变量, 和ROS的 source devel/setup.bash 类似.
全部编译成功后的结果如下图所示:
编译成功生成的文件夹是下面三个红框中的文件:
7.测试
- 下载测试bag包到Downloads路径下.
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截图:
8.地图格式转换
cartographer保存地图方式:
在一个终端执行建图命令:
# 执行建图命令:
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
.