03、视觉SLAM详解
【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−tz0txty−tx0R
对极约束即空间点 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)π(KTipj)=Zc1K(Tipj) 的前两维。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−π(KTipj)∥Σij2
其中 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αjlcl(权重 α\alphaα 由3D点坐标预解出,∑lαjl=1\sum_l \alpha_{jl}=1∑lαjl=1),在相机坐标系下以控制点坐标 clcc_l^cclc 为未知数线性求解,再用一次 minT∑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}minIMU预积分残差i∑rB(zi+1bk,xi,xi+1)ΣB2+重投影残差(Huber核)(i,j)∈C∑ρ(∥uij−π(KTipj(λj))∥Σij2)+边缘化先验∥rp−Hpx∥Σp2
其中 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-SLAM3 | VINS-Fusion | DROID-SLAM |
|---|---|---|---|
| 前端 | ORB手工特征+词袋回环 | 光流跟踪+IMU紧耦合 | 学习稠密光流网络 |
| 后端 | 局部BA+全局位姿图 | 滑窗优化+边缘化先验 | 可微稠密BA(GPU迭代) |
| 传感器 | 单目/双目/RGB-D+IMU | 单目/双目+IMU,可融GPS | 单目/双目/RGB-D |
| 鲁棒性短板 | 弱纹理/低光失效 | 窗口边界误差、弱纹理退化 | 需GPU+预训练权重,跨域需微调 |
| 工程成熟度 | EuRoC/TUM-VI长期领先,生态最全 | 在线外参/时间标定能力强 | 研究向,生产部署少 |
| 对Jetson Orin | CPU可跑(编译链重) | CPU可跑,功耗友好 | 必须GPU,Orin上可试FP16 |
工程坑点三条:第一,单目必须做IMU初始化,ORB-SL3与VINS启动后原地静置+匀速平移 10~20 秒才能收敛尺度,羊场实车启动后别急着下发导航任务;第二,相机选型直接决定上限——全局快门、卷帘快门补偿、全局曝光对快速运动的清晰度影响巨大,卷帘快门下 ORB 匹配率会腰斩,预算允许时优先全局快门;第三,特征点法怕弱纹理是物理限制,羊舍白墙、光滑地坪区域 ORB 数量掉到 200 以下时,就要靠激光(第02篇)兜底——这也是为什么工业 AMR 最终都走向"激光打底、视觉补盲"的融合架构,而不是纯视觉。
6. 小结
- 视觉SLAM对AMR的价值不在替代激光做主定位,而在补盲、语义回环识别、以及给VLA提供视觉token。
- 前端ORB特征+对极几何给出相对位姿初值,PnP给出3D-2D的逐帧位姿跟踪,BA把位姿与地图点联合优化——三者构成视觉SLAM的完整数学闭环。
- ORB-SLAM3是特征点法的工程天花板(多地图Atlas+VIO初始化),VINS-Fusion代表滑窗紧耦合范式(在线标定强),DROID-SLAM代表学习法稠密BA的研究前沿。
- 纯视觉在弱纹理、快速运动、尺度可观性上都有硬伤,工业落地必须与激光、IMU紧耦合。
下一篇,我们就把"激光+IMU"这条线推到工业主力形态:LIO-SAM紧耦合多传感器融合——完整推导四因子图代价函数、IMU预积分的旋转/速度/位置增量与协方差传播,并对比 Point-LIO、FAST-LIO2、FAST-LIVO2 的适用场景,最后手写一个 C++ IMU预积分类。
参考资料
- 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
- ORB-SLAM3 开源仓库(UZ-SLAMLab). https://github.com/UZ-SLAMLab/ORB_SLAM3
- 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
- VINS-Fusion 开源仓库(HKUST Aerial Robotics). https://github.com/HKUST-Aerial-Robotics/VINS-Fusion
- 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
- DROID-SLAM 开源仓库(Princeton Vision & Learning). https://github.com/princeton-vl/DROID-SLAM
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)