【AMR从SLAM到VLA】视觉SLAM详解:ORB-SLAM3特征点法 vs VINS-Fusion滑窗优化 vs DROID-SLAM学习法

摘要:上一篇我们把激光SLAM的两大流派(图优化 Cartographer 系与误差状态滤波 FAST-LIO 系)推导了一遍。本篇回答一个工程问题:激光雷达已经能建图导航了,AMR 为什么还必须再上一路视觉?我们从多层羊场巡检机器人被货架遮挡激光雷达的真实痛点出发,完整推导视觉SLAM前端三件套——ORB特征提取与对极几何、PnP位姿求解、BA光束法平差——并对比 ORB-SLAM3(特征点法集大成者)、VINS-Fusion(滑窗紧耦合VIO)、DROID-SLAM(学习法稠密BA)三条技术路线。最后给出一个可在 ROS2 Humble 下编译运行的 C++ ORB 特征检测节点(OpenCV),含 CMakeLists 要点与预期输出。

1. 问题引入

我们的多层智慧羊场巡检机器人跑在这样一种环境里:羊舍是多层货架式结构,饲槽、围栏、料塔密密麻麻,16线激光雷达装在底盘约 30 cm 高处。现场调试时暴露了三个纯激光解决不了的问题。

第一,激光存在天然盲区与退化方向。激光雷达只"看见"三维几何:平整的白墙、光滑的地坪、长直走廊,点云特征稀疏,scan matching 退化,里程计迅速漂移(这一点在第02篇 ICP 残差推导中已经分析过——当面元法向量近似共线时,点到面残差对该方向的运动不可观)。而羊舍里大量存在这种"几何单调"的区域。

第二,激光会被遮挡,且遮挡是常态不是意外。巡检通道宽约 1.2 m,两侧围栏与料架经常把 16 线激光的半数光束切掉。一旦激光点云被大面积遮挡,前端特征提取(edge/surface)的匹配对数量骤降,里程计直接失锁。

第三,也是最关键的——激光地图"看不懂语义"。巡检任务要求机器人"去3号羊舍检查湿度"。湿度计挂在墙上、看板挂在通道口、料塔上有铭牌,这些东西在点云地图里只是一团无差别的反射点。机器人靠激光知道"我在哪个坐标",但永远不知道"墙上这块表写着 62%"。视觉恰恰是唯一能直接拿到纹理、文字、物体外观的传感器——而这正是后续 VLA 大模型理解世界所需的视觉 token 来源(详见第08篇)。

所以视觉SLAM在AMR上的定位很清楚:它不替代激光做主定位,而是承担三件事——无激光条件下的轻量补盲(低成本VIO)、回环时的语义识别(激光地图认不出招牌与看板)、以及为语义建图和VLA提供连续视觉输入。本篇就把这条技术线讲透:特征点法怎么做、滑窗优化怎么做、学习法又改了什么。

2. 原理推导

2.1 视觉前端:ORB特征提取与匹配

视觉SLAM的第一步,是从两帧图像里找出"同一个东西在两个视角下分别长什么样"。特征点法选择手工设计特征:在图像上检测角点(FAST:像素灰度比周围一圈足够亮或足够暗的局部极值点),再为每个角点计算一个二进制描述子(BRIEF:以该角点为中心,按固定模式比较成对像素的灰度大小,得到一串 256 bit 的 0/1 串)。ORB 在 BRIEF 基础上做了方向归一化(给角点加主方向),使描述子具备旋转不变性。

提取出的 ORB 关键点带尺度金字塔(不同高斯模糊+降采样层级),因而也有尺度不变性。两帧之间的匹配就是在描述子空间里做最近邻搜索——通常用 Hamming 距离(二进制串逐位异或后数 1 的个数),并要求"最近邻距离 / 次近邻距离"小于 0.7~0.8 的 ratio,以剔除歧义匹配。这一步的产物是若干对 (u_1, u_2) 像素坐标匹配,是后续所有几何估计的输入。

2.2 对极几何:从两帧2D匹配恢复相机运动

有了两帧图像间的匹配点对 (x_1, x_2)(归一化平面坐标),我们可以不解任何3D结构,先把相机间的相对位姿 (R, t) 求出来——这就是对极几何。

几何关系是:两相机光心 O1,O2O_1, O_2O1​,O2​ 与空间点 PPP 构成极平面。PPP 在第一帧的射线方向为 x1x_1x1​,该射线在第二帧成像平面上投影出一条极线,x2x_2x2​ 必须落在这条极线上。这条约束用一个 3×3 矩阵——本质矩阵(Essential Matrix)——写成一行等式。对极约束(见第3节公式3-1)的好处是:它把位姿求解从"非线性三角化"拆成两步——先对匹配对做八点法(Eight-point)奇异值分解解出 EEE,再对 EEE 做 SVD 分解恢复 RRR 与 ttt。E=[t]×RE=[t]_\times RE=[t]×​R 的 SVD 分解理论上给出 4 组解(两种旋转方向 × 两种平移方向组合),用一组匹配点三角化后检查深度是否为正,即可筛出唯一解。这就是单目视觉SLAM初始化阶段的标准流程。

要注意的两个坑:其一,单目只能恢复到尺度未知的 ttt(EEE 整体乘任意标量都成立),这是单目视觉里程计必须靠 IMU 或双目补尺度的根因;其二,纯对极几何在纯旋转运动下退化(t=0t=0t=0 时极线无意义),所以初始化要求相机做充分平移。

2.3 PnP:从3D-2D对应求位姿

一旦某些特征点已经三角化出了3D坐标 pjp_jpj​(建在世界坐标系下),新到一帧图像时,我们有一批"已知3D位置—新帧2D像素"的对应,求当前相机位姿 TTT——这就是 PnP(Perspective-n-Point)问题。这是视觉里程计每个关键帧都在解的核心问题。

最朴素的做法是 DLT(Direct Linear Transform):把投影关系展开成关于投影矩阵 12 个未知元素的线性方程组,6 对点以上即可求解,再从投影矩阵分解出 R,tR, tR,t。工程上几乎不用 DLT,因为它没有利用"旋转矩阵必须正交"的内蕴约束,精度差且对噪声敏感。实际主流是 EPnP(Efficient PnP):把 nnn 个3D点表示成 4 个虚拟控制点的加权和,待求量从 nnn 个3D点的坐标降为 4 个控制点在相机坐标系下的坐标(12个未知数),先线性解出控制点坐标,再反求 R,tR, tR,t,最后用一次高斯-牛顿迭代精化。OpenCV 的 solvePnP 函数(默认迭代法)与 solvePnPRansac(带外点剔除)封装的就是这条路线。PnP 的残差形式本身就是一个最小二乘问题,与下文 BA 同构。

2.4 BA:光束法平差,视觉SLAM的后端本体

前端得到的位姿是有噪声的,匹配也有外点。视觉SLAM后端的统一解法是 Bundle Adjustment(BA):把所有关键帧位姿 {Ti}\{T_i\}{Ti​} 和所有地图点 {pj}\{p_j\}{pj​} 当作待优化变量,最小化"重投影误差"——即把3D点用当前估计的位姿重新投回图像,与实际观测到的像素位置之差的平方和(公式见3-2)。这是一个大规模稀疏非线性最小二乘问题:雅可比矩阵只有"观测到某点的帧×某点"的位置非零,天然稀疏,可用 Levenberg–Marquardt 求解。ORB-SLAM 系用 g2o,VINS 系用自实现的滑窗边缘化,DROID-SLAM 用可微网络迭代做同一件事。理解了 BA 的代价函数,就理解了视觉SLAM后端 80% 的内容。

2.5 三个代表系统的架构差异

ORB-SLAM3(特征点法工程天花板):三线程架构——跟踪线程(每帧提取ORB、用词袋DBoW2找参考帧、PnP定位)、局部建图线程(插入关键帧、三角化新点、做局部BA)、回环线程(DBoW2检测回环、计算4/7自由度位姿图校正)。它的两个标志性扩展:一是 Atlas 多地图系统——跟踪丢失时不报错退出,而是开一张新图继续跑,重访旧图时无缝合并两张图的位姿图,这对频繁被遮挡的巡检场景极其实用;二是首次把紧耦合视觉惯性(含专门的IMU初始化阶段:先纯视觉估计重力方向与尺度,再对齐IMU预积分)与单目/双目/RGB-D统一进同一框架。

VINS-Fusion(滑窗优化范式):它不做全图BA,而是维护一个滑动窗口(通常10帧左右关键帧),在窗口内把"IMU预积分残差 + 特征重投影残差"联合优化(公式见3-4);窗口滑出最老帧时,用**边际化(marginalization)**把它的信息浓缩成一个先验因子保留下来,避免信息丢失。它还带在线相机-IMU外参标定与在线时间偏移标定——这对自己攒传感器的工程团队是巨大福音。代价是窗口固定带来边界误差,且无全局回环时长程漂移仍在。

DROID-SLAM(学习法稠密BA):前两条路线都是"手工特征 + 几何优化"。DROID-SLAM 换了一个底座:用一个在大规模数据集上训练好的稠密光流Transformer网络直接预测两帧之间的稠密对应关系(替代手工ORB匹配),然后在网络内部循环迭代地做可微的稠密BA——即把位姿和逐像素深度都当成可微张量,用梯度下降在GPU上优化重投影残差。它的意义在于:特征匹配不再受限于"角点是否可检测",在低纹理、光照剧变的挑战性场景上大幅超过传统特征法;代价是必须有GPU、需要预训练权重、可解释性与跨域泛化不如传统法。对AMR来说,DROID的价值更多是"学习法SLAM"的研究前沿,也是从几何导航走向VLA(第08篇)的技术桥梁——既然光流都能学了,动作当然也能学。

3. 公式推导

公式3-1:对极约束与本质矩阵分解。 设归一化平面坐标 x1,x2x_1, x_2x1​,x2​,相机间相对运动为 R∈SO(3)R \in SO(3)R∈SO(3)、平移 t∈R3t \in \mathbb{R}^3t∈R3,[t]×[t]_\times[t]×​ 为 ttt 的反对称矩阵。本质矩阵定义为

E=[t]×R=[0−tztytz0−tx−tytx0]RE = [t]_\times R = \begin{bmatrix} 0 & -t_z & t_y \\ t_z & 0 & -t_x \\ -t_y & t_x & 0 \end{bmatrix} RE=[t]×​R=​0tz​−ty​​−tz​0tx​​ty​−tx​0​​R

对极约束即空间点 PPP 在两帧成像满足

x2⊤E x1=0x_2^{\top} E \, x_1 = 0x2⊤​Ex1​=0

用八点法对所有匹配对堆成 Ae=0A e = 0Ae=0(eee 为 EEE 的列向量化),SVD 取最小奇异值对应的右奇异向量;再对 E=UΣV⊤E = U \Sigma V^\topE=UΣV⊤ 强制奇异值为 (1,1,0)(1,1,0)(1,1,0) 后恢复 R=URZ⊤(π/2)V⊤R = U R_Z^\top(\pi/2) V^\topR=URZ⊤​(π/2)V⊤ 及其转置组合,共四解,三角化验证深度为正即得唯一相对位姿。注意 ttt 只恢复到方向,模长任意——单目尺度不可观。

公式3-2:BA重投影误差代价函数。 设关键帧位姿 Ti∈SE(3)T_i \in SE(3)Ti​∈SE(3)(外参),相机内参 KKK,地图点 pj∈R3p_j \in \mathbb{R}^3pj​∈R3,观测像素 uiju_{ij}uij​(当且仅当帧 iii 观测到点 jjj)。π(⋅)\pi(\cdot)π(⋅) 为针孔投影模型:π(KTipj)=1Zc K (Tipj)\pi(K T_i p_j) = \frac{1}{Z_c}\, K\, (T_i p_j)π(KTi​pj​)=Zc​1​K(Ti​pj​) 的前两维。BA最小化所有观测的重投影残差平方和:

min⁡{Ti},{pj}∑(i,j)∈O∥uij−π ⁣(K Ti pj)∥Σij2\min_{\{T_i\},\{p_j\}} \sum_{(i,j)\in \mathcal{O}} \left\| u_{ij} - \pi\!\left(K\, T_i\, p_j\right) \right\|_{\Sigma_{ij}}^{2}{Ti​},{pj​}min​(i,j)∈O∑​∥uij​−π(KTi​pj​)∥Σij​2​

其中 O\mathcal{O}O 为观测集合,∥e∥Σ2=e⊤Σ−1e\|e\|_{\Sigma}^2 = e^\top \Sigma^{-1} e∥e∥Σ2​=e⊤Σ−1e 为马氏距离(Σ\SigmaΣ 为像素观测协方差,通常取对角阵即等价于加权最小二乘)。对 TiT_iTi​ 在李代数上扰动 δξ\delta\xiδξ、对 pjp_jpj​ 直接扰动 δp\delta pδp 后线性化残差,得正规方程 H δx=−bH\,\delta x = -bHδx=−b,高斯-牛顿/LM迭代求解。这就是 ORB-SLAM3 局部建图线程每个关键帧都在跑的优化。

公式3-3:PnP投影残差(EPnP的优化后端)。 设已有地图点 pjp_jpj​ 及其在当前帧的观测 uju_juj​,待求当前帧位姿 T=(R,t)T = (R, t)T=(R,t),投影残差定义为

ej(T)=uj−π ⁣(K (Rpj+t))e_j(T) = u_j - \pi\!\left(K\,(R p_j + t)\right)ej​(T)=uj​−π(K(Rpj​+t))

EPnP 先把 nnn 个点表示为四个虚拟控制点 clc_lcl​ 的加权和 pj=∑l=14αjlclp_j = \sum_{l=1}^{4} \alpha_{jl} c_lpj​=∑l=14​αjl​cl​(权重 α\alphaα 由3D点坐标预解出,∑lαjl=1\sum_l \alpha_{jl}=1∑l​αjl​=1),在相机坐标系下以控制点坐标 clcc_l^cclc​ 为未知数线性求解,再用一次 min⁡T∑j∥ej(T)∥2\min_T \sum_j \|e_j(T)\|^2minT​∑j​∥ej​(T)∥2 的高斯-牛顿迭代精化位姿。OpenCV solvePnP 的迭代模式与 solvePnPRansac(加RANSAC外点剔除)即为此路线,ROS2视觉节点中直接调用即可。

公式3-4:VINS-Fusion滑窗联合代价。 滑窗内关键帧位姿与速度 {xi}\{x_i\}{xi​}、特征点逆深度 {λj}\{\lambda_j\}{λj​} 为变量,联合最小化IMU预积分残差、重投影残差与边缘化先验:

min⁡{xi},{λj}∑i∥rB(zi+1bk,xi,xi+1)∥ΣB2⏟IMU预积分残差+∑(i,j)∈Cρ ⁣(∥uij−π ⁣(K Ti pj(λj))∥Σij2)⏟重投影残差(Huber核)+∥rp−Hpx∥Σp2⏟边缘化先验\min_{\{x_i\},\{\lambda_j\}} \underbrace{\sum_i \left\| r_{\mathcal{B}}\big(z_{i+1}^{b_k}, x_i, x_{i+1}\big) \right\|_{\Sigma_{\mathcal{B}}}^{2}}_{\text{IMU预积分残差}} + \underbrace{\sum_{(i,j)\in\mathcal{C}} \rho\!\left(\left\| u_{ij} - \pi\!\left(K\, T_i\, p_j(\lambda_j)\right) \right\|_{\Sigma_{ij}}^{2}\right)}_{\text{重投影残差(Huber核)}} + \underbrace{\left\| r_p - H_p x \right\|_{\Sigma_p}^{2}}_{\text{边缘化先验}}{xi​},{λj​}min​IMU预积分残差i∑​​rB​(zi+1bk​​,xi​,xi+1​)​ΣB​2​​​+重投影残差(Huber核)(i,j)∈C∑​ρ(∥uij​−π(KTi​pj​(λj​))∥Σij​2​)​​+边缘化先验∥rp​−Hp​x∥Σp​2​​​

其中 rBr_{\mathcal{B}}rB​ 为由 IMU 预积分观测量 αˉi+1i,βˉi+1i,θˉi+1i\bar{\alpha}_{i+1}^i, \bar{\beta}_{i+1}^i, \bar{\theta}_{i+1}^iαˉi+1i​,βˉ​i+1i​,θˉi+1i​ 与当前状态预测值之差构成的残差(预积分细节在第04篇完整推导),ρ(⋅)\rho(\cdot)ρ(⋅) 为 Huber 鲁棒核函数抑制误匹配,pj(λj)p_j(\lambda_j)pj​(λj​) 表示特征点深度由逆深度参数化(逆深度在高斯-牛顿下近似线性,数值更稳)。

4. 代码验证

下面给出一个可直接编译进 ROS2 Humble 工作空间的 C++ 节点:订阅相机 image_raw,逐帧做 ORB 特征检测与描述子计算,用 BFMatcher 与上一帧做匹配,并把带特征点与匹配连线的可视化图发布出去。这是理解 ORB-SLAM3 跟踪线程前端最小可用的教学切片。

// orb_frontend_node.cpp
#include <chrono>
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "sensor_msgs/msg/image.hpp"
#include "cv_bridge/cv_bridge.h"
#include "opencv2/opencv.hpp"
#include "opencv2/features2d.hpp"

class OrbFrontendNode : public rclcpp::Node
{
public:
  OrbFrontendNode() : Node("orb_frontend_node")
  {
    // 参数声明:ORB 最大特征点数与 ratio 匹配阈值
    max_features_ = this->declare_parameter<int>("max_features", 1000);
    ratio_thresh_ = this->declare_parameter<double>("ratio_thresh", 0.75);

    orb_ = cv::ORB::create(max_features_, 1.2f, 8, 31, 0, 2,
                           cv::ORB::HARRIS_SCORE, 31, 20);
    matcher_ = cv::BFMatcher::create(cv::NORM_HAMMING);

    image_sub_ = this->create_subscription<sensor_msgs::msg::Image>(
      "image_raw", 10,
      std::bind(&OrbFrontendNode::image_callback, this, std::placeholders::_1));
    match_pub_ = this->create_publisher<sensor_msgs::msg::Image>("orb_matches", 10);

    RCLCPP_INFO(this->get_logger(),
                "ORB frontend started, max_features=%d, ratio=%.2f",
                max_features_, ratio_thresh_);
  }

private:
  void image_callback(const sensor_msgs::msg::Image::SharedPtr msg)
  {
    // 1. ROS图像 -> OpenCV灰度图
    cv::Mat gray = cv_bridge::toCvShare(msg, "mono8")->image;

    // 2. 检测ORB关键点 + 计算BRIEF描述子
    std::vector<cv::KeyPoint> kp;
    cv::Mat desc;
    orb_->detectAndCompute(gray, cv::noArray(), kp, desc);
    if (desc.empty()) { return; }

    // 3. 与上一帧做KNN匹配 + ratio test剔除歧义匹配
    if (!prev_desc_.empty()) {
      std::vector<std::vector<cv::DMatch>> knn;
      matcher_->knnMatch(prev_desc_, desc, knn, 2);
      std::vector<cv::DMatch> good;
      for (const auto & m : knn) {
        if (m[0].distance < ratio_thresh_ * m[1].distance) {
          good.push_back(m[0]);   // 最近邻显著优于次近邻才算匹配
        }
      }
      // 4. 可视化:画关键点 + 匹配连线
      cv::Mat viz;
      cv::drawMatches(prev_gray_, prev_kp_, gray, kp, good, viz);
      auto out = cv_bridge::CvImage(msg->header, "bgr8", viz).toImageMsg();
      match_pub_->publish(*out);
      RCLCPP_INFO_THROTTLE(this->get_logger(), *this->get_clock(), 2000,
                           "kpts=%zu good_matches=%zu", kp.size(), good.size());
    }

    // 5. 缓存当前帧作为下一帧的"上一帧"
    prev_gray_ = gray.clone();
    prev_kp_ = kp;
    prev_desc_ = desc.clone();
  }

  rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr image_sub_;
  rclcpp::Publisher<sensor_msgs::msg::Image>::SharedPtr match_pub_;
  cv::Ptr<cv::ORB> orb_;
  cv::Ptr<cv::BFMatcher> matcher_;
  cv::Mat prev_gray_, prev_desc_;
  std::vector<cv::KeyPoint> prev_kp_;
  int max_features_;
  double ratio_thresh_;
};

int main(int argc, char ** argv)
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<OrbFrontendNode>());
  rclcpp::shutdown();
  return 0;
}

CMakeLists.txt 要点(find_package / add_executable / ament_target_dependencies 三行核心):

cmake_minimum_required(VERSION 3.8)
project(orb_frontend)

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(cv_bridge REQUIRED)
find_package(OpenCV REQUIRED)

add_executable(orb_frontend_node src/orb_frontend_node.cpp)
target_include_directories(orb_frontend_node PRIVATE ${OpenCV_INCLUDE_DIRS})
ament_target_dependencies(orb_frontend_node rclcpp sensor_msgs cv_bridge)
target_link_libraries(orb_frontend_node ${OpenCV_LIBS})

install(TARGETS orb_frontend_node DESTINATION lib/${PROJECT_NAME})
ament_package()

运行方式(ROS2 Humble,相机驱动已发布 image_raw):

colcon build --packages-select orb_frontend
source install/setup.bash
ros2 run orb_frontend orb_frontend_node
# 另开终端用 rqt_image_view 订阅 orb_matches 查看匹配连线
ros2 run rqt_image_view rqt_image_view

预期输出:终端每 2 秒打印一行,类似 [INFO] [...] kpts=987 good_matches=412——静止时 good_matches 接近 0(无视差),机器人平移时 good_matches 上升到 300~500,视角快速转动或进入白墙区域时 kpts 数量明显下降(这就是特征点法怕弱纹理的直接证据)。这个数字衰减曲线,就是你判断"哪些路段视觉SLAM要失锁"的第一手依据。

5. 工程落地与对比

把三个系统放在AMR选型视角下对比:

维度ORB-SLAM3VINS-FusionDROID-SLAM
前端ORB手工特征+词袋回环光流跟踪+IMU紧耦合学习稠密光流网络
后端局部BA+全局位姿图滑窗优化+边缘化先验可微稠密BA(GPU迭代)
传感器单目/双目/RGB-D+IMU单目/双目+IMU,可融GPS单目/双目/RGB-D
鲁棒性短板弱纹理/低光失效窗口边界误差、弱纹理退化需GPU+预训练权重,跨域需微调
工程成熟度EuRoC/TUM-VI长期领先,生态最全在线外参/时间标定能力强研究向,生产部署少
对Jetson OrinCPU可跑(编译链重)CPU可跑,功耗友好必须GPU,Orin上可试FP16

工程坑点三条:第一,单目必须做IMU初始化,ORB-SL3与VINS启动后原地静置+匀速平移 10~20 秒才能收敛尺度,羊场实车启动后别急着下发导航任务;第二,相机选型直接决定上限——全局快门、卷帘快门补偿、全局曝光对快速运动的清晰度影响巨大,卷帘快门下 ORB 匹配率会腰斩,预算允许时优先全局快门;第三,特征点法怕弱纹理是物理限制,羊舍白墙、光滑地坪区域 ORB 数量掉到 200 以下时,就要靠激光(第02篇)兜底——这也是为什么工业 AMR 最终都走向"激光打底、视觉补盲"的融合架构,而不是纯视觉。

6. 小结

  1. 视觉SLAM对AMR的价值不在替代激光做主定位,而在补盲、语义回环识别、以及给VLA提供视觉token。
  2. 前端ORB特征+对极几何给出相对位姿初值,PnP给出3D-2D的逐帧位姿跟踪,BA把位姿与地图点联合优化——三者构成视觉SLAM的完整数学闭环。
  3. ORB-SLAM3是特征点法的工程天花板(多地图Atlas+VIO初始化),VINS-Fusion代表滑窗紧耦合范式(在线标定强),DROID-SLAM代表学习法稠密BA的研究前沿。
  4. 纯视觉在弱纹理、快速运动、尺度可观性上都有硬伤,工业落地必须与激光、IMU紧耦合。

下一篇,我们就把"激光+IMU"这条线推到工业主力形态:LIO-SAM紧耦合多传感器融合——完整推导四因子图代价函数、IMU预积分的旋转/速度/位置增量与协方差传播,并对比 Point-LIO、FAST-LIO2、FAST-LIVO2 的适用场景,最后手写一个 C++ IMU预积分类。

参考资料

  1. C. Campos et al., ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual–Inertial, and Multi-Map SLAM, IEEE T-RO 2021/2022. https://arxiv.org/pdf/2007.11898.pdf
  2. ORB-SLAM3 开源仓库(UZ-SLAMLab). https://github.com/UZ-SLAMLab/ORB_SLAM3
  3. T. Qin, P. Li, S. Shen, VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator, IEEE T-RO 2018. https://arxiv.org/pdf/1708.03852.pdf
  4. VINS-Fusion 开源仓库(HKUST Aerial Robotics). https://github.com/HKUST-Aerial-Robotics/VINS-Fusion
  5. Z. Teed, J. Deng, DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Cameras, NeurIPS 2021. https://arxiv.org/pdf/2108.10869.pdf
  6. DROID-SLAM 开源仓库(Princeton Vision & Learning). https://github.com/princeton-vl/DROID-SLAM
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐