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 为例

cpp 复制代码
# 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)" in
    jammy|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
cpp 复制代码
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
cpp 复制代码
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
cpp 复制代码
# 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库有对齐问题,会导致系统内存冲突。

相关推荐
星马梦缘1 小时前
Matlab机器人工具箱7 搬运动画展示
matlab·机器人·仿真·逆解
星马梦缘16 小时前
Matlab机器人工具箱使用2 DH建模与加载模型
人工智能·matlab·机器人·仿真·dh参数法·改进dh参数法
星马梦缘1 天前
Matlab机器人工具箱使用1 简单的描述类函数
matlab·矩阵·机器人·位姿·欧拉角·rpy角
神仙别闹1 天前
基于单片机的六足机器人控制系统设计
单片机·嵌入式硬件·机器人
南山二毛2 天前
机器人控制器开发(传感器层——奥比大白相机适配)
数码相机·机器人
房开民2 天前
使用海康机器人相机SDK实现基本参数配置(C语言示例)
c语言·数码相机·机器人
南山二毛3 天前
机器人控制器开发(导航算法——导航栈关联坐标系)
人工智能·架构·机器人
猫头虎3 天前
2025最新超详细FreeRTOS入门教程:第一章 FreeRTOS移植到STM32
stm32·单片机·嵌入式硬件·机器人·硬件架构·freertos·嵌入式实时数据库
xwz小王子3 天前
Nature Machine Intelligence 基于强化学习的磁性微型机器人自主三维位置控制
机器人·微型机器人
IoT砖家涂拉拉3 天前
从“找新家”到“走向全球”,布尔云携手涂鸦智能开启机器人新冒险
人工智能·机器人·ai助手·ai智能体·ai机器人