前言
Cartographer这个算法断断续续用过好多次了,每一次想记录一下使用文档都因为周期原因没有完成,这次借助开发重定位功能模块来记录一下,因为是完成了重定位功能后回过头来再记录整个过程的,可能在某些地方存在小问题和疏漏。
前期我使用的实车测试比较多,但是这次Cartographer的开发采用的Gazebo仿真来实现的,因为第一次使用仿真也是遇到很多坑和奇奇怪怪的Bug,后文随时间线一一介绍。
整体上的内容大概是这么几步:
一、Cartographer的安装测试
二、Gazebo的仿真环境搭建
三、Cartographer的基于仿真环境的建图
四、重定位方法的简单介绍
由于很多内容是完成之后写了,很多bug和故障可能没有对应的附图了,我尽量贴一些很像的故障图,毕竟实在是不想再把故障复现再来贴图了,因此文本量肯定要大于含图量了(懂,文字多的又没有图片的文章是真不想看下去)
Cartographer的安装
好,接下来正式进入安装,安装前先碎碎念几句,因为安装过程中,每个人用的Ubuntu版本、下载的Cartographer的版本、安装的是官方还是第三方重制等等因素都有可能有差异,所以根据某一个教程安装都有失败的可能。
安装过程参考的文章是:2024.4成功!20.04安装cartographer_ubuntu20.04 安装cartograhper-优快云博客
因此这里介绍的是基于Ubuntu20.04,安装官方Cartographer2.0.0
版本号我看的是src/cartographer/package.xml文件,里面有一段:
<package format="3">
<name>cartographer</name>
<version>2.0.0</version>
<description>
Cartographer is a system that provides real-time simultaneous localization
and mapping (SLAM) in 2D and 3D across multiple platforms and sensor
configurations.
</description>
安装前声明一点,基本上纯净系统(指新安装的ubuntu系统)对照着安装都没问题,如果已经是用过很久的系统,因为里面的很多内容安装卸载等原因可能会导致某些环节出错,那种情况就只能对症分析了。
安装这个之前可以用小鱼一键安装ROS先把ROS安装好,确实好用。
wget http://fishros.com/install -O fishros && . fishros
1、先把基础依赖安装好:
apt-get install -y build-essential protobuf-compiler clang cmake g++ git google-mock libboost-all-dev libcairo2-dev libcurl4-openssl-dev libeigen3-dev libgflags-dev libgoogle-glog-dev liblua5.2-dev libsuitesparse-dev lsb-release ninja-build stow python3-sphinx libgmock-dev libmetis-dev libceres-dev
2、安装辅助工具:
sudo apt-get update
sudo apt-get install -y python3-wstool python3-rosdep ninja-build stow
3、下载Cartographer和对应ROS接口包
mkdir carto_ws
cd carto_ws
wstool init src
wstool merge -t src https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstall
wstool update -t src
这一步大概率会遇到报错,类似于time out之类的错误,不要慌,读一读报错信息,通常情况都是网络原因导致超时报错,可以科学上网下载一下,当然觉得Ubuntu科学上网比较麻烦可以多试几次,总有成功的时候。
很多教程会有一步安装Ceres-solver,之前屡屡翻车都在这一步,要么安装不上要么安装上编译报错,但20.04貌似不需要操心,确实不安装也可以运行。
这一步执行后,src文件下会出现cartographer和cartographer_ros两个文件夹
4、rosdep
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${noetic} -y
如果用小鱼一键安装的ROS这里应该问题不大。
如果遇到:ERROR: the following packages/stacks could not have their rosdep keys resolved to system dependencies: cartographer: [libabsl-dev] defined as "not available"
把src/cartographer中的package.xml 文件中,第46行<depend>libabsl-dev</depend>删掉。
执行:
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
5、abseil安装
20.04自带protbuf,可以用protbuf version查看一下,没问题在工作空间下执行:
src/cartographer/scripts/install_abseil.sh
仍然需要科学上网,或者多试几次。
//一般新系统不用执行这个命令,如果不确定系统abseil会不会冲突,执行:
sudo apt-get remove ros-${ROS_DISTRO}-abseil-cpp
//如果出现E: Unable to locate package ros-noetic-abseil-cpp
//就是没有冲突,继续下一步就行。
//没有报错就是原本有冲突,执行后上述命令就不冲突了
6、编译
执行:
//以后修改源码也要使用这个编译,不要使用catkin_make编译
catkin_make_isolated --install --use-ninja
至此程序基本安装完毕,工作空间目录结构应该是这样的:
.
├── abseil-cpp
├── build_isolated
├── devel_isolated
├── install_isolated
└── src
7、测试Demo
接下来为了图个流程完整可以跑一下官方Demo:
//下载数据集
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
//工作空间下执行sourece,或者直接将其写入bashrc
source devel_isolated/setup.bash
//运行Demo
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=存放路径/cartographer_paper_deutsches_museum.bag
如果下载比较困难可以去网上搜一下,很多人将这个数据包上传到了网盘可以从别的途径下载。
需要注意这个数据包的小细节以后可能用得到:
path: cartographer_paper_deutsches_museum.bag
version: 2.0
duration: 31:52s (1912s)
start: May 26 2015 21:30:16.48 (1432647016.48)
end: May 26 2015 22:02:09.46 (1432648929.46)
size: 470.5 MB
messages: 617965
compression: bz2 [3334/3334 chunks; 18.31%]
uncompressed: 2.5 GB @ 1.3 MB/s
compressed: 462.3 MB @ 247.5 KB/s (18.31%)
types: sensor_msgs/Imu [6a62c6daae103f4ff57a132d6f95cec2]
sensor_msgs/MultiEchoLaserScan [6fefb0c6da89d7c8abe4b339f5c2f8fb]
topics: horizontal_laser_2d 70358 msgs : sensor_msgs/MultiEchoLaserScan
imu 478244 msgs : sensor_msgs/Imu
vertical_laser_2d 69363 msgs : sensor_msgs/MultiEchoLaserScan
首先是数据包用了压缩,使用bz2方式压缩后的体积减小还是非常夸张的,如果以后需要经常有录制rosbag调试的需求可以尝试一下rosbag compress功能。
其次该数据包录制的雷达话题消息格式为sensor_msgs/MultiEchoLaserScan。目前cartographer的应用场景下可能还是LaserScan的消息类型多一些,而且数据包不含Odom数据以及对应TF。因此在后文使用Gazebo仿真过程中,这些接口参数时一定要改的,不改一定会出问题。