欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > cartographer从入门到精通(一):cartographer介绍

cartographer从入门到精通(一):cartographer介绍

2025/9/7 10:04:42 来源:https://blog.csdn.net/windxf/article/details/140043691  浏览:    关键词:cartographer从入门到精通(一):cartographer介绍

一、cartographer重要文档

有关cartographer的资料有2个比较重要的网站,我们的介绍也是基于这两个网站,其中会加入自己的一些理解,后续也有一些对代码的修改,来实现我们想完善的功能。

1-Cartographer
2-Cartographer ROS
第1个是Cartographer的核心,它会编译成一个库文件供他人使用
第2个是作者写了个ros包来调用Cartographer的核心库来实现建图、导航的便捷展示。

二、Cartographer的安装

Cartographer是一个SLAM系统,它提供了2D和3D激光的建图功能,并支持多种平台和多种传感器配置。

技术概述
  • Cartographer的架构图
  • 在这里插入图片描述

我们可以看到白色框出来的三个区域,分别是

  • Input Sensor Data(数据输入模块)
  • Local SLAM(局部SLAM模块)
  • Global SLAM (background thread)(全局SLAM模块)

下面我们分别介绍一下这几个模块

Input Sensor Data(数据输入模块)

数据输入模块可以接收激光雷达(Range Data)、电机编码器(Odometry Pose)、陀螺仪(IMU Data)、还有固定坐标系位姿(Fixed Frame Pose)数据,这里的固定坐标系位姿(Fixed Frame Pose)数据在代码中有注释提到是GPS数据,其实也可以是其他类似GPS信号的数据源,顾名思义只要是固定坐标系下的位姿数据就可以。
如激光雷达:
在这里插入图片描述
如电机
在这里插入图片描述
如陀螺仪
在这里插入图片描述
以上品牌只作为参考,具体应用需要适配合适的传感器。

Local SLAM(局部SLAM模块)

输入的一帧一帧激光数据通过Scan Matching进行匹配,然后传给后端进行回环检测和优化,但是如果所有激光帧数据都传给后端,那计算量会非常大,而且很多是冗余的数据,所以算法要对数据进行筛选和过滤,Motion Filter就是做这个功能的,Motion Filter通过检测距离、角度、时间的变化来进行过滤传入后端的激光帧数据,比如上一帧激光与当前帧激光的距离变化大于0.1米、或者角度变化大于1度、或者时间间隔大于1秒,才会把数据帧传入后端,不满足要求的就会被丢弃(Dropped)。最后传入后端的激光帧会生成一个叫做Submap(子图)的数据结构。

Global SLAM (background thread)(全局SLAM模块)

以为Local SLAM会存在局部累计误差,所以需要Global SLAM来解决这个问题,解决的方式就是通过构建的各种约束进行优化来实现,所以这个模块首先要构建约束(主要包括INTRA和INTER两种约束,我们后面再来解释),构建完约束,接着就要进行优化了,Sparse Pose Adjustment就是来进行优化的。优化完成后累计误差就会被消除,同时之前有误差的位姿也会被调整,所以新进来的数据就要在此基础上进行调整,所以作者说Extrapolate all poses that were added later(推断后面添加进来的位姿)

局部SLAM会带来的累计误差,后端优化可以纠正累计误差:
在这里插入图片描述

其他模块
  • Voxel Filter(fixed size)(体素过滤)
  • Adaptive Voxel Filter(自适应体素过滤)
  • PoseExtrapolator(位姿推断器)
  • IMU Tracker(gravity alignment)(IMU跟踪器)
  • InsertionResult(传入后端时封装的一种数据结构,包含所有输入的数据)
Voxel Filter(fixed size)(体素过滤)

由于输入的激光数据比较密集,实际上我们用不到那么多数据,所以Voxel Filter的作用就是下采样,用来减少数据输入。fixed size代表下采样的间隔是固定的,这个数值可以自己设置。

Adaptive Voxel Filter(自适应体素过滤)

与Voxel Filter不同,Adaptive Voxel Filter是自适应的算法,就是在满足足够的点数据数量为前提,通过自适应调整采样间隔来实现这个目标。目的是在满足匹配精度要求为前提,使用尽量少的数据,这样也可以减少激光匹配时的计算量。

PoseExtrapolator(位姿推断器)

这个类是用来做位姿推断的,顾名思义他的作用就是用来推断位姿的,具体使用的数据有激光位姿、imu数据、odom数据。这个类可以精确到每一帧的位姿推断,所以在cartographer中也用来矫正初始激光数据的运动畸变,非常重要。

IMU Tracker(gravity alignment)(IMU跟踪器)

IMU Tracker是用来做imu的位姿跟踪的,用来辅助PoseExtrapolator进行位姿推断。

InsertionResult

作为传入后端时封装的一种数据结构,InsertionResult包含所有输入的数据,用来进行后端的优化。

开始使用

Cartographer是一个独立的C++库,如果想快速使用,建议使用ROS整合的应用

使用ROS整合的应用

ROS整合的代码可以在这里下载Cartographer ROS repository,您还可以在这里Cartographer ROS Read the Docs site找到关于此应用的完整文档。

编译Cartographer库

以 Ubuntu 18.04 为例

# Install the required libraries that are available as debs.
sudo apt-get update
sudo apt-get install -y \clang \cmake \g++ \git \google-mock \libboost-all-dev \libcairo2-dev \libceres-dev \libcurl4-openssl-dev \libeigen3-dev \libgflags-dev \libgoogle-glog-dev \liblua5.2-dev \libsuitesparse-dev \lsb-release \ninja-build \python3-sphinx \stow# Install Protocol Buffers and Abseil if available.
# No need to build it ourselves.
case "$(lsb_release -sc)" injammy|bullseye)sudo apt-get install -y libgmock-dev protobuf-compiler libabsl-dev ;;focal|buster)sudo apt-get install -y libgmock-dev protobuf-compiler ;;bionic);;
esac
git clone https://github.com/abseil/abseil-cpp.git
cd abseil-cpp
git checkout 215105818dfde3174fe799600bb0f3cae233d0bf # 20211102.0
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
cd /usr/local/stow
sudo stow absl
VERSION="v3.4.1"# Build and install proto3.
git clone https://github.com/google/protobuf.git
cd protobuf
git checkout tags/${VERSION}
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
# Build and install Cartographer.
cd cartographer
mkdir build
cd build
cmake .. -G Ninja
ninja
CTEST_OUTPUT_ON_FAILURE=1 ninja test
sudo ninja install
系统要求

尽管Cartographer也可能运行在其他系统上,但是只在满足以下要求的系统上进行过验证。

已知的问题

32位系统上的eigen库有对齐问题,会导致系统内存冲突。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词