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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/753287.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用飞书快捷指令无感记账,ios版

总结 很多人无法长期坚持记账,主要是每次消费需要打开手机软件,一系列繁琐的操作,导致过程中可能就忘了。 今天给大家带来飞书自动记账。 演示视频 点击查看:https://www.douyin.com/video/7312857946382241063 安装 下载快捷…

【java计算机毕设】网上商城系统java MySQL ssm vue html maven项目设计代码源码+文档PPT

1项目功能 2项目介绍 系统功能: 网上商城系统包括管理员、用户俩种角色。 管理员功能包括个人中心模块用于修改个人信息和密码、管理员管理、基础数据管理、论坛管理、商品管理、浏览记录管理、公告信息管理、用户管理、轮播图信息。 用户功能包括个人中心模块用于…

【Pyspark-驯化】spark中高效保存数据到hive表中:stored as PARQUET

【Pyspark-驯化】spark中高效保存数据到hive表中:stored as PARQUET 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关…

python数据分析与可视化一

公共部分 # 引入数据分析工具 Pandas import pandas as pd # 引入数据可视化工具 Matplotlib import matplotlib.pyplot as plt # 引入数据可视化工具 Seaborn (基于matplotlib) import seaborn as sns # 解决输出时的列名对齐问题 pd.set_option(display.unicode.east_…

短视频利器 ffmpeg (2)

ffmpeg 官网这样写到 Converting video and audio has never been so easy. 如何轻松简单的使用: 1、下载 官网:http://www.ffmpeg.org 安装参考文档: https://blog.csdn.net/qq_36765018/article/details/139067654 2、安装 # 启用RPM …

华强盛网络变压器外部电路如何接线

图一是 华强盛 Hqst 网络变压器工厂19926430038 华强盛电子导读: 网络变压器的外部电路接线通常依赖于其设计和用途。一般来说,网络变压器有多个端口,每个端口可能用于不同的连接或功能。以下是一些可能的接线方式: 1. **主电源…

自研网关架构设计

网关项目 1. 了解网关网关横向对比为什么自研网关 2. 架构设计技术栈技术要点异步化设计使用缓存缓冲合理使用串行化吞吐量为王合适的工作线程 架构图 1. 了解网关 概念 访问数据、业务逻辑或功能的 “前门”负责处理接受和处理调用过程中的所有任务 类型 RESTful APl 使用…

核方法总结(三)———核主成分(kernel PCA)学习笔记

一、核主成分 1.1 和PCA的区别 PCA (主成分分析)对应一个线性高斯模型(参考书的第二章),其基本假设是数据由一个符合正态分布的隐变量通过一个线性映射得到,因此可很好描述符合高斯分布的数据。然而在很多实…

深入分析 Android BroadcastReceiver (七)

文章目录 深入分析 Android BroadcastReceiver (七)1. 高级应用场景1.1 示例:动态权限请求1.2 示例:应用内通知更新 2. 安全性与性能优化2.1 示例:设置权限防止广播攻击2.2 示例:使用 LocalBroadcastManager2.3 示例:在…

零成本打造精品宣传册

​随着互联网的发展,企业和个人对宣传册的需求日益增长,然而,高质量的宣传册制作往往需要不菲的成本。那么,如何零成本打造精品宣传册呢? 一、明确定位和目标群体 在制作宣传册之前,首先要明确其定位和目标…

关于怎么将wireshark抓包视频流转为视频播放出来

0.安装wireshark 安装PotPlayer 1.将以下两个插件放入 C:\Program Files\Wireshark\plugins 目录中 2.筛选视频流数据包,右键Decode As… 改为RTP 或者 右键->follow(追踪流)->UDP stream 然后叉掉弹窗 3.选择菜单Edit->Prefe…

职责链让树状分支更严谨更易读更易维护

业务场景 传统方式就不列举了 职责链解决 Chain 类 class Chain {fn: Function;successor: any;constructor(fn: Function) {this.fn fn;this.successor null;}setNextSuccessor(successor: any) {return (this.successor successor);}passRequest() {var ret this.fn.a…

微信公众号扫码授权登录

【微信扫登录】原理说明 1、准备工作:注册开放微信公众号。获得此账号的AppID和AppSecret。 2、发起授权登录:通过授权链接或者扫码授权二维码的方式,获取登录code,通过code获取access_token。 3、成功获取access_token即代表登…

[CTF]-PWN:mips反汇编工具,ida插件retdec的安装

IDA是没有办法直接按F5来反汇编mips的汇编的,而较为复杂的函数直接看汇编不太现实,所以只能借用插件来反汇编 先配置环境,下载python3.4以上的版本,并将其加入到环境变量中 下载retdec 地址:Release v1.0-ida80 ava…

常见Web认证方式对比

认证是一个在用户或者设备在访问一个受限的系统时,鉴定用户凭据的过程,即确认“你是谁”的问题。最常见的认证用户的方式是通过用户名和密码的形式进行校验,目前存在多种校验方式,本文将对其进行一个简单的对比,使得大…

今天起,全球所有Mac用户可免费安装桌面版ChatGPT

在 macOS 上,用户在安装新的 ChatGPT 应用程序后,使用 Option Space 的键盘组合即可快速调用 ChatGPT。 刚刚,OpenAI 宣布推出适用于 macOS 的应用程序。 虽然 Mac 应用程序尚未在 Mac App Store 中提供,但用户可以直接从 Open…

Lean4Game 开发教程 | 数学形式化

引言 Lean 是一门用于形式化证明的编程语言,它允许严格证明数学定理和验证软件代码的正确性。 本篇介绍 Lean 游戏的编写和发布方式。这类游戏不仅利于对 Lean 本身的学习,对学科知识的理解,还能推动数学圈内人对 Lean 的接触学习。 Lean4…

elementUI搭建使用过程

前言 Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组 件库 安装 ElementUI 在终端命令行输入 npm i element-ui -S 在 main.js 中写入以下内容: import ElementUI from element-ui ; import element-ui/lib/theme-chalk/i…

0-30 VDC 稳压电源,电流控制 0.002-3 A

怎么运行的 首先,有一个次级绕组额定值为 24 V/3 A 的降压电源变压器,连接在电路输入点的引脚 1 和 2 上。(电源输出的质量将直接影响与变压器的质量成正比)。变压器次级绕组的交流电压经四个二极管D1-D4组成的电桥整流。桥输出端…

北邮《计算机网络》蒋老师思考题及答案-传输层

蒋yj老师yyds! 答案自制,仅供参考,欢迎质疑讨论 问题一览 传输层思考题P2P和E2E的区别使用socket的c/s模式通信,流控如何反映到编程模型三次握手解决什么问题举一个两次握手失败的例子为什么链路层是两次握手而非三次?…