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库有对齐问题,会导致系统内存冲突。

相关推荐
夜幕龙3 小时前
iDP3复现代码数据预处理全流程(二)——vis_dataset.py
人工智能·python·机器人
望获linux6 小时前
赋能新一代工业机器人-望获实时linux在工业机器人领域应用案例
linux·运维·服务器·机器人·操作系统·嵌入式操作系统·工业控制
ai_lian_shuo8 小时前
四、使用langchain搭建RAG:金融问答机器人--构建web应用,问答链,带记忆功能
python·ai·金融·langchain·机器人
我爱C编程16 小时前
基于Qlearning强化学习的机器人路线规划matlab仿真
matlab·机器人·强化学习·路线规划·qlearning·机器人路线规划
野蛮的大西瓜17 小时前
开源呼叫中心中,如何将ASR与IVR菜单结合,实现动态的IVR交互
人工智能·机器人·自动化·音视频·信息与通信
向阳逐梦2 天前
基于STM32F4单片机实现ROS机器人主板
stm32·单片机·机器人
朽木成才2 天前
小程序快速实现大模型聊天机器人
小程序·机器人
聆思科技AI芯片2 天前
实操给桌面机器人加上超拟人音色
人工智能·机器人·大模型·aigc·多模态·智能音箱·语音交互
新加坡内哥谈技术3 天前
开源Genesis: 开创机器人研究的全新模拟平台
机器人·开源
野蛮的大西瓜3 天前
文心一言对接FreeSWITCH实现大模型呼叫中心
人工智能·机器人·自动化·音视频·实时音视频·文心一言·信息与通信