锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【激光SLAM】 01 cartographer环境建立以及建图测试(详细级)

时间:2022-11-08 12:30:00 at三维激光传感器cd22激光传感器

【激光SLAM】cartographer环境建设和施图试验(详细级)

  • cartographer
  • Launch the 2D backpack demo.
  • Download the 3D backpack example bag.
  • Launch the 3D backpack demo.

转载给知乎哥哥:良知还存在
他似乎还有一个微信官方账号: 羽林君
链接: -https://zhuanlan.zhihu.com/p/335778454
但是这个哥哥也是参考别人的 QAQ

cartographer

目前需要使用机器人SLAM由于移动机器人想要实现独立行走,其核心是实现独立定位导航。独立定位导航技术将涉及定位、施工图、路径规划等问题,地图构建的质量将直接影响机器人的行走路径。如果机器人想要到达一个目的地,它需要描述和理解环境的过程主要依赖于地图,就像人类绘制地图一样。

目前,有激光雷达、视觉地图和深度学习。今天介绍的cartographer就属于激光slam。主流的激光SLAM算法有hector、gmapping、karto、cartographer等。

下面简单介绍几个SLAM算法:

  1. hector是一种结合鲁棒性较好的扫描匹方法2D_SLAM采用惯性传感系统的导航技术。激光扫描仪对传感器要求高,更新频率高,噪声测量小,不需要里程计。在不平坦区域使用空中无人机和地面小车是可能的。作者利用现代激光雷达的高更新率和低距离测量噪声,通过扫描匹配实时估计机器人运动。因此,当只有低更新率的激光传感器时,即使测距估计准确,系统也会出现一些问题。

hector基于优化算法(解决最小二乘问题)的优缺点:不需要里程计,但雷达帧率要求高40Hz,估计6自由度位置可以适应空气或地面不平。初始值的选择对结果影响很大,因此雷达帧率要求较高。

  1. gmapping基于粒子滤波的激光SLAM它已经集成了算法ROS在移动机器人中人中使用最多的SLAM算法。基于粒子滤波的算法用许多加权粒子来表示路径的后检概率,每个粒子都给出一个重要因素。然而,它们通常需要大量的粒子来获得更好的结果,从而增加算法的计算复杂性。此外,与PF与重采样过程相关的粒子退化耗尽问题也降低了算法的准确性。

缺点:严重依赖里程计,无法适应无人机和地面不平坦区域,无回环(激光)SLAM很难做回环检测),大场景,粒子多,特别消耗资源。

  1. karto基于图优化SLAM算法,用高度优化和非迭代cholesky稀疏系统解耦矩阵。图纸优化方法用图纸的平均值表示地图,每个节点表示机器人轨迹的位置点和传感器测量数据集,箭头的连接表示连续机器人位置点的运动。如果添加每个新节点,地图将根据空间中节点箭头的限制进行计算和更新。路标landmark内存需求越大,但与其他方法相比,图形优化方法在大环境的优势。

karto采取的是spa(karto_slam)或g2o(nav2d), karto前端和后端采用单线程。

  1. LagoSLAM 是线性近似图优化,不需要初始假设。基本图优化slam使用最小化非线性非凸代价函数的方法是.每次迭代, 为了解决局部凸近似的初始问题,更新图片配置,在局部最小成本函数达到之前,进行一定次数的过程迭代. (假设开始点经过多次迭代使局部成本函数最小化). 。假设图中每个节点的相对位置和方向是独立的,作者解决了一个等于非凸代价函数的方程组。为此,通过线性定位和线性位置估计,提出了一套基于图论的程序,以获得非线性系统的一阶近似。

  2. cartographer是google实时室内开发SLAM项目,cartographer采用基于google自家开发的ceres非线性优化方法,cartographer亮点是代码标准化和工程化,非常适合商业应用和再开发。并且cartographer基于submap构建全局地图的子图思想可以有效避免环境中移动物体的干扰。并且cartographer支持多传感器数据(odometry、IMU、LaserScan等)建图,支持2D_SLAM和3D_SLAM建图。

能自然输出协方差矩阵,后端优化输入项。低成本雷达也能跑出好的效果。cartographer是google基于图优化推出的一套SLAM算法。

cartographer算法没有给人惊艳的感觉,但算法的主要目标是实现低计算资源消耗和实时SLAM的目的,所以很适合嵌入式端的使用。
本文是介绍cartographer在linuxPC环境(Ubuntu16)下载源码demo本文的前提是你的电脑已经安装了测试教程ROS以下任何版本:Noetic、Kinetic、Melodic。

算法分析

该算法主要分为两部分,第一部分称为Local SLAM, 这部分是一帧帧Laser Scan一系列的建立和维护Submap,而所谓的submap是一系列Grid Map。当再有新的Laser Scan中会通过Ceres Scan Matching将其插入子图的最佳位置。但是submap因此,算法的第二部分被称为Global SLAM部分,就是通过Loop Closure闭环检测消除累积误差:当submap建设完成后,即不会有新的laser scan插入到该submap算法会把这个算法submap加入闭环检测。闭环检测的本质也是一个优化问题,该优化问题被表达成了一个pixel-accurate match解决优化问题的方法是Branch-and-Bound Approach.
在这里插入图片描述

cartographer安装主要包括三个部分:cartographer、cartographer-ros、ceres-solver。其中cartographer 是计算部分,cartographer-ros是算法在ROS中通信交互数据部分,ceres-solver谷歌开发的非线性优化库,在谷歌开源激光雷达slam项目cartographer它被广泛使用。

有两种安装方法,一种是官网的集成下载配置,另一种是把cartographer所需的依赖部分分别安装配置。

两种方式的区别在于,虽然第一种方便,但由于网络问题(你知道的),Google下载相关文件会失败,所以会出现。单独下载编译,最后下载cartographer进行编译。

官网方式:

  1. 安装 wstool下载工具、rosdep和ninja编译工具(ninja用于替代复杂性的新型编译工具make,实现快速编译)
sudo apt-get update 
sudo apt-get install -y python-wstool python-rosdep ninja-build 
  1. 建立一个wstool下载 ROS二合一环境基本编译
mkdir catkin_ws cd catkin_ws wstool init src wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall 

这是 wstool 命令生成 .rosinstall的文件里面的内容,可以看到设置了cartographer、cartographer-ros下载链接。

wstool update -t src

静静等待下载,速度就取决你对于Google的认知。

3.安装proto3.

Protocol Buffers(简称Protobuf) ,是Google出品的序列化框架,与开发语言无关,和平台无关,具有良好的可扩展性。Protobuf和所有的序列化框架一样,都可以用于数据存储、通讯协议。

src/cartographer/scripts/install_proto3.sh

此外其实除了Protobuf我们还可以配置其他依赖,这些脚本都在这个目录,如果编译过程中遇到依赖问题就可以去利用脚本去下载。

4.rosdep init在安装ROS时候就安装过了,不过这个经常会出现问题,我之前写过一篇ROS安装的文件,大家有兴趣可以去看看

对于这个问题,有两种解决思路:访问DNS解析环节解决或者直接切换软件源。

DNS解析环节解决:

切换linux软件源:

sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ 
        ROS_DISTRO} -y

5.最后一步编译

catkin_make_isolated --install --use-ninja
source install_isolated/setup.bash

但是好多时候因为下载问题,就会出现这样那样的问题,所以就出现了下面的方法,把包单独下载,然后再进行编译安装。

注!:在我编译cartographer过程中,和文章所写这种一气呵成的感觉恰恰相反,我编译了好多次才编译成功的,而且中间出现各种编译问题,基本都是版本问题。所以请大家注意下载各个分包的版本,切记,切记,切记~

你看我probuf版本下载记录就知道了。

分包编译方式:

cartographer分成6个部分,分别是eigen3.2.9,ceres1.13.0,protobuf大于3.0.0,cartographer,cartogpher_ros,abseil。分开进行编译:

1.eigen
Eigen是高级 C ++ 模板标头库,用于线性代数,矩阵和矢量运算,几何变换,数值求解器和相关算法。自3.1.1版以来,Eigen是根据Mozilla Public License 2.0许可的开源软件。早期版本是根据GNU较宽松通用公共许可证授权的。

注意警告:cartographer对eigen,ceres,protobuf有严格的版本限制,版本必须严格!!!

#选择版本3.2.9
git clone  https://gitlab.com/libeigen/eigen.git
mkdir build
cd build
cmake ..
sudo make install

安装完成

2.ceres

Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用。

注意:ceres版本必须是1.13.0,其它版本与eigen3.2.9不匹配

#选择版本1.13.0

git clone https://github.com/ceres-solver/ceres-solver.git
mkdir build
cd build
cmake ..
make -j8
sudo make install

编译过程中如果出现这个编译问题:

Failed to find glog

– Failed to find installed glog CMake configuration, searching for glog build directories exported with CMake.

– Failed to find an installed/exported CMake configuration for glog, will perform search for installed glog components.

– Failed to find glog - Could not find glog include directory, set GLOG_INCLUDE_DIR to directory containing glog/logging.h

这个原因是缺失glog库(glog 是一个 C++ 日志库,它提供 C++ 流式风格的 API。在安装 glog 之前需要先安装 gflags,这样 glog 就可以使用 gflags 去解析命令行参数),我们可以用apt-get install安装,也可以下载源码进行编译安装.

apt-get install安装:

sudo apt-get install libgoogle-glog-dev

下载源码进行编译安装:

git clone https://github.com/google/glog.git
cd glog
mkdir build
cmake ..
make
sudo make install

再重新进行cere编译安装,又通过一关

  1. protobuf

Protocol Buffers(简称Protobuf) ,是Google出品的序列化框架,与开发语言无关,和平台无关,具有良好的可扩展性。Protobuf和所有的序列化框架一样,都可以用于数据存储、通讯协议。

注意:protobuf安装方式特殊,脚本安装

选择版本3.0.0

git clone https://github.com/protocolbuffers/protobuf.git
./autogen.sh

这次也会遇到error问题,

第一个error 48: autoreconf: not found

是在不同版本的 tslib 下执行 autogen.sh 产生。它们产生的原因一样,是因为没有安装automake 工具, 用下面的命令安装好就可以了。

sudo apt-get install autoconf automake libtool

第二个error可能是下载问题,这边会提示你下载失败,你可以选择注释掉,或者使用我提供的第二种编译方法:

#如遇见Error,prot:443,注释autogen.sh脚本34./configure
make -j8
sudo make install
sudo ldconfig
#测试一下protobuf
protoc --version
#不出意外将会显示libprotoc 3.0.0

第二种编译方法:

上文说到,我们在cartographer/scripts目录下可以找到cartographer依赖文件的下载的脚本,这些的脚本里面还有编译的选项,这时候我们就可以看下install_proto3.sh 这个文件,里面可以看到如下内容:

mkdir build
cd build
cmake -G Ninja \
  -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
  -DCMAKE_BUILD_TYPE=Release \
  -Dprotobuf_BUILD_TESTS=OFF \
  ../cmake
ninja
sudo ninja install

我们直接复制直接编译即可。

4.abseil

abseil 是 google 开源的 C++通用库,其目标是作为标准库的补充。abseil 不但提供了标准库没有但很常用的功能,也对标准库的一些功能进行了增强设计,使用 abseil 库能使程序性能和开发效率都取得不错的提升。

cartographer对abseil没有版本要求,但是一定要有。

git clone https://github.com/abseil/abseil-cpp.git
mkdir build
cd build
cmake .. -DCMAKE_CXX_STANDARD=11
make -j8
sudo make install

不过在后续编译abseil,大家可能会遇到这个问题

CMake Error at CMakeLists.txt:49 (find_package):

By not providing “FindAbseil.cmake” in CMAKE_MODULE_PATH this project has

asked CMake to find a package configuration file provided by “Abseil”, but

CMake did not find one.

Could not find a package configuration file provided by “Abseil” with any

of the following names:

AbseilConfig.cmake

abseil-config.cmake

Add the installation prefix of “Abseil” to CMAKE_PREFIX_PATH or set

“Abseil_DIR” to a directory containing one of the above files. If “Abseil”

provides a separate development package or SDK, be sure it has been

installed.

不过没事,是因为CMakeLists.txt在进行搜寻absil中,定义的名称和你编译abseil名称不同,CMakeLists.txt是大写的,而实际你编译安装后的包名称为小写。

修改如上所示:Abseil 修改为 absl

5.carographer

注意:carographer和cartographer _ros版本必须对应

mkdir cartographer
cd cartographer & mkdir src
cd src


git clone https://github.com/cartographer-project/cartographer.git
git clone https://github.com/cartographer-project/cartographer_ros.git


catkin_make_isolated   /*也可以用*/  catkin_make_isolated --install --use-ninja

编译成功:

建图开发

现在安装了Cartographer和Cartographer的ROS集成,官方也提供了一些数据集,Deutsches Museum(德意志博物馆),这样我就可以很方便测试Cartographer生成地图和其他的功能了。

下载示例包(例如德意志博物馆的2D和3D背包系列)到一个已知的位置

示例位于~/Downloads,并使用roslaunch来调出演示:

# Download the 2D backpack example bag.
wget -P ~/Downloads 
https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag

Launch the 2D backpack demo.

roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${ 
        HOME}/Downloads/cartographer_paper_deutsches_museum.bag

Download the 3D backpack example bag.

wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_3d/with_intensities/b3-2016-04-05-14-14-00.bag

Launch the 3D backpack demo.

roslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=${ 
        HOME}/Downloads/b3-2016-04-05-14-14-00.bag

又会是下载的问题,这些文件又大,下载速度又慢还经常失败,我也是废了九牛二虎之力下载下来的。

为了方便大家测试,大家可以公众号后台私我,或者添加我微信号,我把我下载好的文件发给大家。

截图有限,之前操作都忘记截图了,导致现在就只有一个了,大家凑合看了哈。

生成.pdstream地图(等待直到cartographer_offline_node完成),

roslaunch cartographer_ros offline_backpack_2d.launch bag_filenames:=${ 
        HOME}/Downloads/cartographer_paper_deutsches_museum.bag

然后运行纯定位:

roslaunch cartographer_ros demo_backpack_2d_localization.launch  load_state_filename:=${ 
        HOME}/Download/cartographer_paper_deutsches_museum.bag.pbstream   bag_filename:=${ 
        HOME}/Downloads/cartographer_paper_deutsches_museum.bag


此外还有turtlebot的数据,其实都是一样的,大家也可以看一下创客智造的cartographer_turtlebot教程。

这就是我分享的cartographer的简单测试使用,未来我会介绍更加详细的cartographer使用以及源码解析。此外如果大家有什么更好的思路,也欢迎分享交流哈。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章