史上最简SLAM零基础解读(10.1) - g2o(图优化)→简介环境搭建(slam十四讲第二版为例)

2023-05-16

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始
 
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX官方认证
 

一、前言

针对与 g2o(图优化) 的讲解,主要分成三个部分,分别为: 理论讲解,环境搭建,代码分析。那么现在我们开始第一步,理论讲解吧!

论文链接:g2o: A General Framework for Graph Optimization

1、背景知识

        SLAM的后端一般分为两种处理方法,一种是以扩展卡尔曼滤波(EKF)为代表的滤波方法,一种是以图优化为代表的非线性优化方法。不过,目前SLAM研究的主流热点几乎都是基于图优化的。滤波方法很早就有了,前人的研究也很深。为什么现在图优化变成了主流了?
        滤波方法尤其是EKF方法,在SLAM发展很长的一段历史中一直占据主导地位,早期的大神们研究了各种各样的滤波器来改善滤波效果,那会入门SLAM,EKF是必须要掌握的。顺便总结下滤波方法的优缺点:优点→在当时计算资源受限、待估计量比较简单的情况下,EKF为代表的滤波方法比较有效,经常用在激光SLAM中。缺点→它的一个大缺点就是存储量和状态量是平方增长关系,因为存储的是协方差矩阵,因此不适合大型场景。而现在基于视觉的SLAM方案,路标点(特征点)数据很大,滤波方法根本吃不消,所以此时滤波的方法效率非常低。
        那图优化在视觉SLAM中效率很高吗?很久很久以前,其实就是不到十年前吧(感觉好像很久),大家还都是用滤波方法,因为在图优化里,Bundle Adjustment(后面简称BA)起到了核心作用。但是那会SLAM的研究者们发现包含大量特征点和相机位姿的BA计算量其实很大,根本没办法实时。
        后来SLAM研究者们发现了其实在视觉SLAM中,虽然包含大量特征点和相机位姿,但其实BA是稀疏的,稀疏的就好办了,就可以加速了啊!比较代表性的就是2009年,几个大神发表了自己的研究成果《SBA:A software package for generic sparse bundle adjustment》,而且计算机硬件发展也很快,因此基于图优化的视觉SLAM也可以实时了!
 

2、核心要点

图优化里的图就是数据结构里的图,一个图由若干个 顶点 ( V e r t e x ) \color{red}顶点 (Vertex) 顶点(Vertex),以及连接这些 顶点的边 ( E d g e ) \color{red} 顶点的边(Edge) 顶点的边(Edge)组成,举例,先看下图:
在这里插入图片描述

图一

比如一个机器人在房屋里移动,它在某个时刻 t 的位姿(pose→上图三角形)就是一个顶点,这个也是待优化的变量。而位姿之间的关系就构成了一个边(上图蓝色实线),比如时刻 t 和时刻 t+1 之间的相对位姿变换矩阵就是边,边通常表示误差项。在SLAM里,图优化一般分解为两个任务:

( 1 ) \color{blue} (1) (1) 构建图。机器人位姿作为顶点,位姿间关系作为边。
( 2 ) \color{blue} (2) (2) 优化图。调整机器人的位姿(顶点)来尽量满足边的约束,使得误差最小。

下面就是一个直观的例子。我们根据机器人位姿来作为图的顶点,这个位姿可以来自机器人的编码器,也可以是ICP匹配得到的,图的边就是位姿之间的关系。由于误差的存在,实际上机器人建立的地图是不准的,如下图左。我们通过设置边的约束,使得图优化向着满足边约束的方向优化,最后得到了一个优化后的地图(如下图中所示),它和真正的地图(下图右)非常接近。
在这里插入图片描述

图二

 

二、g2o 框架

前面我们简单介绍了图优化,也看到了它的神通广大,那如何编程实现呢?在SLAM领域,基于图优化的一个用的非常广泛的库就是g2o,它是General Graphic Optimization 的简称,是一个用来优化非线性误差函数的c++框架。这个库可以满足你调包侠的梦想第一次接触g2o,确实有这种感觉,而且官网文档写的也比较“不通俗不易懂”,不过如果你能捋顺了它的框架,再去看代码,应该很快能够入手了

其实g2o帮助我们实现了很多内部的算法,只是在进行构造的时候,需要遵循一些规则,在我看来这是可以接受的,毕竟一个程序不可能满足所有的要求,因此在以后g2o的使用中还是应该多看多记,这样才能更好的使用这个库。我们首先看一下下面这个图,是g2o的基本框架结构。如果你查资料的话,你会在很多地方都能看到。看图的时候要注意箭头类型
在这里插入图片描述

1、图的核心

上面这个图,一眼看过去,感觉东西还是很多的,不太好理解。那么我们先找到他的源头,也就是最左边中间部分的 SparseOptimizer。SparseOptimizer是整个图的核心,我们注意右上角的 is-a 实心箭头,这 SparseOptimizer 它是一个 Optimizable Graph,从而也是一个超图(HyperGraph)。这个呢,就不去研究了,不然可能黄花菜都凉了。先暂时只需要了解一下它们的名字,有些以后用不到,有些以后用到了再回看。目前如果遇到重要的部分会具体解释。
 

2、顶点和边

先来看上图的结构吧。注意看 has-many 箭头,超图(左上角HyperGraph)包含了许多顶点(HyperGraph::Vertex)和边(HyperGraph::Edge)。而这些顶点顶点继承自 Base Vertex,也就是OptimizableGraph::Vertex,而边可以继承自 BaseUnaryEdge(单边), BaseBinaryEdge(双边)或BaseMultiEdge(多边),它们都叫做OptimizableGraph::Edge。可能这样说起来比较头昏,不过没有关系,只要知道有顶点和边这个名字即可。因为顶点和边在编程中很重要的,关于顶点和边的定义我们以后会详细说的。下面我们来看底部的结构。
 

3、配置SparseOptimizer的优化算法和求解器

整个图的核心SparseOptimizer 包含一个优化算法(OptimizationAlgorithm)的对象。OptimizationAlgorithm是通过OptimizationWithHessian 来实现的。其中迭代策略可以从Gauss-Newton(高斯牛顿法,简称GN),Levernberg-Marquardt(简称LM法), Powell’s dogleg 三者中间选择一个(常用的是GN和LM)
 

4、如何求解

OptimizationWithHessian 内部包含一个求解器(Solver),这个Solver实际是由一个BlockSolver组成的。这个BlockSolver有两个部分,一个是SparseBlockMatrix ,用于计算稀疏的雅可比和Hessian矩阵;一个是线性方程的求解器(LinearSolver),它用于计算迭代过程中最关键的一步HΔx=−b,LinearSolver有几种方法可以选择:PCG, CSparse, Choldmod,具体定义后面会介绍
 

三、环境搭建

通过上面的介绍,或许大家依然觉得比较蒙蔽,不过没有关系,下面来讲解几个示例代码,相信就比较透彻了。当然,在讲解示代码之前,需要搭建好示例代码运行的环境。本人的基本系统配置环境(docker)如下:

1、docker容器

docker pull ubuntu:18.04  # 拉取ubuntu18.04镜像

# 创建容器并且映射端口与目录
docker run  -dit --restart=always  --privileged   -v /tmp/.X11-unix:/tmp/.X11-unix   -v /work/4.my_work/1.zwh:/my_work      -p 12570:22    -e DISPLAY=:0    -e LANG=C.UTF-8  --shm-size 64G   --name  ub18.04-g2o-zwh   -w /  35b3f4f76a24   /bin/bash

docker exec -it  ub18.04-g2o-zwh /bin/bash # 进入容器 

apt-get update # 更新操作

apt-get install gcc g++ cmake # 安装基本软件

2、源码准备

首先下载好,并解压slam十四讲第二版的源码:
slam十四讲:https://github.com/gaoxiang12/slambook2

另外,还需要下载第三方库g2o:
g2o:https://github.com/RainerKuemmerle/g2o/tree/9b41a4ea5ade8e1250b9c1b279f3a9c098811b5a

也可以通过slam十四讲第二版的源码的源码链接进入
在这里插入图片描述

解压之后把 g2o-9b41a4ea5ade8e1250b9c1b279f3a9c098811b5a 文件重命名为 g2o,然后替换掉slam十四讲第二版源码下的 3rdparty/g2o 目录。

最终本人的目录分布如下:
在这里插入图片描述
 

3、opencv安装

首先我们需要安装opencv

官网网址:https://opencv.org/
github:https://github.com/opencv/opencv

本人下载的版本为:https://github.com/opencv/opencv/tree/3.4.18
参考编译文档:https://docs.opencv.org/3.4.18/d7/d9f/tutorial_linux_install.html

下载好 3.4.18 版本之后,进行解压,进入到 opencv-3.4.18 根目录,执行如下指令:

apt-get install build-essential
apt-get install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev
cd ~/opencv
mkdir build
cd build
cmake ..
make -j7 # runs 7 jobs in parallel
make install

等待执行完成之后执行如下指令:

echo $(pkg-config --cflags --libs opencv)

输出打印如下,则表示安装成功:
在这里插入图片描述 

4、g2o安装

依赖安装:

apt-get install libeigen3-dev  libsuitesparse-dev qtdeclarative5-dev qt5-qmake libqglviewer-dev-qt5

然后进入到 slambook2 源码根目录

cd 3rdparty/g2o/
mkdir build 
cd build
cmake ../
make -j7 # runs 7 jobs in parallel
make install

打印如下表示成功:
在这里插入图片描述
 

四、示例代码执行

准备好源码,并且大家所需的环境之后。进入到 slambook2 的 ch6 目录下,首先呢,需要修改 CMakeLists.txt,因为 Ceres 与 gaussNewton 我们是不需要的,所以注释了一些代码,最终结果如下:

cmake_minimum_required(VERSION 2.8)
project(ch6)

set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS "-std=c++14 -O3")

list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

# OpenCV
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

# Ceres
#find_package(Ceres REQUIRED)
#include_directories(${CERES_INCLUDE_DIRS})

# g2o
find_package(G2O REQUIRED)
include_directories(${G2O_INCLUDE_DIRS})

# Eigen
include_directories("/usr/include/eigen3")

#add_executable(gaussNewton gaussNewton.cpp)
#target_link_libraries(gaussNewton ${OpenCV_LIBS})

#add_executable(ceresCurveFitting ceresCurveFitting.cpp)
#target_link_libraries(ceresCurveFitting ${OpenCV_LIBS} ${CERES_LIBRARIES})

add_executable(g2oCurveFitting g2oCurveFitting.cpp)
target_link_libraries(g2oCurveFitting ${OpenCV_LIBS} ${G2O_CORE_LIBRARY} ${G2O_STUFF_LIBRARY})

编写完成之后,执行指令如下:

cmake .
make -j7 # runs 7 jobs in parallel

如果报错如下:

[ 50%] Linking CXX executable g2oCurveFitting
CMakeFiles/g2oCurveFitting.dir/g2oCurveFitting.cpp.o: In function `main':
g2oCurveFitting.cpp:(.text.startup+0xca): undefined reference to `cv::RNG::gaussian(double)'
collect2: error: ld returned 1 exit status
CMakeFiles/g2oCurveFitting.dir/build.make:96: recipe for target 'g2oCurveFitting' failed
make[2]: *** [g2oCurveFitting] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/g2oCurveFitting.dir/all' failed
make[1]: *** [CMakeFiles/g2oCurveFitting.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

则还需要修改 CMakeLists.txt 文件,添加如下内容:

#list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
list(APPEND CMAKE_MODULE_PATH /my_work/slambook2-master/3rdparty/g2o/cmake_modules)
set(G2O_ROOT /usr/local/include/g2o)
find_package(G2O REQUIRED)
include_directories(
${G2O_INCLUDE_DIRS}
"/usr/include/eigen3"
)

这里需要注意其上的 /my_work/slambook2-master/3rdparty/g2o/cmake_modules 需要替换成你本人的路径。然后重新执行 make -j7,本人打印如下:
在这里插入图片描述
在目录下,可以看到生成了可执行文件 g2oCurveFitting,执行指令 ./g2oCurveFitting,本人打印结果如下:
在这里插入图片描述
 

五、结语

通过该篇博客,对 g2o 了进行了简单的介绍,搭建好了示例代码的环境并且运行其可执行文件。下面就是对代码进行细致的讲解了,也就是理论结合实践。

 
 
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

史上最简SLAM零基础解读(10.1) - g2o(图优化)→简介环境搭建(slam十四讲第二版为例) 的相关文章

  • 基于springboot的简单restful服务demo

    这篇文章主要是本人学习springboot时一个简单的测试demo xff0c 仅供参考 springboot的介绍 xff1a 由Pivotal团队提供的全新框架 xff0c 设计的目的是简化spring新应用搭建的过程 xff0c 使用
  • leetcode刷题 Day23(LRU缓存机制)

    题目 xff1a 思路 xff1a java用LinkHashMap解决 xff0c 在LRUCache中获取缓存容量 xff0c 在put方法中 xff0c 难点在于怎么进行判断最新数据和最不常用的数据 xff0c 这里采取这种办法 xf
  • 野火&洋桃STM32开发版学习指导完整版

    该文章是我历时一个月整理总结而成 xff0c 专门针对想要通过野火 amp 洋桃STM32开发板入门stm32的读者 由于csdn编辑限制 xff0c 该学习指导只包含文字信息 如需查看含图片的完整版可进入我的博客下载页 完整版内容详实 x
  • sumo学习——sumo的路网介绍

    2 sumo路网 这里的记录的内容 xff0c 并不以如何绘制或者如何建立一个路网体系为主 xff0c 而是较为详细的介绍 xff0c 在sumo中是如何定义路网格式的 这里所有的内容都是来自于sumo的软件说明翻译 xff0c 其中部分夹
  • webpack之devtool

    关于Devtool 该选项控制是否以及如何生成源映射 官网上给出的可选值有 xff1a 其中一些值适合开发 xff0c 一些用于生产 对于开发 xff0c 您通常需要快速的Source Maps xff0c 以bundle的大小为代价 xf
  • 汽车UDS诊断详解及Vector相关工具链使用说明——总述

    1 什么是诊断 车辆在运行过程中 xff0c 不可避免地会发生一些故障 xff0c 为了确保行车安全 xff0c 我们要求车上的ECU能够实时监测部件的运行状态 xff0c 一旦发现异常情况 xff0c 能通过点亮报警灯等方式提示驾驶员 但
  • 汽车UDS诊断详解及Vector相关工具链使用说明——2.2.7 动态定义DID(0x2C)

    1 概述 动态定义DID服务允许诊断仪在ECU内部动态定义一个临时的DID 可以通过该DID读取一段内存的数据 也可以通过改DID一次性读取多个原有DID的数据 动态定义DID既可以是支持22服务的DID 也可以是支持2A服务的周期性读取
  • 关于RTOS中信号量、互斥量、邮箱、消息队列的一些理解

    1 信号量 信号量有两种 xff1a 计数性信号量和二值信号量 xff0c 计数性信号量可以被获取多次 xff0c 二值信号量只有0和1两种状态 xff0c 只能被获取一次 信号量可以用来对资源进行保护 xff0c 防止多个任务同时访问某个
  • 英飞凌 AURIX 系列单片机的HSM详解(1)——何为HSM

    本系列的其它几篇文章 xff1a 英飞凌 AURIX 系列单片机的HSM详解 xff08 2 xff09 与HSM相关的UCB和寄存器 英飞凌 AURIX 系列单片机的HSM详解 xff08 3 xff09 开发方法 英飞凌 AURIX 系
  • DoIP(一)——基础概念

    1 DoIP概述 DoIP xff08 Diagnostic communication over Internet Protocol xff09 是基于车载以太网的诊断 xff0c 在OSI 七层模型中属于传输层 xff0c 其传输的诊断
  • DoIP(二)——报文类型

    我们上一篇文章提到 xff0c DoIP报头中有两字节的数据类型 xff08 Payload Type xff09 xff0c 代表DoIP报文类型 xff0c 本文就来详细介绍一下每一种报文类型 标准中对报文类型的定义如下 xff1a 数
  • AUTOSAR —— CAN网络管理(CanNm)

    1 网络状态 AUTOSAR网络管理节点内部有两个状态 xff0c 一个是Requested 被请求状态 xff0c 另一个是Released 被释放状态 xff0c 当节点的应用层需要使用总线进行通讯的时候 xff0c 会调用接口使得节点
  • S32K1XX系列单片机 ——(1)开发环境搭建

    本文介绍一下NXP S32系列单片机开发环境的搭建方法 xff0c 分两种 xff1a S32DS和Keil 1 S32DS S32DS是NXP开发的一款IDE xff0c 编译器是GCC xff0c 支持Lauterbach P amp
  • AUTOSAR —— S32K144 的 Fls 和 Fee 模块配置

    本文来简要介绍一下如何在EB中配置AUTOSAR Fls和Fee模块 Fls模块是Flash的驱动 xff0c 执行具体的Flash擦写读取等操作 Fee模块的全称是FlashEEPROMEmulation xff0c 即Flash模拟EE
  • NXP MCU CAN波特率(位时间)配置详解

    1 概述 本文将会详细讲解如何设置NXP MCU的CAN波特率 位时间 采样点等属性 波特率即CAN总线传输频率 xff0c 位时间是波特率的倒数 xff0c 例如波特率是500K xff0c 那么位时间 61 1 500000 61 0
  • 51单片机之蜂鸣器

    include 34 reg52 h 34 include 34 intrins h 34 typedef unsigned int ui typedef unsigned char uc define led P2 34 34 sbit
  • vnc配置

    centos版本在7 0以上的 一 安装 yum grouplist 查看是否已经安装过 yum groupinstall GNOME Desktop 如没有安装则运行命令安装 以root用户运行以下命令来安装vncserver yum i
  • 【WebAPI 验证】给 webapi加上token 验证(包括上传文件方法)

    需要给网站开发对接EMI 接口 xff0c 因此想通过Webapi 进行传递参数 xff0c 但是由于该方法不太安全 xff0c 因此不选用 xff0c 但是记录下该方法的使用 1 xff0c 创建WEBAPI 项目 xff0c 打开nug
  • 委托和事件

    一 委托与事件的区别 委托是一种用于存储方法引用的引用类型 xff0c 它定义了一种类型安全的调用回调方法的方式 事件使用委托来封装触发时将要调用的方法 xff0c 事件是一种函数成员 委托是指向一个方法的指针 xff0c 而且我们采取和调
  • OS文件/目录方法----获取当前py文件的路径

    获取当前py文件的路径 xff1a 1 直接获取 只返回当前文件的工作目录 aa 61 os getcwd print 39 当前文件的路径 39 aa 输出 当前文件的路径 G PycharmProjects SeleniumUnitte

随机推荐

  • vscode如何配置git-2022.10

    文章目录 1 vscode填写git配置2 打开git命令行界面 windows本地已经安装git 并配置成功 1 vscode填写git配置 在搜索框中搜索 terminal integrated automation profile w
  • LCD12864串口高级操作

    上面是LCD12864的串口通信时序图 其中RW是方向位 xff0c RS是命令数据选择位 xff0c SID为数据线 xff0c SCLK为时钟线 xff0c CS为使能端 其中CS为1时使能时序操作 xff0c 由图可以看出 xff0c
  • Ubuntu server 18.04 服务器配置

    文章目录 前言一 下载镜像 制作系统u盘启动盘二 安装设置三 创建用户 给普通用户root权限四 GPU驱动安装五 miniconda安装 操作虚拟环境常用指令六 pytracking环境配置总结 前言 例如 xff1a 原有centos服
  • OpenCV数据载入、显示与保存

    一 图像存储器 OpenCV提供了一个Mat类用于存储矩阵数据 Mat类用来保存矩阵类型的数据信息 xff0c 包括向量 矩阵 灰度或彩色图像等数据 Mat类分为矩阵头和指向存储数据的矩阵指针的两部分 矩阵头中包含矩阵的尺寸 存储方法 地址
  • Colab运行YOLOv5训练自己的数据集

    最近想使用YOLOv5模型训练自己的数据集 xff0c 但是没有GPU 所以白嫖一下Google的Colab 第一 xff1a 制作自己的数据集 这里给出一篇自己看过的博客写和博主自制的视频 xff0c 我觉得讲的挺好 xff0c 数据集方
  • HC05主从蓝牙通信的配置步骤

    HC05主从一体化蓝牙模块 xff0c 可以配置为一个主蓝牙和一个从蓝牙 xff0c 两个蓝牙之间实现互相通信 拿到蓝牙之后只需接VCC GND RX TX 首先让蓝牙进入AT模式 先按住蓝牙上的微动开关 xff0c 然后给蓝牙上电 蓝牙上
  • 游记_秦皇岛-北戴河两日游

    写在开篇 在北京上学 xff0c 经常收到各种关于秦皇岛 北戴河的安利 xff0c 一直想去但是都没有实现 xff0c 前段时间终于和男朋友决定用一个周末的时间 xff08 周五晚上从北京出发 xff0c 周六早上到秦皇岛 xff0c 周日
  • STM32学习之路(首篇)

    STM32的学习之路 xff0c 到目前为止学习32也有一段时间了 xff0c 学习32的过程和学51单片机的道路差不多 首先要拥有自己的32开发板 xff0c 我买的是正点原子的开发板 xff0c 商家提供了很多学习资料 xff0c 一开
  • STM32学习之路(五---IIC)

    IIC是由数据线SDA和时钟SCL构成的串行总线 xff0c 可以发送和接收数据 在CPU与被控IC之间 xff0c IC与IC之间进行双向传送 IIC总线在传送数据过程中共有三种类型的信号 xff0c 分别是 xff1a 开始信号 xff
  • PWM调速的原理

    PWM调速实质上是调节占空比 xff0c 我们都是根据占空比的大小来衡量速度 xff0c 但是为什么我们调节占空比就可以实现对速度的调节呢 xff1f 这就需要我们了解调速的本质 xff0c 我们用PWM调节速度问什么能够实现 xff1f
  • keil中显示expected expression

    在keil中出现error expected expression的错误 xff0c 网上很多人都是在 Misc Cortrols这里改一下写c99就好了 xff0c 但是我改过之后还是没好 xff0c 依然报警告 xff0c 后来我自己的
  • Linux学习(C语言学习之Gcc)

    言之者无罪 xff0c 闻之者足以戒 诗序 Linux的学习需要对C语言有一个透彻性的了解 xff0c 需要有非常好的C语言基础 xff0c Gcc是Linux中的C文件的一个编译器 xff08 当然也不只局限于C文件 xff09 Gcc最
  • 如何在 python中查询某个函数的使用方法

    在Python 中查询某个函数的使用 方法时由两种途径 xff1a 1 利用help来查询 xff0c 比如用help来查询print内置函数的使用 xff0c 直接打开Shell输入 help print 就可以了 2 利用Python官
  • 玩转电机驱动——电机编码器

    玩转电机驱动 电机编码器 文章目录 玩转电机驱动 电机编码器前言一 旋转编码器1 光学编码器2 光学旋转编码器与Arduino连接3 程序 二 Arduino Encoder h库相关知识1 硬件要求2 基本用法3 了解正交编码信号4 示例
  • 6、SYSTEM文件夹介绍

    1 delay文件夹 delay c和delay h两个文件 xff0c 其中有七个函数 xff1a void delay osschedlock void void delay osschedunlock void void delay
  • 姿态估计0-06:DenseFusion(6D姿态估计)-源码解析(2)-linemod数据集,预处理解读

    以下链接是个人关于DenseFusion 6D姿态估计 所有见解 xff0c 如有错误欢迎大家指出 xff0c 我会第一时间纠正 有兴趣的朋友可以加微信 xff1a 17575010159 相互讨论技术 若是帮助到了你什么 xff0c 一定
  • 动作识别0-02:mmaction2(SlowFast)-官方数据训练测试-ucf101

    以下链接是个人关于mmaction2 SlowFast 动作识别 所有见解 xff0c 如有错误欢迎大家指出 xff0c 我会第一时间纠正 有兴趣的朋友可以加微信 xff1a 17575010159 相互讨论技术 若是帮助到了你什么 xff
  • 如何快速找到你想要的文献

    阅读文献是深入科研和跟随前沿发展的必要条件 xff0c 大家写论文的时候也需要查阅各种文献 xff0c 引证自己的观点 很多人并不太清楚下载文献的途径 xff0c 只简单了解图书馆 xff0c 知网 xff0c sci等 xff0c 多者使
  • java中private,public,protected详解

    参照甲骨文的java文档 xff1a 点击打开链接 访问级别 访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法 有两个级别的访问控制 xff1a 1 在顶级 public或package private xff08 没有显式修饰符
  • 史上最简SLAM零基础解读(10.1) - g2o(图优化)→简介环境搭建(slam十四讲第二版为例)

    本人讲解关于slam一系列文章汇总链接 史上最全slam从零开始 文末正下方中心提供了本人 联系方式 xff0c 点击本人照片即可显示 W X