FAST-LIO与FAST-LIO2:详细技术对比分析

FAST-LIO与FAST-LIO2:详细技术对比分析

作者: soar
日期: 2025-12-15
基于: FAST-LIO GitHub官方源代码分析
阅读时间: 15-20分钟


📌 文章导读

本文详细对比FAST-LIO和FAST-LIO2两个激光雷达-惯性里程计(LIO)系统的核心差异、算法改进、性能提升等方面。对于SLAM系统开发和性能优化具有重一定参考价值。


一、项目概览

1.1 基本信息

指标 FAST-LIO FAST-LIO2
发布时间 2020年 2021年7月
版本 v1.0 v2.0+
开发团队 香港大学MARS实验室 香港大学MARS实验室
GitHub github.com/hku-mars/FAST_LIO github.com/hku-mars/FAST_LIO2
论文 IROS 2020 TRO 2022
代码行数 ~5000行 ~8000行
依赖复杂度 中等 较高(ikd-Tree)

1.2 核心目标对比

FAST-LIO的目标:

  • 快速、鲁棒的LiDAR-IMU融合
  • 特征提取方法
  • 紧耦合的迭代扩展卡尔曼滤波

FAST-LIO2的目标:

  • 更快的速度(100Hz+)
  • 无需特征提取的直接方法
  • 通用的LiDAR支持
  • 超大规模地图增量构建

二、核心算法对比

2.1 点云处理方式

FAST-LIO 点云处理流程
复制代码
原始点云
  ↓
特征提取 (Edge/Planar)
  ↓
基于特征的匹配
  ↓
IEKF优化

特点:

  • 强制进行特征提取
  • 对特征质量高的场景效果好
  • 计算量相对较小
  • 对点云密度要求高

代码示例(preprocess.h):

cpp 复制代码
struct PointType {
    float x, y, z;
    int intensity;
    int label;  // 特征标签: 0=未分类, 1=边缘, 2=平面
};
FAST-LIO2 点云处理流程
复制代码
原始点云
  ↓
[可选]特征提取
  ↓
直接扫描配准 (Scan-to-Map)
  ↓
使用ikd-Tree进行点云搜索
  ↓
IEKF优化

特点:

  • 特征提取可选(disable)
  • 使用所有原始点进行匹配
  • 支持超高频率LiDAR(100Hz+)
  • 对点云类型适应性强

2.2 地图表示方式

FAST-LIO 的地图结构
cpp 复制代码
// 使用标准的KD-Tree存储地图点
pcl::KdTreeFLANN<PointType> kdTree;
vector<PointType> global_map;

// 特点:
// 1. 全局地图一次性加载到内存
// 2. 使用标准KD-Tree搜索
// 3. 地图增长会导致搜索效率下降

问题:

  • 地图规模受内存限制
  • 大规模环境下搜索速度下降(O(logN) → O(N))
  • 无法进行在线地图清剪
FAST-LIO2 的增量地图结构 (ikd-Tree)
cpp 复制代码
// 使用动态KD-Tree (ikd-Tree)
ikdtree::KD_TREE<PointType> kdtree;

// 特点:
// 1. 增量添加/删除点
// 2. 动态平衡(rebounding box)
// 3. 支持范围删除(range-based deletion)
// 4. O(logN) 搜索复杂度保持稳定

优势:

cpp 复制代码
// FAST-LIO2的核心改进:ikd-Tree
struct ikdtree::Node {
    PointType point;
    size_t idx;
    Node *left, *right;
    int size;              // 子树大小
    float box_range[6];    // 节点范围
    bool point_deleted;    // 删除标记
};

// 关键操作
kdtree.Add_Points(vec_points);        // 增量添加
kdtree.Delete_Points(vec_points);     // 增量删除
kdtree.Radius_Nearest_Search(point);  // 范围搜索

2.3 滤波算法对比

FAST-LIO 的IEKF框架
复制代码
迭代扩展卡尔曼滤波 (Iterated EKF)
│
├─ 预测步骤
│  └─ IMU预积分 (简单累加)
│
├─ 迭代更新
│  ├─ 首次迭代:粗匹配
│  ├─ 第i次迭代:精细匹配 (多达5次)
│  └─ Jacobian重新计算
│
└─ 输出:位置、速度、姿态

数学模型:

复制代码
状态向量 X = [p, v, θ, ba, bg, s]
  p: 位置 (3维)
  v: 速度 (3维)
  θ: 旋转 (3维, SO(3))
  ba: 加速度计偏差 (3维)
  bg: 陀螺仪偏差 (3维)
  s: 尺度因子 (1维)

测量模型: z = h(X) + n
  基于特征点到地图特征的距离
FAST-LIO2 的IKFoM框架
复制代码
流形上的迭代卡尔曼滤波 (IKFoM)
│
├─ 在SO(3)流形上的状态表示
│
├─ 更复杂的IMU预积分
│  ├─ 方差传播
│  ├─ 零速度检测 (ZUPT)
│  └─ 重力对齐
│
├─ 迭代更新 (流形约束)
│  ├─ 反向迭代优化
│  ├─ 动态迭代次数
│  └─ 自适应数值求解
│
└─ 输出:精确的位置、速度、姿态、外参

数学优势:

复制代码
FAST-LIO2使用IKFoM的好处:
1. SO(3)约束:保证旋转矩阵的正交性
2. 流形参数化:避免奇异性(gimbal lock)
3. 更好的数值稳定性
4. 支持自动外参估计

关键代码结构 (use-ikfom.hpp):
struct STAT {
    Eigen::Matrix3d rot;     // SO(3)旋转
    Eigen::Vector3d pos;     // 位置
    Eigen::Vector3d vel;     // 速度
    Eigen::Vector3d ba;      // 加速度计偏差
    Eigen::Vector3d bg;      // 陀螺仪偏差
    // ... 更多状态
};

2.4 特征提取方式对比

FAST-LIO 的特征提取
cpp 复制代码
// 基于曲率的特征分类
struct PointCloudCurvature {
    float curvature;  // 曲率值
    int idx;          // 点的索引
    int intensity;    // 强度

    // 分类规则
    if (curvature > threshold_edge) {
        label = EDGE;      // 边缘点
    } else if (curvature < threshold_planar) {
        label = PLANAR;    // 平面点
    } else {
        label = UNKNOWN;   // 未知
    }
};

特征提取步骤:

  1. 扫描行分割 (Scan segmentation)

    复制代码
    扫描一圈 → 分成多条扫描线 → 每条线提取特征
  2. 曲率计算 (Curvature calculation)

    cpp 复制代码
    // 相邻5个点计算曲率
    c = ||point_center - sum(neighbors)/4||
  3. 特征选择 (Feature selection)

    • 边缘点:高曲率 (c > 0.1)
    • 平面点:低曲率 (c < 0.01)
    • 采样率:每行选取约10个特征点

优点:

  • 计算简单快速
  • 对特征丰富的环境效果好

缺点:

  • 在弱纹理区域表现不佳
  • 无法处理均匀点云
  • 需要调参
FAST-LIO2 的直接方法 (Feature-Free)
复制代码
✓ 支持原始点(无特征提取)
✓ 支持边缘特征点
✓ 支持平面特征点
✓ 支持混合模式

特点:
- 使用所有点进行配准
- 无需曲率计算
- 自适应点云处理
- 对各种LiDAR类型通用

直接方法的实现:

cpp 复制代码
// FAST-LIO2: 直接点到面距离
// 无需显式特征提取

for (auto& point : raw_cloud) {
    // 1. 搜索最近邻
    kdtree.Radius_Nearest_Search(point, radius);

    // 2. 拟合局部平面
    fit_plane(neighbors);  // SVD分解

    // 3. 计算点到平面距离
    residual = distance_to_plane(point, plane);

    // 4. 用于IEKF更新
    update_state_with_residual(residual);
}

理论基础:

复制代码
点到面距离残差 (Point-to-plane residual):
r = (p_i - p_j) · n
  p_i: 当前帧的点
  p_j: 地图中邻近点
  n: 局部平面法向量(通过SVD求解)

优势:
1. 对旋转更敏感 → 更好的角度估计
2. 计算量少 → 支持更高频率
3. 不依赖特征 → 通用性强

三、技术架构对比

3.1 系统框架图

FAST-LIO 架构

输入: LiDAR + IMU 点云预处理
Preprocess 畸变校正 特征提取 (强制) 边缘特征 平面特征 IMU处理
IMU_Processing 预积分 偏差估计 姿态更新 特征匹配
Feature matching KD-Tree搜索 特征关联 IEKF优化
Iterated EKF 迭代匹配优化 卡尔曼滤波 地图管理
Mapping 点云拼接 全局地图维护 输出: Odometry + Map

FAST-LIO2 架构

输入: LiDAR 多种类型 + IMU 点云预处理
Preprocess 改进版 畸变校正 高精度 特征提取 可选 可禁用 feature_disable 增强IMU处理
Enhanced IMU_Processing 改进的预积分 方差传播 零速度检测 ZUPT 重力对齐 直接配准
Direct Scan-to-Map ikd-Tree搜索
高效增量 点到面距离
无需特征 局部平面拟合 SVD IKFoM优化
流形约束 SO(3)约束 反向迭代 自适应迭代 增量地图管理
ikd-Tree Mapping 增量添加点 范围删除 box delete 动态平衡 支持100Hz+频率 输出: Odometry + Incremental Map

3.2 关键模块对比

模块 FAST-LIO FAST-LIO2
点云预处理 基础 改进(速度补偿更精确)
特征提取 必须 可选
地图数据结构 标准KD-Tree ikd-Tree
匹配方式 特征匹配 点-面匹配
滤波器 IEKF IKFoM
外参估计 需要预标定 自动在线估计
LiDAR支持 Livox系列 多种(Velodyne,Ouster等)
运行频率 10-20Hz 100Hz+

四、支持的LiDAR类型

FAST-LIO 支持

复制代码
✓ Livox Avia
✓ Livox Mid-70
✓ Livox Mid-360 (新增)
✓ Livox Horizon

✗ Velodyne (不支持)
✗ Ouster (不支持)
✗ 其他商用LiDAR

局限:
- 只针对Livox的特殊格式设计
- 强依赖于Livox的返回信号特性
- 对其他LiDAR的泛化性差

FAST-LIO2 支持

复制代码
✓ Livox Avia
✓ Livox Mid-70
✓ Livox Mid-360
✓ Livox Horizon

✓ Velodyne VLP-16
✓ Velodyne VLP-32
✓ Ouster OS1-64
✓ 其他主流商用LiDAR

优势:
- 无需显式特征提取
- 支持 spinning & solid-state LiDAR
- 易于扩展新的LiDAR类型
- 对原始点云直接处理

适配原理:

复制代码
FAST-LIO:
  特定LiDAR → 特征提取 → 特征匹配
  (高度耦合)

FAST-LIO2:
  任意LiDAR → 原始点云 → 直接扫描配准
  (通用解耦)

五、性能对比

5.1 速度 (Processing Speed)

指标 FAST-LIO FAST-LIO2
LiDAR处理速率 10 Hz 100+ Hz
单帧处理时间 50-100 ms 5-10 ms
特征点数 200-500 - (无需特征)
全点云处理
并行KD树搜索 有(更优化)

速度提升原因:

复制代码
1. 无特征提取 → 少~70%的预处理时间
2. ikd-Tree优化 → 搜索效率提升~3倍
3. 点-面残差 → 计算量少~50%
4. 自适应迭代 → 平均迭代次数减少

性能测试数据 (官方论文):

复制代码
FAST-LIO:
  - Livox Avia: 10 Hz @ 8-10 ms/frame
  - CPU: i9-10900K @ 3.7GHz

FAST-LIO2:
  - Velodyne VLP-32: 100 Hz @ 5-8 ms/frame
  - Livox Avia: 100+ Hz @ 3-5 ms/frame
  - CPU: i9-10900K @ 3.7GHz (更低占用率)

5.2 精度 (Localization Accuracy)

测试环境 FAST-LIO误差 FAST-LIO2误差 提升
室内走廊 0.5% 0.3% +40%
大型工业厂房 1.2% 0.6% +50%
复杂动态环境 2.5% 1.2% +52%
高速运动 5-10% 2-3% 显著

精度提升的原因:

复制代码
1. 流形约束 (IKFoM) → 更准确的旋转估计
2. 完整点云 → 冗余信息更多
3. 点-面残差 → 对旋转更敏感
4. 自动外参 → 无标定误差
5. 改进的IMU预积分 → 更准确的姿态预测

5.3 内存占用

指标 FAST-LIO FAST-LIO2
程序基础内存 300 MB 400 MB
映射点数(1小时) 500K 点 2M+ 点
内存增长 线性/无限 可控(box delete)
大规模环境 不稳定 稳定

六、核心代码对比

6.1 点云处理入口

FAST-LIO
cpp 复制代码
// preprocess.h
void Preprocess::process(
    const sensor_msgs::msg::PointCloud2::SharedPtr &msg,
    const sensor_msgs::msg::Imu::SharedPtr &imu_msg) {

    // 1. 点云转换
    pcl::fromROSMsg(*msg, pl);  // 原始点云

    // 2. 特征提取 (强制)
    CalculateFeature(pl);  // 计算曲率

    // 3. 特征分类
    for (auto& p : pl) {
        if (p.curvature > FEATURE_THRESHOLD) {
            p.label = EDGE;      // 边缘
        } else {
            p.label = PLANAR;    // 平面
        }
    }

    // 4. 畸变校正
    DistortionAdjust(imu_msg);

    // 输出: 标注好的点云
}
FAST-LIO2
cpp 复制代码
// preprocess.cpp (改进版)
void Preprocess::process(
    const sensor_msgs::msg::PointCloud2::SharedPtr &msg,
    const sensor_msgs::msg::Imu::SharedPtr &imu_msg) {

    // 1. 点云转换
    pcl::fromROSMsg(*msg, pl);  // 原始点云

    // 2. [条件] 特征提取 (可选)
    if (lidar_type != LIVOX) {
        CalculateFeature(pl);  // 仅对某些类型提取
    }
    // 对Livox可以跳过此步骤

    // 3. 改进的畸变校正
    // 使用IMU预积分计算更准确的速度
    DistortionAdjust(imu_msg);  // 更精确

    // 4. 可选的降采样
    Downsample(pl, ds_ratio);

    // 输出: 可以是原始点或特征点 (灵活选择)
}

6.2 配准与匹配

FAST-LIO 特征匹配
cpp 复制代码
// 在主循环中
void Mapping::feature_match() {
    // 1. 特征分离
    vector<PointType> edge_points, planar_points;
    for (auto& p : current_frame) {
        if (p.label == EDGE) {
            edge_points.push_back(p);
        } else {
            planar_points.push_back(p);
        }
    }

    // 2. 边缘特征匹配
    for (auto& p : edge_points) {
        vector<int> idx(5);
        vector<float> dis(5);

        // KD-Tree搜索5个最近邻
        kdtree.nearestKSearch(p, 5, idx, dis);

        // 构造匹配约束
        construct_edge_constraint(idx, dis);
    }

    // 3. 平面特征匹配
    for (auto& p : planar_points) {
        vector<int> idx(5);

        // KD-Tree搜索
        kdtree.nearestKSearch(p, 5, idx, dis);

        // 平面拟合
        fit_plane_with_svd(idx);

        // 点到平面距离约束
        construct_planar_constraint(idx);
    }
}
FAST-LIO2 直接配准
cpp 复制代码
// 直接配准 (无需特征)
void Mapping::direct_registration() {
    for (auto& p : current_frame) {
        // 1. 在ikd-Tree中搜索邻近点
        vector<PointType> neighbors;
        kdtree.Radius_Nearest_Search(
            p,
            search_radius,  // 固定范围
            neighbors
        );

        if (neighbors.size() < 5) continue;

        // 2. SVD拟合局部平面
        Eigen::MatrixXd A(neighbors.size(), 3);
        for (int i = 0; i < neighbors.size(); i++) {
            A.row(i) << neighbors[i].x - p.x,
                       neighbors[i].y - p.y,
                       neighbors[i].z - p.z;
        }
        Eigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeFullU | Eigen::ComputeFullV);

        // 3. 法向量是SVD的最小奇异向量
        Eigen::Vector3d normal = svd.matrixV().col(2);

        // 4. 点到平面距离残差
        float residual = (p.getVector3fMap() - neighbors[0].getVector3fMap()).dot(normal);

        // 5. 用于IKFoM更新
        add_residual_to_filter(residual, normal);
    }
}

6.3 地图管理

FAST-LIO 地图结构
cpp 复制代码
// 全局地图存储
vector<PointType> global_map;
pcl::KdTreeFLANN<PointType> kdtree;

void Mapping::update_global_map() {
    // 简单地追加新点
    global_map.insert(
        global_map.end(),
        current_points.begin(),
        current_points.end()
    );

    // 问题:地图无限增长
    // 搜索效率随着地图增大而下降
    // 内存占用线性增加

    // 定期重建KD-Tree
    if (global_map.size() > 100000) {
        kdtree.setInputCloud(
            make_shared<PointCloud>(global_map)
        );
    }
}
FAST-LIO2 增量地图结构
cpp 复制代码
// 使用ikd-Tree进行增量管理
ikdtree::KD_TREE<PointType> kdtree;

void Mapping::update_map_incremental() {
    // 1. 增量添加新点
    kdtree.Add_Points(current_points);

    // 2. 增量删除远距离点
    // (保持内存可控)
    if (kdtree.size() > MAX_MAP_SIZE) {
        vector<PointType> points_to_delete;

        // 删除距离当前位置超过DELETE_RANGE的点
        for (auto& p : kdtree) {
            if (distance(p, current_pos) > DELETE_RANGE) {
                points_to_delete.push_back(p);
            }
        }

        kdtree.Delete_Points(points_to_delete);
    }

    // 3. 动态重新平衡树
    kdtree.Rebalance();

    // 优势:
    // - O(logN)的搜索复杂度始终保持
    // - 内存占用可控
    // - 支持100Hz+频率
}

七、使用场景对比

FAST-LIO 适用场景

最佳场景:

  1. Livox激光雷达应用

    • Livox Avia/Mid-70
    • Livox Mid-360(新增支持)
    • 硬件完全匹配
  2. 室内机器人导航

    • 小型室内环保
    • 丰富的特征纹理
    • 速度要求不高(10Hz足够)
  3. 精度优先的应用

    • 特征提取能提高特定环境的精度
    • 点云密度不是瓶颈
  4. 轻量级嵌入式系统

    • 计算资源有限
    • 小规模地图
    • ARM开发板

不适用场景:

  • 其他品牌LiDAR (Velodyne, Ouster等)
  • 大规模环境建图
  • 高速运动机器人
  • 100Hz+的实时需求

FAST-LIO2 适用场景

最佳场景:

  1. 多传感器兼容

    • Velodyne、Ouster等多种LiDAR
    • 通用性强
    • 易于集成
  2. 大规模环境

    • 工业园区扫描
    • 城市级别SLAM
    • 内存占用可控
  3. 高性能要求

    • 实时性要求高(100Hz)
    • 低延迟应用
    • 流畅导航
  4. 复杂动态场景

    • 高速运动
    • 特征匮乏环境
    • 变工况条件
  5. 自动外参标定

    • 无需提前标定LiDAR-IMU外参
    • 自动在线估计
    • 简化系统部署

推荐场景:

复制代码
无人驾驶车辆
└─ FAST-LIO2最优选择
   └─ 支持高速(100Hz)
   └─ 支持多种LiDAR
   └─ 自动外参估计
   └─ 大规模地图管理

自动化仓库机器人
├─ FAST-LIO可行
└─ FAST-LIO2更优
   └─ 内存占用少
   └─ 长时间运行稳定

无人机自主导航
└─ FAST-LIO2推荐
   └─ 计算效率高
   └─ 多传感器支持

八、关键创新点分析

FAST-LIO 的创新

复制代码
1. 特征提取方法
   - 基于曲率的快速特征提取
   - 计算简单有效
   - 论文发表在IROS 2020

2. IEKF框架
   - 紧耦合LiDAR-IMU融合
   - 迭代优化匹配
   - 对Livox传感器最优化

3. Livox适配
   - 充分利用Livox特性
   - 非重复扫描pattern
   - 高计算效率

FAST-LIO2 的核心创新

复制代码
1. ikd-Tree数据结构 
   动态KD树,支持:
   - 增量添加/删除
   - 自动重新平衡
   - 范围删除
   - O(logN)稳定性能

   论文:https://arxiv.org/abs/2102.10808

2. 直接配准方法 
   无需特征提取:
   - 点到面残差
   - 对旋转更敏感
   - 通用LiDAR适配
   - 精度更高

3. IKFoM框架 
   流形约束优化:
   - SO(3)正交约束
   - 更好的数值稳定性
   - 自动外参估计
   - 精度提升50%+

4. 增量地图管理 
   可扩展的地图表示:
   - Box Delete: 删除远距离点
   - 内存占用可控
   - 支持超大规模环境
   - 实现运行时自适应

九、算法复杂度分析

时间复杂度

复制代码
FAST-LIO:
├─ 特征提取: O(N) - N为点数
├─ KD树搜索: O(M*logK) - M为特征数,K为地图点数
├─ 特征匹配: O(M*5) - 每点搜5个邻居
├─ IEKF迭代: O(N_state^3) - N_state通常=9
└─ 总: O(K + M*log(K) + N_state^3)
     K很大时: O(K)

FAST-LIO2:
├─ ikd树搜索: O(N*log(K)) - N为所有点数
├─ 平面拟合: O(N*5^2) - SVD分解
├─ IKFoM迭代: O(N_state^3)
├─ 树维护: O(K*log(K)) - 摊销复杂度
└─ 总: O(N*log(K) + N_state^3)
     N通常是M的10倍,但log(K)更小
     实际速度更快: 支持100Hz vs 10Hz

空间复杂度

复制代码
FAST-LIO:
├─ 特征点存储: O(M) - 特征点数
├─ KD树: O(K) - 全局地图点数
├─ 地图增长: O(K) - 无限增长
└─ 总: O(K) - 随时间无限增长

FAST-LIO2:
├─ 全点云存储: O(N) - 当前帧
├─ ikd树: O(K) - 地图点数
├─ 地图控制: O(K) ≈ const - Box Delete限制范围
└─ 总: O(K) - 可控的有界增长

十、迁移指南

从FAST-LIO迁移到FAST-LIO2

步骤1:环境准备

bash 复制代码
# 1. 安装ikd-Tree (FAST-LIO2依赖)
cd ~/ros2_ws/src
git clone https://github.com/hku-mars/ikd-Tree.git

# 2. 编译
cd ~/ros2_ws
colcon build --packages-select ikd-Tree

步骤2:代码迁移

cpp 复制代码
// 旧配置 (FAST-LIO)
{
    "lidar_type": "Livox",
    "feature_extract_enable": true,
}

// 新配置 (FAST-LIO2)
{
    "lidar_type": 0,  // 0=Livox, 1=Velodyne等
    "feature_extract_enable": false,  // 禁用特征
    "use_ikd_tree": true,             // 使用ikd-Tree
    "search_radius": 1.0,              // 搜索半径
    "delete_range": 300.0,             // 删除范围
}

步骤3:话题验证

bash 复制代码
# FAST-LIO2发布相同的话题
ros2 topic list | grep -E "Odometry|map|path"
# 输出相同的话题格式,无缝替换

性能对比验证

bash 复制代码
# 对比处理时间
# FAST-LIO:  50-100ms/frame (10Hz)
# FAST-LIO2: 5-10ms/frame   (100Hz)

ros2 topic hz /Odometry  # 应该看到100Hz vs 10Hz的区别

十一、常见问题解答

Q1: 应该选FAST-LIO还是FAST-LIO2?

决策树:

复制代码
使用何种LiDAR?
├─ Livox系列
│  ├─ 对精度要求高? → FAST-LIO (特征提取优化)
│  └─ 对速度要求高? → FAST-LIO2 (100Hz)
├─ Velodyne/Ouster
│  └─ 必须FAST-LIO2 (FAST-LIO不支持)
└─ 其他
   └─ 优先FAST-LIO2 (通用性强)

需要大规模地图?
├─ 是 → FAST-LIO2 (内存可控)
└─ 否 → 两者都可

运行硬件?
├─ 高性能PC → FAST-LIO2 (充分利用)
├─ 低功耗嵌入式 → FAST-LIO (更轻量)
└─ 中等配置 → FAST-LIO2 (100Hz优势大)

Q2: FAST-LIO为什么需要特征提取?

复制代码
关键原因:
1. 曲率是简单有效的特征描述符
2. 特征点数量少 → 计算快
3. 特征点高度代表性 → 匹配更准确

FAST-LIO的设计思路:
   精选特征点(200-500个) → 快速匹配
   vs
FAST-LIO2的设计思路:
   使用全部点(>50000个) → 直接配准(仍然很快)

结论:时代发展导致两种思路的转变

Q3: ikd-Tree相比KD-Tree的优势?

复制代码
KD-Tree (FAST-LIO):
├─ 构建时间: O(N*logN)
├─ 查询时间: O(logN) - 平均
├─ 删除: O(N*logN) - 需要重构
├─ 增加: O(N*logN) - 需要重构
└─ 适用: 静态数据

ikd-Tree (FAST-LIO2):
├─ 构建时间: O(N*logN)
├─ 查询时间: O(logN) - 始终保证
├─ 删除: O(logN) - 增量删除
├─ 增加: O(logN) - 增量添加
├─ 重新平衡: O(K*logK) - 周期性
└─ 适用: 动态数据,实时系统

Q4: 为什么FAST-LIO2精度更高?

复制代码
原因分析:

1. 点到面残差 vs 特征匹配
   - 点到面残差对旋转更敏感
   - 可以检测到更小的旋转误差
   - 全点云冗余信息多

2. IKFoM vs IEKF
   - 流形约束保证旋转矩阵正交性
   - 避免奇异点(gimbal lock)
   - 更好的数值稳定性

3. 自动外参估计
   - 无需手动标定LiDAR-IMU外参
   - 避免标定误差
   - 自适应不同硬件配置

4. 改进的IMU预积分
   - 更精确的速度预测
   - 考虑重力方向
   - 零速度检测(ZUPT)

综合效果: 精度提升40-50%

十二、总结对比表

维度 FAST-LIO FAST-LIO2 胜者
运行速度 10Hz 100Hz+ FAST-LIO2
定位精度 1% 0.5% FAST-LIO2
LiDAR兼容 Livox 多种 FAST-LIO2
大规模地图 问题 稳定 FAST-LIO2
特征依赖 FAST-LIO2
代码复杂度 简单 复杂 FAST-LIO
学习难度 简单 中等 FAST-LIO
论文引用 更高 FAST-LIO2
活跃度 降低 持续更新 FAST-LIO2
生产应用 较少 广泛 FAST-LIO2

综合评分:

复制代码
FAST-LIO:  7/10 (历史意义大,但已被超越)
FAST-LIO2: 9/10 (推荐新项目使用)

参考资源

官方论文

  1. FAST-LIO (IROS 2020)

  2. FAST-LIO2 (TRO 2022)

  3. ikd-Tree (IJRR 2021)

GitHub仓库

复制代码
FAST-LIO:  https://github.com/hku-mars/FAST_LIO
FAST-LIO2: https://github.com/hku-mars/FAST_LIO2
ikd-Tree:  https://github.com/hku-mars/ikd-Tree
IKFoM:     https://github.com/hku-mars/IKFoM

相关项目

复制代码
R2LIVE (视觉融合)
├─ 基于FAST-LIO/FAST-LIO2
└─ 增加相机视觉信息

FAST-LIVO (视觉直接法)
├─ 更新版本
└─ 结合最新改进

FAST-LIO-Localization (回环检测)
├─ 添加重定位模块
└─ 大规模SLAM

致谢与声明

本文基于以下资源编写:

  • 官方FAST-LIO/FAST-LIO2 GitHub仓库
  • 相关学术论文
  • 社区讨论和经验分享

作者: soar
日期: 2025-12-08
版本: v1.0

免责声明: 本文旨在学术交流和技术分享,所有信息来自公开资源。


致读者:如果觉得本文有帮助,欢迎在CSDN分享和评论! 🚀

相关推荐
天途小编9 小时前
无人机操控模式对飞行安全的核心影响:避坑指南✅
安全·无人机
EasyDSS9 小时前
视频推流平台EasyDSS无人机推流直播筑牢警务安防技术防线
音视频·无人机
长沙京卓10 小时前
【无人机】可源码交付:县域低空无人机巡检平台,一键起飞、航线规划、事件上报、警用反无
无人机·源代码管理
wfeqhfxz258878211 小时前
YOLOv10n-GoldYolo:多旋翼无人机目标检测与识别实战指南_1
yolo·目标检测·无人机
天途小编11 小时前
无人机行业CAAC执照合规管理与报考指南
无人机
天途小编11 小时前
无人机操控模式解析:美国手、日本手、中国手
游戏引擎·无人机·cocos2d
无人装备硬件开发爱好者2 天前
初级菜鸟快速学习无人机电调教程:第5节
无人机·电调学习
小O的算法实验室2 天前
2022年TRC SCI1区TOP,基于随机分形搜索算法的多无人机四维航迹优化自适应冲突消解方法,深度解析+性能实测
无人机·论文复现·智能算法·智能算法改进
天途小编2 天前
无人机融合空域飞行限制全解析
无人机