跳转至

附录


附录A:项目优先级表

优先级 项目 核心C++学习价值 建议投入
★★★★★ slambook2 Eigen/Sophus/g2o/Ceres基础使用 2周(配合书)
★★★★★ FAST-LIO2 ESKF+ikd-Tree+IKFoM模板元编程 2周
★★★★★ LIO-SAM GTSAM因子图+PCL完整使用+多传感器同步 2周
★★★★★ ORB-SLAM3 三线程架构+g2o BA+OpenCV ORB定制化 3周
★★★★★ KISS-ICP 极简C++17+TBB+standalone/ROS分离设计 1周
★★★★★ small_gicp Traits+Policy-based Design+header-only库设计 1周
★★★★☆ VINS-Mono Ceres自定义因子+OpenCV光流前端+滑窗优化 2周
★★★★☆ slam_in_autonomous_driving C++17自实现全栈(KD-Tree/iVox/NDT/ICP/ESKF) 2周
★★★★☆ Faster-LIO iVox模板特化+TBB并行哈希 1周
★★★★☆ FAST-LIVO2 ESKF三传感器紧耦合+PCL-OpenCV交互 1.5周
★★★★☆ Lightning-LM 模块化双模式架构+地图分区动态加载 1周
★★★★☆ OpenVINS ov_type类型系统设计+MSCKF+ROS1/2双支持 1周
★★★☆☆ stella_vslam 模块化重构范本(对比ORB-SLAM3理解工程化) 1周
★★★☆☆ hdl_graph_slam g2o多约束图优化+PCL配准工厂+Nodelet架构 1周
★★★☆☆ GLIM GTSAM+CUDA GPU加速+dlopen插件架构 0.5周
★★★☆☆ R3LIVE LIO+VIO松耦合双子系统+自定义LK光流 0.5周

附录B:C++知识点到SLAM项目映射表

C++知识点 对应SLAM项目/文件 学习优先级
shared_ptr循环引用+weak_ptr ORB-SLAM3 MapPoint↔KeyFrame ★★★★★
std::move大数据传递 KISS-ICP VoxelHashMap::AddPoints ★★★★★
std::deque+std::mutex+lock_guard LIO-SAM imageProjection.cpp全部回调 ★★★★★
Lambda+TBB并行 KISS-ICP/small_gicp/Faster-LIO/Patchwork++ ★★★★★
Eigen::Map零拷贝 Ceres CostFunction参数映射 / FAST-LIO2状态数组 ★★★★★
CRTP静态多态 Sophus SO3Base/manif LieGroupBase/nanoflann KDTreeAdaptor ★★★★☆
Traits Pattern small_gicp traits::point / GTSAM traits\<Pose3> / PCL PointCloud\<T> ★★★★☆
Policy-based Design small_gicp Registration\<Factor,Reduction,Rejector> ★★★★☆
if constexpr编译期分支 Faster-LIO iVox线性/PHC选择 ★★★★☆
Eigen::Block切片 FAST-LIO2/FAST-LIVO2 ESKF状态向量分量访问 ★★★★☆
std::atomic FAST-LIO2 flg_exit退出标志 / SLAM系统全局开关 ★★★☆☆
std::condition_variable ORB-SLAM3 LoopClosing等待新关键帧 ★★★☆☆
工厂模式 hdl_graph_slam registrations.cpp 7种配准运行时切换 ★★★☆☆
插件架构dlopen GLIM GPU模块动态加载 / Nav2 pluginlib ★★★☆☆
CMake FetchContent KISS-Matcher依赖管理 ★★★☆☆
CMake CXX+CUDA双语言 Photo-SLAM C++/CUDA/LibTorch混合编译 ★★★☆☆
pybind11 C++/Python绑定 KISS-ICP/small_gicp/Patchwork++ Python API ★★★☆☆
GoogleTest单元测试 Ceres/OpenCV/GTSAM内部测试套件 ★★★★☆
spdlog异步日志 stella_vslam/Lightning-LM ★★★☆☆
Thrust GPU排序/归约 fast_gicp VGICP-CUDA / GLIM gtsam_points ★★☆☆☆
std::pmr多态分配器 (教学案例——SLAM项目中尚无广泛应用) ★★☆☆☆

附录C:时间里程碑建议

阶段 周数 达成标志
C++现代基础 1-5周 能流畅阅读KISS-ICP/FAST-LIO2源码中的现代C++语法,理解auto/move/lambda
模板编程 6-9周 能理解Eigen表达式模板原理、Sophus CRTP设计、small_gicp Traits
并发并行 10-13周 能理解ORB-SLAM3三线程架构,能用OpenMP/TBB并行化10万级点云处理
SLAM核心库 14-21周 能用GTSAM构建因子图(参考LIO-SAM)、用Ceres写CostFunction(参考VINS)、用g2o做BA(参考ORB-SLAM3)
架构+ROS2 22-24周 能设计模块化多传感器SLAM架构、实现ROS2 Lifecycle Node
工程化 25-27周 能独立构建CMake项目、编写GoogleTest测试套件、使用Sanitizers检测问题
内存优化 28-29周 理解AoS/SoA/False Sharing对性能的影响,能使用pmr内存池
CUDA加速 30-31周 能用Thrust进行GPU点云处理、使用fast_gicp GPU版替代CPU版
项目精读 32-38周 能深入阅读12+个SLAM项目源码并理解其设计决策
综合实战 39-41周 独立完成Mini-LIO从零实现并在KITTI/MulRan数据集上评估

附录D:技术栈全览

                  ┌─────────────────────────────────────────┐
                  │            SLAM应用层                     │
                  │  LIO-SAM / FAST-LIO2 / ORB-SLAM3        │
                  │  KISS-ICP / VINS-Mono / FAST-LIVO2      │
                  │  Lightning-LM / GLIM / R3LIVE           │
                  └───────────┬─────────────────────────────┘
                              │ 使用
          ┌───────────────────┼───────────────────────┐
          │                   │                       │
    ┌─────▼─────┐     ┌──────▼──────┐     ┌─────────▼─────────┐
    │  优化库    │     │  点云/视觉   │     │   工程基础设施     │
    │ GTSAM     │     │  PCL        │     │  CMake            │
    │ Ceres     │     │  OpenCV     │     │  spdlog/yaml-cpp  │
    │ g2o       │     │  small_gicp │     │  GoogleTest       │
    │ manif     │     │  nanoflann  │     │  pybind11         │
    └─────┬─────┘     └──────┬──────┘     │  ROS2             │
          │                  │            └───────────────────┘
          │                  │
    ┌─────▼──────────────────▼──────┐
    │        Eigen(数学基础)        │
    │  Matrix/Vector/Quaternion     │
    │  Map/Block/Expression Template│
    └───────────────┬───────────────┘
    ┌───────────────▼───────────────┐
    │    C++17 标准库 + TBB/OpenMP   │
    │  STL / thread / atomic / pmr  │
    └───────────────┬───────────────┘
                    │ 可选
    ┌───────────────▼───────────────┐
    │   CUDA / Thrust(GPU加速)     │
    │  fast_gicp GPU / GLIM GPU    │
    │  LibTorch / Photo-SLAM       │
    └───────────────────────────────┘

附录E:PCL在SLAM中的TOP 10 API速查

排名 API 功能 典型SLAM使用场景
1 pcl::PointCloud<T>::Ptr 智能指针点云容器 所有SLAM项目的基本数据结构
2 pcl::VoxelGrid<T>::filter() 体素栅格降采样 LIO-SAM 6处、FAST-LIO2、hdl_graph_slam
3 pcl::fromROSMsg()/toROSMsg() ROS消息互转 所有ROS SLAM项目的数据输入输出
4 pcl::transformPointCloud() 刚体变换点云 LIO-SAM关键帧到世界坐标变换
5 pcl::KdTreeFLANN<T>::radiusSearch() 半径近邻搜索 LIO-SAM回环检测+局部地图提取
6 pcl::getTransformation(x,y,z,r,p,y) 欧拉角构造Affine3f LIO-SAM位姿表示(10+处调用)
7 pcl::IterativeClosestPoint<T>::align() ICP配准 LIO-SAM回环验证、hdl_graph_slam里程计
8 pcl::io::savePCDFileBinary() 地图保存 LIO-SAM/FAST-LIO2/FAST-LIVO2
9 POINT_CLOUD_REGISTER_POINT_STRUCT 自定义点类型注册 LIO-SAM(3种)、hdl_graph_slam
10 pcl::SACSegmentation RANSAC平面分割 hdl_graph_slam地面检测

趋势:新一代系统正用ikd-Tree替代KdTreeFLANN、用Eigen手写替代transformPointCloud、用自研算法替代ICP/RANSAC——PCL逐渐退化为纯数据容器。


附录F:OpenCV在视觉SLAM中的TOP 10 API速查

排名 API 功能 典型SLAM使用场景
1 cv::Mat 图像存储容器 所有视觉SLAM的基础数据结构
2 cv::FAST() FAST角点检测 ORB-SLAM3双阈值(20/7)、stella_vslam
3 cv::calcOpticalFlowPyrLK() 稀疏光流跟踪 VINS-Mono(21×21窗口,3层)、OpenVINS
4 cv::goodFeaturesToTrack() Shi-Tomasi角点补充 VINS-Mono(MAX_CNT=150,quality=0.01)
5 cv::findFundamentalMat() FM RANSAC外点剔除 VINS-Mono/OpenVINS/stella_vslam
6 cv::undistortPoints() 畸变校正 ORB-SLAM3/stella_vslam
7 cv::resize() 图像金字塔/降采样 ORB-SLAM3(8层,1.2x)/OpenVINS
8 cv::createCLAHE() 自适应直方图均衡 ORB-SLAM3(3.0,8×8)/VINS/OpenVINS(10.0)
9 cv::GaussianBlur() 描述子前平滑 ORB-SLAM3(7×7,σ=2)
10 cv::cvtColor() BGR→灰度转换 所有视觉SLAM的图像预处理

核心发现:所有主流视觉SLAM都不使用cv::solvePnP()做运行时位姿估计(自研EPnP/MLPnP或用优化器);cv::ORB::create()仅OpenVINS直接调用,ORB-SLAM3/stella_vslam均自定义实现。


附录G:v7新增章节与v6章节完整编号对照

v7 v6 说明
Ch1 Ch1 类型系统、值类别与类型推导
Ch2🆕 C++编译模型基础
Ch3🆕 现代类设计与特殊成员函数
Ch4 Ch2 RAII、智能指针与资源管理
Ch5 Ch3 移动语义、完美转发与noexcept
Ch6🆕 继承与多态深入
Ch7🆕 类型转换
Ch8🆕 错误处理与异常安全
Ch9🆕 运算符重载
Ch10 Ch4 Lambda表达式与STL算法深入
Ch11 Ch5 Eigen基础与SLAM数学预备
Ch12 Ch6 函数模板与类模板基础
Ch13 Ch7 模板特化、SFINAE与类型萃取
Ch14 Ch8 变参模板、折叠表达式与CRTP
Ch15🆕 预处理器与宏
Ch16 Ch9 C++20 Concepts与Policy-based Design
Ch17-20 Ch10-13 并发并行编程(4章)
通用库·文件IO🆕 文件I/O与字符串处理
通用库·Eigen~通用库·OpenCV Ch14-20 SLAM核心库深度剖析(7章)
Ch29-31 通用库·文件IO~通用库·李群manif 架构、设计模式与ROS2(3章)
Ch32-46 通用库·Ceres~Ch38 工程化、优化、CUDA、精读、实战(15章)

总计:46章48周。新增8章🆕补全知识断层,v6全部38章内容完整保留。



附录H:C++学习资源与库精读指南

本附录整合自对 GitHub 上 32 个高星 C++ 教学项目和 17 个工业级库的系统研究,按 SLAM 工程师的优先级排序。

体系化 C++ 教程项目(15个)

项目 Star数 核心覆盖 SLAM关联 推荐阶段
isocpp/CppCoreGuidelines ~44.9k RAII、类型安全、并发准则、生命周期管理 高——SLAM资源管理与多线程规范 中级/高级
Light-City/CPlusPlusThings ~42.7k C++基础到进阶全覆盖、STL源码分析、多线程 高——中文社区最全面的C++学习库 初级/中级
fffaraz/awesome-cpp ~69k C++生态百科全书式索引(并发/数学/序列化/测试) 高——SLAM选库的一站式参考 全阶段
huihut/interview ~37.6k C++语言特性、OS、网络、编译链接、设计模式 高——面试准备+系统知识补全 初级/中级
TheAlgorithms/C-Plus-Plus ~34k 数据结构与算法的C++17实现 中——图算法、近邻搜索等与SLAM后端相关 初级/中级
changkun/modern-cpp-tutorial ~25.3k C++11/14/17/20快速上手(中英文+PDF) 高——现代SLAM代码库的语言基础 中级
AnthonyCalandra/modern-cpp-features ~21.6k 按标准版本分类的特性速查表 中——语法参考工具 中级(参考)
federico-busato/Modern-CPP-Programming ~14.7k NVIDIA工程师1500+页课程,含调试/优化/并行计算 高——直接适用于SLAM性能工程 中级/高级
rigtorp/awesome-modern-cpp ~12.9k 现代C++库、工具、CppCon演讲索引 中——查找lock-free队列、CMake模板等 中级/高级
cpp-best-practices/cppbestpractices ~8.7k 项目结构、CI、静态分析、编码规范(Jason Turner) 高——SLAM工程化规范化 中级
CnTransGroup/EffectiveModernCppChinese ~8.7k 《Effective Modern C++》42条实践的中文翻译 高——智能指针管理地图点、移动语义优化数据传递 中级/高级
wuye9036/CppTemplateTutorial ~7.7k 将C++模板作为图灵完备语言讲授(中文) 中——理解Eigen/Sophus模板机制的理论基础 高级
practical-tutorials/project-based-learning ~262k 项目驱动式学习(C++部分含解释器/光追/OS) 中——工程能力训练 初级/中级
lefticus/cpp_weekly ~310 C++ Weekly视频配套代码(性能/constexpr/编译器) 中——性能优化微技巧 中级/高级
PacktPublishing系列 数百 Software Architecture with C++、Cpp High Performance 中——架构与性能专题 中级/高级

库项目精读范例(17个)

以下项目不是教程,而是**值得精读源码**来学习C++高级特性的工业级库。按SLAM工程师优先级排序:

P0——必学(SLAM日常使用): spdlog28.5k⭐)展示了异步编程的教科书式实现:线程池+MPMC环形缓冲区的生产者-消费者模式、CRTP实现的Sink基类、模板参数Mutex控制线程安全性(_mt/_st后缀)。精读文件:async.h(异步架构)、thread_pool-inl.h(线程池)。concurrentqueue11.2k⭐)是多生产者多消费者无锁队列,精确使用memory_order_relaxed/acquire/release,per-producer分片设计消除竞争——SLAM前端-后端数据传递的理想选择。readerwriterqueue4.5k⭐)是单生产者单消费者的wait-free队列,完美匹配传感器读取-处理架构(IMU数据管道)。google/benchmark10k⭐)和**googletest**(~35k⭐)是SLAM性能调优和质量保障的基础设施。

P1——重要(项目基础设施+并行能力): nlohmann/json49.4k⭐)是模板元编程的优秀范例:ADL序列化器、SFINAE类型检测、完整STL迭代器实现——精读type_traits.hpp可深入理解SFINAE。fmtlib/fmt23.3k⭐)展示constexpr编译期格式字符串解析和类型擦除设计。taskflow11.5k⭐)是DAG任务图并行系统,work-stealing调度器适合SLAM后端BA优化的并行加速。pybind1116k⭐)提供C++/Python混合开发能力,精读eigen.h了解Eigen-Python绑定在SLAM原型验证中的应用。

P2——进阶(工业级实践): abseil-cpp(~17.2k⭐)的Swiss Table哈希表利用SIMD加速、absl::Mutexstd::mutex更高效。facebook/folly29k⭐)的FBString三策略SSO优化、Futures异步编程框架是工业级性能工程的范例。microsoft/GSL6.6k⭐)的not_null<T>gsl::span提升代码安全性。preshing/junction1.4k⭐)的并发HashMap和QSBR内存回收虽然星数不高但学术价值极高。ericniebler/range-v34.2k⭐)的管道运算符适合点云处理流水线设计。

2024-2025 年新兴高星项目

2024-2025 年 C++/CUDA 项目最大的增长驱动力来自 AI 基础设施**和 **3D Gaussian Splatting 两个方向,后者已与 SLAM 深度融合。

  • xlite-dev/LeetCUDA(⭐ ~10k,2024 年 12 月爆发)是面向 PyTorch 开发者的现代 CUDA 学习笔记,提供 200+ 个 CUDA Kernel 实现。覆盖 Tensor Cores(WMMA/MMA PTX/CuTe)、Flash Attention、HGEMM 优化(达 cuBLAS 98%-100%)、Global→Shared→Register 内存搬运策略。HGEMM 优化技术可直接加速 SLAM 后端 BA 中的 Hessian 矩阵计算,Flash Attention 与 LoFTR 等 Transformer 特征匹配器密切相关。

  • srush/GPU-Puzzles(⭐ ~11.8k,2024 年翻倍增长)通过交互式编程谜题学习 GPU 并行,覆盖 threadIdx/blockIdx、共享内存、归约算法、Coalesced access 等核心概念。虽用 Python/NUMBA 接口,但底层概念与 CUDA C++ 完全一致,适合 SLAM 工程师快速建立 GPU 并行计算的心智模型。

  • NVIDIA/cccl(⭐ ~2.1k,2024 年持续发展)将 Thrust + CUB + libcudacxx 统一为 CUDA C++ 标准基础设施。Thrust 的 sort/reduce/scan 是点云体素化和 kd-tree 构建的核心工具;CUB 的 block-level 算法可实现高效最近邻搜索;libcudacxx 的 cuda::std::mdspan 为多维传感器数据(图像、深度图、点云)的 GPU 端访问提供了标准化接口。

  • graphdeco-inria/gaussian-splatting(⭐ ~15k+,2024 年爆发式增长)是 3D Gaussian Splatting 的官方实现,其 **CUDA C++ 可微分光栅化器**已成为所有 3DGS-SLAM 变体的基础。2024 年新增 1.6-2.7x 训练加速、深度正则化和抗锯齿功能。3DGS 已成为 2024-2025 年视觉 SLAM 领域最主流的场景表示方法之一。

  • muskie82/MonoGS(⭐ ~2k,CVPR'24 Highlight + Best Demo Award)是首个完全基于 3DGS 的单目 SLAM 系统,核心差分光栅化用 CUDA C++ 实现,支持单目/立体/RGB-D 输入,RTX4090 上可达 10fps。

  • spla-tam/SplaTAM(⭐ ~2k,CVPR'24)是首个利用 3D Gaussian 作为显式体积表示的稠密 RGB-D SLAM 系统,在位姿估计精度上达到现有方法 2 倍提升,并催生了 SGS-SLAM、GS3LAM、Splat-SLAM 等后续工作。

完整项目数据汇总表(31个项目)

序号 项目 Star 数 类别 核心 C++ 知识点 SLAM 关联度
1 isocpp/CppCoreGuidelines 44.9k 编码准则 RAII、内存安全、并发规范、接口设计 ★★★★★
2 Light-City/CPlusPlusThings 42.8k 全栈教学 OOP、现代特性、STL、多线程、设计模式 ★★★★★
3 changkun/modern-cpp-tutorial 25.4k 现代特性 C++11-20 全特性、constexpr、Concepts ★★★★☆
4 AnthonyCalandra/modern-cpp-features 21.6k 特性速查 C++11-23 逐特性示例、if constexprstd::span ★★★☆☆
5 CnTransGroup/EffectiveModernCppChinese 8.7k 最佳实践 智能指针、移动语义、完美转发、并发 API ★★★★★
6 federico-busato/Modern-CPP-Programming 14.7k 完整课程 1500+ 页,含性能优化、CRTP、Valgrind ★★★★★
7 wuye9036/CppTemplateTutorial 7.7k 模板进阶 特化、SFINAE、Type Traits、Concepts ★★★★☆
8 huihut/interview 37.5k 面试知识 语言+数据结构+OS+网络+链接装载 ★★★★☆
9 fffaraz/awesome-cpp 69k 生态索引 C++ 全领域库分类(含 SLAM 依赖库) ★★★★★
10 cpp-best-practices/cppbestpractices 8.7k 工程实践 CMake、clang-tidy、CI/CD、依赖管理 ★★★★☆
11 nlohmann/json 49.4k JSON 库 模板元编程、SFINAE、ADL、SAX 模式 ★★★★★
12 fmtlib/fmt 23.3k 格式化库 constexpr、类型擦除、consteval 检查 ★★★★☆
13 gabime/spdlog 28.5k 日志库 异步架构、CRTP、策略模式、编译期过滤 ★★★★★
14 cameron314/concurrentqueue 11.2k 无锁队列 MPMC lock-free、CAS、内存序、批量操作 ★★★★★
15 cameron314/readerwriterqueue 4.5k SPSC 队列 Wait-free、TSO 模型、O(1) 操作 ★★★★☆
16 taskflow/taskflow 11.7k DAG 并行 任务图、Work-stealing、CPU+GPU 异构 ★★★★☆
17 abseil/abseil-cpp 17.2k 基础库 Swiss Table、Mutex、时间库、哈希框架 ★★★★☆
18 microsoft/GSL 6.6k 准则支持库 gsl::spannot_null、Expects/Ensures ★★★★☆
19 pybind/pybind11 17.8k Python 绑定 编译时内省、Eigen↔NumPy、Buffer 协议 ★★★★★
20 ericniebler/range-v3 4.4k Ranges 库 惰性视图、管道组合、Concept 模拟 ★★★☆☆
21 preshing/junction 1.4k 并发 HashMap 四种无锁 HashMap、GC、表迁移 ★★★★☆
22 google/googletest 38.3k 单元测试 Fixture、参数化、Mock、死亡测试 ★★★★★
23 google/benchmark 10k 性能基准 防优化、硬件计数器、多线程基准 ★★★★★
24 ttroy50/cmake-examples 12.8k CMake 教程 完整构建系统教学、第三方库集成 ★★★★★
25 friendlyanon/cmake-init 2.5k CMake 模板 Sanitizers、CI/CD、现代 CMake 实践 ★★★★☆
26 xlite-dev/LeetCUDA ~10k CUDA 教学 200+ Kernel、Tensor Cores、Flash Attention ★★★★☆
27 srush/GPU-Puzzles ~11.8k GPU 入门 并行模式、共享内存、归约算法 ★★★☆☆
28 NVIDIA/cccl ~2.1k CUDA 标准库 Thrust+CUB+libcudacxx、mdspan ★★★★★
29 graphdeco-inria/gaussian-splatting ~15k 3DGS 核心 CUDA 可微光栅化、SH、自适应密度控制 ★★★★★
30 muskie82/MonoGS ~2k 3DGS SLAM 单目 3DGS SLAM、可微渲染、位姿梯度 ★★★★★
31 spla-tam/SplaTAM ~2k 稠密 SLAM 3DGS 稠密 SLAM、轮廓掩码、增量建图 ★★★★★

趋势总结

本次调研揭示了三个关键趋势。

第一,现代 C++ 知识体系已高度成熟。 从 CppCoreGuidelines 的官方规范到 federico-busato 的 1500 页课程,开发者可以构建从入门到精通的完整学习路径,且中文资源(CPlusPlusThings、EMC++ 中文版、模板教程)质量很高。

第二,可学习的库价值突出。 nlohmann/json(模板元编程)、fmt(constexpr 设计)、spdlog(CRTP + 异步架构)不仅是实用工具,更是现代 C++ 设计理念的活教材,其设计模式可以直接迁移到 SLAM 系统架构中。

第三,2024-2025 年 3D Gaussian Splatting 与 SLAM 的融合催生了以 CUDA C++ 为核心的新项目群。 MonoGS、SplaTAM、LeetCUDA、NVIDIA/cccl 等项目说明,SLAM 工程师的技能树正从纯 CPU 多线程向 CPU+GPU 异构并行扩展。

在工程基础设施层面,googletest + benchmark + CMake 三件套仍是 SLAM 项目工程化的标配,而 concurrentqueuereaderwriterqueue 等无锁数据结构也正在逐步替代传统 mutex 方案,成为实时 SLAM 系统的重要性能保障。


附录I:SLAM项目C++技术演进与代码模式

本附录基于对 22 个视觉 SLAM/VIO 项目和 30 个 LiDAR SLAM 项目的源码级研究,提供 系统精读·多传感器架构~系统精读·前沿 项目精读的宏观技术演进地图。

视觉SLAM/VIO项目的C++特性概览

对22个视觉SLAM/VIO项目的研究揭示了清晰的技术演进路线:

C++标准演进:PTAM(C++03) → ORB-SLAM2/DSO/VINS-Mono(C++11) → ORB-SLAM3/Kimera-VIO(C++14) → OKVIS2(C++17)。当前主流是**C++14**,新项目正在向C++17迁移。

数学库使用频率Eigen3**是100%使用率的基石;OpenCV约95%;g2o约60%(ORB-SLAM系列、LSD-SLAM);Ceres约40%(VINS系列、OKVIS);**GTSAM约20%但增长迅速(Kimera-VIO、DM-VIO、SVO Pro);Sophus约35%(ORB-SLAM3、LSD-SLAM);DBoW2约50%用于回环检测。

多线程架构演进**是教学重点:PTAM(2007)首创**双线程Tracking+Mapping;ORB-SLAM2(2017)确立**三线程Tracking+LocalMapping+LoopClosing**的事实标准;VINS-Mono(2018)转向**ROS多节点进程架构**;ORB-SLAM3(2021)扩展为**四线程+Atlas多地图管理**;Kimera-VIO(2020)引入**模块化Pipeline**可配置并行/串行模式。

LiDAR SLAM项目的C++特性概览

对30个LiDAR SLAM项目的研究显示了三大技术流派:

优化库三分天下:GTSAM因子图派(LIO-SAM、LeGO-LOAM、SC-LIO-SAM、GLIM)、Ceres非线性优化派(A-LOAM、F-LOAM、CT-ICP、LOAM-Livox)、自研ESKF卡尔曼滤波派(FAST-LIO系列、Point-LIO、R3LIVE、Faster-LIO、BALM)。HKU-MARS团队统一使用自研ESKF+ikd-Tree技术栈,完全避免第三方优化库依赖——这一设计哲学值得教学中讨论。

构建系统统计:约75%项目使用catkin(CMake/ROS1),约15%提供colcon(ROS2)支持,约10%为纯CMake(KISS-ICP、ikd-Tree、CT-ICP)。

从C++学习角度排名的LiDAR SLAM项目

排名 项目 Star数 核心C++学习价值
1 Cartographer ~7.8k Google工业级代码、Protobuf序列化、Lua配置、线程池、完善单测
2 KISS-ICP ~2.1k C++17范例:VoxelHashMap用unordered_map实现、TBB并行、pybind11双接口、header-only核心
3 FAST-LIO2 ~4.4k IKFOM模板元编程、ikd-Tree增量KD树、ESKF流形卡尔曼滤波
4 LIO-SAM ~4.5k 因子图SLAM标准实现、GTSAM使用范例、多传感器融合(IMU+LiDAR+GPS+回环)
5 small_gicp ~900 Traits Pattern + Policy-based Design + header-only 库设计
6 Faster-LIO ~1.2k iVox模板特化 + TBB并行哈希
7 slam_in_autonomous_driving ~2.3k C++17自实现全栈(KD-Tree/iVox/NDT/ICP/ESKF)
8 VINS-Mono ~5.2k Ceres自定义因子 + OpenCV光流前端 + 滑窗优化
9 ORB-SLAM3 ~7.5k 三线程架构 + g2o BA + OpenCV ORB定制化 + Atlas多地图管理
10 R3LIVE ~2.0k LIO+VIO双子系统并行架构、多传感器紧耦合工程化

SLAM项目中最常见的C++模式总结

设计模式使用频率排名:生产者-消费者模式(★★★★★,几乎所有系统的线程间数据传递)> 策略模式(★★★★★,传感器切换/计算后端切换)> 发布-订阅模式(★★★★,ROS系统)> 管道/流水线模式(★★★★,Kimera-VIO、maplab)> 单例模式(★★★★,System类入口)> 工厂模式(★★★)> CRTP编译时多态(★★★,ROVIO、Sophus)> 插件模式(★★,maplab的dlopen动态加载)。

SLAM特有的C++高级模式Eigen::Map零拷贝映射原始指针为矩阵(DSO、VINS-Mono)、编译时非类型模板参数确定状态维度(ROVIO的template<int kNumCameras>)、SSE/NEON SIMD手写优化光度误差和矩阵运算(DSO、ICE-BA)、自定义内存对齐__attribute__((aligned(16)))(DSO、Eigen相关)。


附录J:数学库选型对比参考

本附录提供大纲技术栈(Eigen+manif+GTSAM+Ceres)的选型依据和库间集成要点,是 通用库·李群manif~SLAM库·g2o 的补充参考。

Eigen+manif+GTSAM+Ceres技术栈评估

整体评价:这是一个前瞻性很强的选型组合,层次分明且各司其职。 Eigen做基础矩阵运算,manif做李群流形操作,GTSAM做因子图后端,Ceres处理独立优化子问题。相比更常见的Eigen+Sophus+g2o组合,这个栈更现代化。

组合优势:manif的群无关泛型接口(一套代码适配SO3/SE3/SE_2(3))、GTSAM的iSAM2增量优化是在线SLAM的利器、Ceres的自动微分省去手写Jacobian且支持Manifold接口、manif与Ceres天然兼容(支持Jet类型和LocalParameterization/Manifold辅助类)。

潜在风险与应对

第一,GTSAM自带SO3/SE3与manif存在表示冗余。GTSAM内部使用gtsam::Pose3,manif使用manif::SE3d,需要明确类型转换层manif::SE3d ↔ gtsam::Pose3的接口,建议在大纲"架构设计"模块中专门讲解适配器模式在数学库集成中的应用。

第二,Jacobian约定差异。GTSAM默认使用**左不变误差**(left-invariant error),而manif的Jacobian基于**右扰动**(right perturbation)。这不仅是实现细节,更是数学上的根本差异,需要在"SLAM数学库"模块中专门讲解左扰动vs右扰动的转换关系。

第三,**Eigen版本一致性**是最大的工程陷阱。GTSAM 4.2+绑定Eigen 3.4.0,而PCL、Ceres、g2o各有自己的Eigen版本要求。版本不匹配会导致ABI不兼容和运行时segfault。建议在CMake模块中专门讲解Eigen版本管理策略。

第四,大量模板库叠加会显著增加编译时间。建议教学中引入预编译头(PCH)和模块化编译策略。

manif vs Sophus详细对比

| 维度 | manif (~1.7k⭐)

| Sophus (~2k⭐) | |------|-----------------|----------------| | 设计理念 | 群无关统一接口(泛型编程) | 每个群独立实现 | | 支持群 | SO2/3, SE2/3, SE_2(3), SGal(3), ℝ(n) | SO2/3, SE2/3, Sim3 | | C++标准 | C++11(门槛更低) | C++17 | | Ceres集成 | 提供辅助类,文档详细 | 原生Jet类型支持 | | 泛型代码 | ✅ 一套代码适配所有群 | ❌ 需针对每个群分别编写 | | 维护状态 | 活跃 | 维护模式(2024.6起停止新功能) | | 配套论文 | 优秀(17页Micro Lie Theory) | 无 | | Sim3支持 | ❌ | ✅(单目SLAM尺度漂移处理需要) |

结论:新项目推荐manif。Sophus已进入维护模式,sophus2重写中但尚不成熟。唯一需要Sophus的场景是需要**Sim3**(单目SLAM尺度漂移处理)。建议大纲中以manif为主教学,Sophus作为补充讲解CRTP设计模式和Sim3。

GTSAM vs g2o对比

GTSAM的决定性优势是iSAM2增量求解器——基于Bayes Tree的增量更新避免每帧重优化全图,是在线SLAM的标配。g2o在pose graph上比GTSAM慢约13-15%(Euroc数据集)。但g2o在ORB-SLAM系列中集成度极高,维护ORB-SLAM代码必须学g2o。GTSAM 4的traits系统和Expressions自动微分比g2o手写Jacobian的API更现代。建议:主学GTSAM,辅学g2o的顶点/边继承体系以读懂ORB-SLAM源码。

何时用Ceres vs GTSAM

GTSAM适合**在线SLAM后端**(iSAM2增量更新)、Pose Graph优化传感器融合(已有现成IMU预积分因子)。

Ceres适合**Bundle Adjustment**(有gauge freedom,iSAM2不适用)、相机/IMU标定(AutoDiff+Manifold灵活)、移动端部署(支持Android/iOS)、以及各种非标准优化子问题。

推荐学习顺序

Eigen(2-3周)→ 李群理论+manif(2周,先读配套论文)→ Ceres(2-3周,从AutoDiffCostFunction开始)→ GTSAM(3-4周,从官方examples循序渐进)→ PCL/Open3D(2周)→ g2o(1-2周,选修但推荐)→ ROS2 rclcpp集成。


附录K:CMake依赖管理与SLAM构建策略

本附录是 Ch32(CMake工程化)的补充,聚焦 SLAM 项目特有的构建陷阱和依赖管理策略。

依赖管理策略

依赖 推荐方式 说明
Eigen3 系统安装 + find_package 版本需与GTSAM/PCL/Ceres统一
OpenCV/PCL 系统安装或源码编译 依赖链重
Sophus/manif FetchContent 轻量header-only
fmt/spdlog FetchContent或vcpkg 通用工具库
GTSAM/Ceres/g2o 源码编译或FetchContent 核心优化器
DBoW2 Git Submodule 学术项目惯例

Eigen版本一致性是SLAM构建中最大的坑——GTSAM、g2o、PCL、Ceres都依赖Eigen,版本不匹配导致ABI不兼容和运行时segfault。大纲应专门讲解如何在CMake中强制所有依赖使用同一Eigen版本。

交叉编译与代码质量

Jetson平台(Xavier/Orin)交叉编译推荐**Docker容器+CMake工具链文件**方案,需注意CUDA_ARCH_BIN(Xavier=7.2, Orin=8.7)和-march=armv8-a(而非-march=native)。

代码质量工具对多线程SLAM尤其关键:clang-tidy静态分析(bugprone-*,modernize-*,performance-*规则集)、**TSan(ThreadSanitizer)检测数据竞争**在SLAM多线程系统中是必备技能、ASan检测内存错误、UBSan检测未定义行为。建议大纲在并发编程模块增加sanitizer实战环节。

推荐的CMake学习资源

  • ttroy50/cmake-examples:渐进式CMake教程
  • friendlyanon/cmake-init(~2.5k⭐):最佳实践项目模板生成器
  • mbinna/effective_modern_cmake(Gist ~2.7k⭐):规则总结
  • 📕 Professional CMake: A Practical Guide(Craig Scott著,最全面的CMake书籍)
  • 🎬 CppCon 2017: Using Modern CMake Patterns(Mathieu Ropert)

附录L:SLAM空间数据结构对比

SLAM 中自定义数据结构是区分中级与高级工程师的关键能力。本附录是 Ch36(缓存优化)和 系统精读·中高级(高性能精读)的补充参考。

  • FAST-LIO2论文+IKFOM代码:理解流形上卡尔曼滤波的模板化实现

综合数据结构专题建议

SLAM中自定义数据结构是区分中级与高级工程师的关键能力。建议在大纲中增加**"SLAM空间数据结构"专题**(2-3周),对比精读: - ikd-Tree(FAST-LIO2):增量KD树,支持动态插入/删除/重平衡 - iVox(Faster-LIO):增量体素哈希,基于std::unordered_map的线性哈希近邻搜索 -

VoxelHashMap(KISS-ICP):极简体素哈希地图,C++17实现 - ScanContext(SC-LIO-SAM):全局位置描述符,环形投影+余弦距离 这四种数据结构覆盖了树结构、哈希结构和描述符结构三大类,且都是实际SLAM系统中的核心组件。


附录M:50个现代LiDAR SLAM与点云开源项目技术全景

本附录是 系统精读·入门级~系统精读·前沿(项目精读)和附录I(SLAM项目技术演进)的补充,提供每个项目的完整技术栈数据(C++标准、数学库、构建系统、核心C++特性、一句话学习价值)。

本报告系统梳理了GitHub上45个(含路径修正)LiDAR SLAM、点云处理、数学库及ROS2生态开源项目的技术栈细节,涵盖star数、C++标准、依赖库、构建系统和核心C++特性。数据基于2025–2026年GitHub最新信息。其中FAST_LIO与FAST_LIO2为同一仓库,HKUST-Aerial-Robotics/point-lio不存在(正确为hku-mars/Point-LIO),iG-LIO实际路径为zijiechenrobotics/ig_lio,SR-LIO实际路径为ZikangYuan/sr_lio。


一、LiDAR SLAM / LIO项目(30个)

HKU-MaRS实验室系列:C++14为主,模板+ESIKF是核心基因 HKU MaRS Lab出品的项目群共享同一套技术DNA:C++14标准、Eigen+PCL基础库、自研ikd-Tree和IKFoM模块、catkin构建。这些项目展示了如何用模板元编程在流形上实现迭代卡尔曼滤波。 | # | 项目 | GitHub路径 | ⭐ Star数 | C++标准 | 数学/优化库 | 构建系统 | 核心C++特性 | 一句话C++学习价值 |

|---|------|-----------|----------|---------|------------|---------|------------|----------------| | 1 | FAST-LIO / FAST-LIO2 | hku-mars/FAST_LIO | ~4,500 | C++14 | Eigen, PCL, ikd-Tree, IKFoM | CMake + catkin | 模板元编程(ikd-Tree/IKFoM)、Eigen表达式模板、pthread | 学习流形上ESIKF和模板化增量KD-Tree的最佳入口 | | 2 | FAST-LIVO | hku-mars/FAST-LIVO | ~1,600 | C++14 | Eigen, PCL, OpenCV, ikd-Tree, IKFoM | CMake + catkin | 模板、直接光度误差计算、多传感器融合管线 | 展示LiDAR-惯性-视觉紧耦合融合的直接法架构 | | 3 | FAST-LIVO2 | hku-mars/FAST-LIVO2 | ~3,800 | C++14 | Eigen, PCL, OpenCV,

Sophus, vikit | CMake + catkin | Sophus李群运算、序贯卡尔曼更新、仿射变换 | 多传感器SLAM中Sophus SE3运算和序贯更新的现代范例 | | 4 | Point-LIO | hku-mars/Point-LIO | ~1,200 | C++14 | Eigen, PCL, IKFoM, ikd-Tree | CMake + catkin | OpenMP**并行、逐点ESIKF(4-8kHz)、IMU饱和处理 | 逐点(非帧)状态估计架构,高频卡尔曼滤波学习范例 | | 5 | R3LIVE | hku-mars/r3live | ~2,400 | C++14 | Eigen, PCL, OpenCV, Sophus, ikd-Tree | CMake + catkin | ESKF、自实现光流、多线程LIO+VIO子系统 | 紧耦合多传感器融合+实时RGB点云建图的工程参考 | | 6 | VoxelMap | hku-mars/VoxelMap | ~610 | C++14 | Eigen, PCL | CMake + catkin | **多层自适应体素结构、概率平面拟合、哈希体素管理 | 层次化体素数据结构与协方差传播的教科书级实现 | | 7 | BALM | hku-mars/BALM | ~879 | C++14 | Eigen, PCL,

Ceres, OpenCV | CMake + catkin | 自实现SO3李代数、EIGEN_MAKE_ALIGNED_OPERATOR_NEW | LiDAR Bundle Adjustment中自定义李群数学的工程实践 | | 8 | ImMesh | hku-mars/ImMesh | ~693 | C++14 | Eigen, PCL, OpenGL, ikd-Tree | CMake + catkin | 实时增量三角网格重建、OpenGL渲染集成、多模块架构 | SLAM管线中OpenGL实时网格化与多模块C++系统架构 | | 9 | ikd-Tree | hku-mars/ikd-Tree | ~774 | C++14 | PCL, pthreads | CMake | 模板KD_TREE\<PointType>、异步重建、惰性删除、pthread互斥 | 生产级模板空间数据结构:并发访问、惰性删除、增量平衡 | | 10 | IKFoM | hku-mars/IKFoM | ~515 | C++14 | Eigen, Boost | catkin(header-only) | 模板元编程编码流形结构、MTK宏定义状态、SO3/S2/vect类型 | 用C++类型系统编码数学流形的高级模板元编程范例 |

非HKU系LiDAR SLAM项目 | # | 项目 | GitHub路径 | ⭐ Star数 | C++标准 | 数学/优化库 | 构建系统 | 核心C++特性 | 一句话C++学习价值 |

|---|------|-----------|----------|---------|------------|---------|------------|----------------| | 11 | LIO-SAM | TixiaoShan/LIO-SAM | ~4,600 | C++14 |

GTSAM, PCL, OpenCV, Eigen, Boost | CMake + catkin/colcon | **OpenMP**并行、GTSAM因子图API(iSAM2)、IMU预积分因子 | 学习GTSAM因子图优化与iSAM2增量平滑的首选项目 | | 12 | KISS-ICP | PRBonn/kiss-icp | ~2,100 |

C++17 | Eigen, TBB, pybind11 | CMake + pip + colcon |

C++17(结构化绑定、std::optional)、TBB并行、体素哈希 | LiDAR里程计中最干净的C++17代码:极简依赖+TBB+pybind11 | | 13 | Faster-LIO | gaoxiang12/faster-lio | ~1,500 |

C++17 | Eigen, PCL, TBB, glog, IKFoM | CMake + catkin | iVox模板特化(编译期选择线性/PHC)、TBB并行哈希 | 模板编译期配置空间数据结构+TBB实现1800+FPS的极致范例 | | 14 | DLO | vectr-ucla/direct_lidar_odometry | ~1,000 | C++14 | Eigen, PCL, NanoFLANN, nano_gicp | CMake + catkin | OpenMP、双节点架构、NanoFLANN模板KD-Tree | NASA JPL用于地下挑战赛的双线程GICP里程计架构 | | 15 | GLIM | koide3/glim | ~1,500 |

C++17 |

GTSAM, gtsam_points, Eigen, Boost | CMake + colcon/catkin | CUDA GPU加速、OpenMP、全局回调插件机制、AVX指令 | GPU加速SLAM+GTSAM因子图+可扩展插件架构的综合范例 | | 16 | Lightning-LM | gaoxiang12/lightning-lm | ~1,300 |

C++17 | Eigen, PCL, OpenCV, Pangolin, TBB, 自研"miao"优化库 | CMake + ament(ROS2) | OpenMP+TBB并行、自研轻量图优化库(源自g2o) | 生产级C++17 SLAM:模块化设计+自研g2o衍生优化库 | | 17 | CT-ICP | jedeschaud/ct_icp | ~880 |

C++17 | Eigen,

Ceres, tsl::robin_map, glog | CMake(Superbuild) | CMake Superbuild架构、连续时间轨迹参数化、pybind11 | 顶级CMake Superbuild依赖管理+连续时间ICP的工程样板 | | 18 | hdl_graph_slam | koide3/hdl_graph_slam | ~2,500 | C++14 |

g2o, PCL, Eigen, ndt_omp, fast_gicp | CMake + catkin | ROS Nodelet共享内存通信、g2o多约束图优化、OpenMP | 图优化SLAM教科书:g2o多约束因子图+ROS Nodelet架构 | | 19 | SC-LIO-SAM | gisbi-kim/SC-LIO-SAM | ~790 | C++14 |

GTSAM, PCL, OpenCV, nanoflann | CMake + catkin | 单头文件ScanContext库、GTSAM噪声模型多态、KD-Tree | 轻量级位置识别模块集成SLAM系统的单头文件库设计 | | 20 | iG-LIO | zijiechenrobotics/ig_lio | ~499 |

C++17 | Eigen, PCL, TBB(≥2020), glog | CMake + catkin |

C++17并行执行策略(\<execution>头文件)、增量体素GICP | C++17 std::execution并行策略在点云处理中的最佳实践 | | 21 | SR-LIO | ZikangYuan/sr_lio | ~524 | C++14 | Eigen, PCL | CMake + catkin | Sweep重建算法、iEKF状态估计、逐段点云去畸变 | 提升LiDAR处理频率的Sweep重建技术+ESKF紧耦合估计 | | 22 | Patchwork++ | url-kaist/patchwork-plusplus | ~931 | C++14 | Eigen, PCL, pybind11 | CMake + colcon | 模板PatchWorkpp\<PointT>、recursive_mutex线程安全 | Header-only模板算法库+Python绑定的干净分层设计范例 | | 23 | fast_LIMO | fetty31/fast_LIMO | ~204 | C++14 | Eigen, PCL, IKFoM, ikd-Tree | CMake + catkin/colcon | OpenMP(可配线程数)、线程安全库设计、Docker容器化 | 线程安全可移植SLAM库设计:核心算法与ROS解耦的模板 | | 24 | livox_ros_driver2 | Livox-SDK/livox_ros_driver2 | ~660 | C++14 | Livox-SDK2, RapidJSON, PCL | CMake + build.sh | 双ROS1/ROS2条件编译、自定义点云类型、回调异步接收 | 单代码库支持ROS1/ROS2双构建的硬件驱动工程实践 | | 25 | SLAM-application | engcang/SLAM-application | ~777 | N/A | 元仓库 | catkin/colcon | 非C++代码库,配置/安装指南合集 | 20+个SLAM框架安装配置对比的宝贵资源(非代码学习) |


二、点云处理与配准项目(9个) 这一类项目的C++技术水平普遍更高,从nanoflann的**CRTP零虚函数开销**到Open3D的**CUDA+SYCL+ISPC全栈GPU计算**,是学习高性能C++的最佳素材。 | # | 项目 | GitHub路径 | ⭐ Star数 | C++标准 | 数学/优化库 | 构建系统 | 核心C++特性 | 一句话C++学习价值 |

|---|------|-----------|----------|---------|------------|---------|------------|----------------| | 26 | small_gicp | koide3/small_gicp | ~900 |

C++17 | Eigen, Sophus, nanoflann | CMake | Traits-based多态、OpenMP/TBB可插拔后端、header-only | 用traits解耦算法与数据结构的header-only模板库典范 | | 27 | fast_gicp | koide3/fast_gicp | ~1,600 | C++14 | PCL, Eigen, Sophus, CUDA | CMake + catkin | CUDA GPU实现(VGICP_CUDA)、OpenMP多线程、PCL接口继承 | 同一算法CPU(OpenMP)+GPU(CUDA)双实现的统一接口设计 | | 28 | TEASER++ | MIT-SPARK/TEASER-plusplus | ~2,200 | C++14 | Eigen, Boost | CMake | 现代CMake导出目标、pybind11+MATLAB绑定、GTest框架 | 干净CMake打包+多语言绑定的鲁棒优化库工程模板 | | 29 | Open3D | isl-org/Open3D | ~13,400 |

C++17 | Eigen, FLANN, CUDA, TBB, filament | CMake | CUDA+SYCL+ISPC**三路GPU/向量化、pybind11、tensor数据结构 | 大型C++17项目架构大师课:GPU计算+ML集成+跨平台构建 | | 30 | nanoflann | jlblancoc/nanoflann | ~2,600 | C++11 | 无依赖(standalone) | CMake | **CRTP**替代虚函数派发、模板编译期维度、适配器零拷贝 | C++ CRTP的标杆项目:编译期多态实现零开销KD-Tree | | 31 | PCL | PointCloudLibrary/pcl | **~10,800 | C++14 | Eigen, FLANN, Boost, VTK, OpenGL | CMake | 重度模板(PointCloud\<PointT>)、traits系统、显式模板实例化 | 大型模板库设计参考:.h/.impl.hpp/.cpp三文件分离模式 | | 32 | KISS-Matcher | MIT-SPARK/KISS-Matcher | ~661 |

C++17 | Eigen, small_gicp, ROBIN | CMake + Makefile | FetchContent**自动依赖管理、pybind11、k-core图算法 | 现代CMake FetchContent最佳实践+模块化配准管线 | | 33 | CloudCompare | CloudCompare/CloudCompare | ~4,300 | C++14 | 自研CCCoreLib, **Qt, GDAL | CMake | 插件架构(CMake模板)、高度优化八叉树、Qt GUI开发 | 大型Qt/C++桌面应用+插件可扩展架构+八叉树空间索引 | | 34 | IKFoM | hku-mars/IKFoM | ~515 | C++14 | Eigen, Boost | catkin | 模板编码流形结构、MTK宏、Lie群类型模板类 | (同上表#10,属点云处理基础设施) |


三、SLAM入门教材项目(2个) | # | 项目 | GitHub路径 | ⭐ Star数 | C++标准 | 数学/优化库 | 构建系统 | 核心C++特性 | 一句话C++学习价值 |

|---|------|-----------|----------|---------|------------|---------|------------|----------------| | 35 | 视觉SLAM十四讲(第二版) | gaoxiang12/slambook2 | ~6,400 | C++14 | Eigen,

Sophus,

g2o,

Ceres, OpenCV, Pangolin | CMake | 运算符重载、智能指针、lambda表达式(教学导向) | 中文SLAM最佳教材:系统教授Eigen/Sophus/g2o/Ceres用法 | | 36 | 自动驾驶中的SLAM技术 | gaoxiang12/slam_in_autonomous_driving | ~2,300 |

C++17 | Eigen, Sophus, g2o, PCL, OpenCV, yaml-cpp | CMake | **TBB**并行、自实现KD-Tree和iVox、std::optional | 从教材到生产:自实现KD-Tree/iVox/NDT/ICP/ESKF全栈 |


四、SLAM核心数学库(5个) 这5个库是整个SLAM生态的数学基础设施,C++技术含量最高。GTSAM的traits+表达式模板Ceres的Jet自动微分g2o的插件工厂模式、**Sophus和manif的CRTP李群设计**构成了现代SLAM C++编程的四大范式。 | # | 项目 | GitHub路径 | ⭐ Star数 | C++标准 | 数学/优化库 | 构建系统 | 核心C++特性 | 一句话C++学习价值 |

|---|------|-----------|----------|---------|------------|---------|------------|----------------| | 37 | GTSAM | borglab/gtsam | ~3,100 |

C++17 | Eigen, SuiteSparse, METIS, TBB | CMake | Traits系统(概念仿真)、表达式模板自动微分、TBB并行消元 | C++ traits泛型编程+表达式模板自动微分的大师级范例 | | 38 | Ceres Solver | ceres-solver/ceres-solver | ~4,400 |

C++17 | Eigen, SuiteSparse, Abseil, CUDA | CMake | Jet类型自动微分、Schur补模板特化、CUDA密集线性代数 | 自动微分Jet类型+模板特化性能优化的工业级黄金标准 | | 39 | g2o | RainerKuemmerle/g2o | ~3,400 |

C++17 | Eigen, SuiteSparse, CSparse, Ceres autodiff | CMake | 插件/工厂模式(DLL动态加载)、SSE2优化、RTTI、宏注册 | 可扩展C++框架设计:插件架构+工厂模式+运行时类型注册 | | 40 | Sophus | strasdat/Sophus | ~2,200 |

C++17 | Eigen | CMake | CRTP (SO2Base\<Derived>)、Eigen::Map特化、CUDA兼容宏 | CRTP李群库的定义性作品:SE3+Eigen互操作+Jet兼容 | | 41 | manif | artivis/manif | ~1,700 | C++11 | Eigen, Ceres兼容 | CMake | CRTP(LieGroupBase\<Derived>)、模板Bundle\<>组合、解析Jacobian | Header-only C++11 CRTP流形库+学术论文配套的教科书实现 |


五、ROS2 SLAM生态(3个) | # | 项目 | GitHub路径 | ⭐ Star数 | C++标准 | 数学/优化库 | 构建系统 | 核心C++特性 | 一句话C++学习价值 |

|---|------|-----------|----------|---------|------------|---------|------------|----------------| | 42 | slam_toolbox | SteveMacenski/slam_toolbox | ~2,300 |

C++17 |

Ceres, NanoFlann, Eigen, OpenKarto | CMake + colcon | ROS2生命周期节点、pluginlib插件架构、Boost序列化 | 生产级ROS2节点架构:生命周期管理+Ceres优化+插件设计 | | 43 | Navigation2 | ros-navigation/navigation2 | ~3,200+ |

C++17 | Eigen, BehaviorTree.CPP | CMake + colcon | 插件架构(nav2_core)、行为树、Action Server、动态参数 | ROS2架构标杆:30+包的插件化+行为树+生命周期管理 | | 44 | RTABMAP ROS | introlab/rtabmap_ros | ~1,400 | C++14+ |

g2o/GTSAM/Ceres**三选一, PCL, OpenCV, OctoMap | CMake + colcon | **多后端可切换优化(g2o/GTSAM/Ceres)、SQLite地图持久化 | 多后端架构设计典范:构建时选择优化器+长期记忆管理 |


技术趋势与C++标准分布总览 从45个项目的数据中可以提炼出几个清晰的技术趋势。C++14仍是LiDAR SLAM主流标准,占比约55%,主要因为HKU-MaRS系列和PCL生态的惯性;C++17正在快速渗透,尤其在2023年后的新项目(KISS-ICP、Faster-LIO、iG-LIO、GLIM)和核心数学库(GTSAM 4.3+、Ceres、g2o、Sophus最新版)中已成标配;尚无项目强制要求C++20。 在并行计算方面,OpenMP**是最普及的并行方案(约12个项目使用),**TBB**在追求极致性能的C++17项目中成为新宠(KISS-ICP、Faster-LIO、iG-LIO、GTSAM),**CUDA**仅在少数项目中出现(GLIM、fast_gicp、Open3D、Ceres)。构建系统方面,**CMake是唯一通用构建工具,catkin(ROS1)正向colcon(ROS2)迁移,部分项目(KISS-ICP、fast_LIMO)已支持双版本构建。 在C++设计模式维度上,CRTP(Sophus、manif、nanoflann)和**traits-based泛型**(GTSAM、small_gicp、PCL)是SLAM数学基础设施最核心的两种模板技术,而**插件/工厂模式**(g2o、Nav2、CloudCompare)则是大型框架可扩展性的首选方案。Eigen几乎是所有项目的必选依赖,出现在42/45个项目中,其模板表达式和内存对齐机制是学习这些项目的前置知识。

路径修正说明 在本次调研中,以下项目路径与原始查询不同:**Yixin-F/iG-LIO**实际路径为zijiechenrobotics/ig_lio;**ZJU3DV/SR-LIO**实际路径为ZikangYuan/sr_lio;**HKUST-Aerial-Robotics/point-lio**不存在,正确为hku-mars/Point-LIO;**danielgm/CloudCompare**实际为CloudCompare/CloudCompare;**SMRT-AIST/fast_gicp**已重定向至koide3/fast_gicp;**url-kaist/kiss-matcher**实际托管于MIT-SPARK/KISS-Matcher。

结论 这45个项目构成了一幅完整的现代C++ SLAM技术图谱。对于C++学习路径,建议从**slambook2**掌握基础库用法,通过**nanoflann/Sophus/manif**理解CRTP与模板元编程,进入**Ceres/GTSAM/g2o**学习工业级自动微分和图优化设计,再以**FAST-LIO/KISS-ICP/LIO-SAM**为实战对象理解完整SLAM系统工程。small_gicp**是当前traits-based现代C++设计的最佳小型参考,而**Open3D**和**PCL**则展示了十万行级C++项目的架构管理智慧。值得注意的是,**C++17正成为SLAM新项目的事实标准,std::execution并行策略(iG-LIO)和TBB(Faster-LIO)代表了点云处理并行化的未来方向。


附录N:现代视觉SLAM与3DGS开源项目技术全景

本附录覆盖20个主流视觉SLAM/VIO/LVIO/3DGS-SLAM项目的技术栈分层,包括经典SLAM(ORB-SLAM3/DSO/VINS系列)、多传感器LVIO(R3LIVE/FAST-LIVO2)和2024年兴起的3DGS-SLAM(Photo-SLAM/MonoGS/SplaTAM)。

20个主流视觉SLAM/VIO/LVIO/3DGS-SLAM开源项目的技术栈呈现出清晰的分层格局:经典SLAM以C++11/14为主,依赖g2o/Ceres/GTSAM三大优化器;多传感器LVIO统一采用ESKF滤波范式配合Eigen+Sophus;而2024年兴起的3DGS-SLAM几乎全部转向Python+PyTorch,唯一的例外是Photo-SLAM——它用纯C++/CUDA/LibTorch混合编译实现了嵌入式部署能力。优化器选择方面,g2o主导特征法SLAM(ORB-SLAM系列),Ceres主导VIO紧耦合优化(VINS系列、OKVIS2、COLMAP),GTSAM主导因子图建模(Kimera-VIO、DM-VIO),DSO则代表自研优化器的极致路线


一、经典视觉SLAM/VIO:九大项目技术栈详解

ORB_SLAM3——特征法SLAM的集大成者

UZ-SLAMLab/ORB_SLAM3 拥有约**8,300** stars,是视觉SLAM领域引用最高的开源项目。项目标称C++11(定义-DCOMPILEDWITHC11宏),但实际代码使用了std::decay_t等C++14特性,编译通常需要修改为**C++14**。 优化后端采用**修改版g2o**(内嵌于Thirdparty/g2o),使用g2o::OptimizationAlgorithmLevenbergg2o::SE3Quatg2o::VertexSE3Expmap等,同时集成Eigen3(v1.0后全面迁移至Eigen矩阵,速度提升**16-19%)、内嵌Sophus进行SE3/SO3李群运算、DBoW2用于回环检测。构建系统为CMake + build.sh分步编译脚本。 OpenCV使用深度集中在特征层:**cv::ORB**特征提取(ORBextractor.cc是OpenCV orb.cpp的定制修改版)、**CLAHE**直方图均衡化(适配TUM-VI等低光照数据集)、cv::undistortPoints去畸变。值得注意的是,PnP求解使用的是自研修改版EPnP/MLPnP,而非直接调用cv::solvePnP。核心模块覆盖core、features2d、imgproc、calib3d。 C++特性方面,ORB_SLAM3的**三线程架构(Tracking/LocalMapping/LoopClosing)是最核心的学习价值。每个线程通过std::thread创建,使用std::mutexstd::condition_variable实现线程间同步,std::shared_ptr管理关键帧和地图点生命周期,Eigen::aligned_allocator确保SSE内存对齐。

stella_vslam——模块化重构的范本

stella-cv/stella_vslam 约**1,200** stars,C++11标准。与ORB_SLAM3最大的代码组织差异在于其**彻底的模块化设计**:使用系统安装的g2o(动态链接,而非内嵌修改版)、独立的ROS wrapper包(stella_vslam_ros)、独立的可视化器(支持Pangolin/SocketViewer/iridescence三种)、支持sudo make install和CMake install target——这意味着它可以作为一个标准C++库被其他项目链接。 它用FBoW替代DBoW2获得更快的词袋检索速度,引入yaml-cpp进行配置管理和spdlog日志系统。相机模型采用插件式设计(perspective、fisheye、equirectangular可自定义扩展)。不支持CUDA加速。该项目最大的C++学习价值在于展示如何将一个紧耦合的研究代码重构为工业级可复用库。

VINS-Mono与VINS-Fusion——Ceres自定义因子的教科书

HKUST-Aerial-Robotics/VINS-Mono 约**5,800** stars,VINS-Fusion 约**4,400** stars,均为C++11标准,使用catkin_make构建。 两者都以**Ceres Solver**为核心优化引擎。VINS-Mono的Ceres使用方式堪称教科书:自定义ProjectionFactor(视觉重投影)、IMUFactor(IMU预积分,继承ceres::SizedCostFunction)、MarginalizationFactor(手动实现Schur complement边缘化)、PoseLocalParameterization(位姿流形参数化)。这套自定义CostFunction + LocalParameterization的模式是理解SLAM优化后端的最佳入门路径。 OpenCV使用集中在光流前端:cv::calcOpticalFlowPyrLK(Lucas-Kanade金字塔光流跟踪)和cv::goodFeaturesToTrack(Shi-Tomasi角点检测)——这是与ORB_SLAM3特征法前端的根本差异。VINS-Fusion在此基础上新增GeographicLib支持GPS融合、双目几何约束因子(projectionTwoFrameTwoCamFactor),并在2019年KITTI里程计基准中排名开源双目算法第一。

OpenVINS——类型安全状态管理的优雅设计 rpng/open_vins 约**2,800** stars,C++14**标准,是唯一同时支持ROS1/ROS2/standalone三种构建模式的VIO项目。 其最大技术亮点是**ov_type命名空间的类型系统设计——这是一个面向EKF状态管理的领域类型系统。Type基类封装每个状态变量在大协方差矩阵中的位置(id)、维度(size)、当前值(value)和First-Estimate值(fej_value)。派生类JPLQuat覆写update()实现四元数流形更新(4维存储、3维error state),PoseJPL组合JPLQuat+Vec表示6DOF位姿,IMU进一步组合pose/velocity/bias等子类型。StateHelper类集中管理所有协方差操作(边缘化、增广、EKF更新),从根本上避免了直接操作裸矩阵索引的"索引地狱"。这是从过程式矩阵编程到面向领域类型系统设计的C++进阶范例。 MSCKF实现方面,采用滑动窗口EKF(非图优化),支持MSCKF特征(短期跟踪后边缘化)和SLAM特征(长期跟踪)两种模式。Ceres仅用于v2.6+新增的动态初始化MLE refinement。OpenCV使用覆盖calcOpticalFlowPyrLKgoodFeaturesToTrack、CLAHE、ORB描述子(可选前端)和undistortPoints

DSO——从零手写优化器的极致工程 JakobEngel/dso 约**2,400** stars,C++11标准(使用-std=c++0x旧标志)。DSO的核心价值在于**完全自研Gauss-Newton优化器,不依赖任何第三方优化库**。OptimizationBackend/目录手写了完整的Hessian构建、Schur补边缘化、稀疏Cholesky求解流程,通过SSE指令集(__m128)加速矩阵累加运算。MatrixAccumulators.h中的SIMD优化和sse2neon子模块(ARM/NEON兼容)展示了性能极致追求。 直接法实现基于光度误差最小化,联合优化相机位姿、逆深度和仿射光照参数(a,b),支持光度标定(gamma校正、暗角校正)。OpenCV仅用于图像I/O——没有OpenCV时编译dummy函数替代,核心算法完全不依赖OpenCV。SuiteSparse仅用于稀疏矩阵分解。

DM-VIO、Kimera-VIO与OKVIS2 lukasvst/dm-vio(约**1,200** stars,C++14)在DSO基础上集成GTSAM 4.2a6,实现**延迟边缘化**:DSO滑动窗口边缘化时保留状态信息,延迟到GTSAM因子图中再处理,避免信息丢失。这种"旧代码+新库"的混合架构是渐进式系统升级的工程参考。

MIT-SPARK/Kimera-VIO(约**1,800** stars)是本次调研中C++标准最高的项目之一,使用**C++17**(CMAKE_CXX_STANDARD 17),后端采用**GTSAM iSAM2增量优化器**。其**Pipeline模式设计**值得学习:DataProvider → VioFrontend → VioBackend → Visualizer,模块间通过线程安全SPSC队列连接,支持parallel_run切换多线程/单线程模式。集成OpenGV几何验证、Kimera-RPGO鲁棒位姿图优化和语义网格生成。 ethz-asl/okvis2(约**178** stars,C++14/17)通过内部okvis_ceres模块封装Ceres Solver,将ceres::Problem抽象为okvis::ceres::Map类,管理参数块到残差块的映射。高度模块化设计分为okvis_ceres、okvis_cv、okvis_frontend、okvis_kinematics等子模块,支持ROS2 colcon构建。


二、多传感器LVIO:HKU-MARS三代系统演进

FAST-LIVO2——ESKF顺序更新的工程典范 hku-mars/FAST-LIVO2 约**3,830** stars(2025年1月开源后迅速增长),C++14标准,T-RO 2024论文,是当前LiDAR-Visual-Inertial融合的最高水平开源实现。 核心采用**ESIKF(Error-State Iterated Kalman Filter)顺序更新策略**,解决LiDAR和图像测量维度不匹配问题。状态向量StatesGroup为**19-DOF**(含SO(3)旋转、位置、速度、偏置、重力),协方差矩阵19×19,状态操作符(+/-)使用Sophus的Exp()/Log()在SO(3)流形上正确运算。双轨架构实现高频IMU传播(~250Hz)与EKF融合更新(10-20Hz)交替。 OpenCV使用方面,不提取任何视觉特征(无ORB/FAST),而是将LiDAR地图点附加的参考图像patch投影到当前图像,最小化**直接光度误差**实现稀疏图像对齐。数学库包括Eigen(≥3.3.4)、Sophus(非模板版)、Vikit、PCL(≥1.8)。内存管理通过deque+mtx_buffer互斥锁保护传感器缓冲区,PCL智能指针管理点云。

R3LIVE与FAST-LIVO——双子系统架构与第一代实现 hku-mars/r3live(约**2,400** stars,ICRA 2022)采用独特的**LIO+VIO双子系统并行架构**:LIO子系统(基于FAST-LIO)构建几何结构,VIO子系统为地图添加RGB纹理。最有技术特色的是其**自定义LK光流实现**(optical_flow/lkpyramid.cpp),使用cv::parallel_for_进行并行追踪,而非直接调用OpenCV的calcOpticalFlowPyrLK。R3LIVE不使用Sophus库,用Eigen稀疏矩阵直接处理大规模协方差运算。 hku-mars/FAST-LIVO(约**1,600** stars,IROS 2022)是第一代实现,基于FAST-LIO2和SVO2.0,使用ESKF异步更新(区别于FAST-LIVO2的ESIKF顺序更新),视觉地图独立于LiDAR地图。三个项目均使用catkin_make构建、GPLv2许可。


三、3DGS-SLAM:C++与Python的分水岭

Python主导的新范式 2024年CVPR涌现的3DGS-SLAM项目呈现出压倒性的**Python+PyTorch**技术栈。muskie82/MonoGS(约**2,000** stars,CVPR'24 Best Demo Award)、spla-tam/SplaTAM(约**2,100** stars,CVPR'24)、google-research/Splat-SLAM(约**324** stars)均为纯Python实现,CUDA仅出现在可微分光栅化器子模块中。PRBonn/PIN-SLAM(约**574** stars,TRO 2024)虽然不是3DGS(而是Neural Implicit表示),同样是纯Python+PyTorch,仅在位姿图优化环节调用GTSAM。 这一趋势的根本原因是3DGS的核心操作——可微分光栅化、梯度反传优化高斯参数——天然契合PyTorch的自动微分生态。MonoGS在RTX4090上达10fps,SplaTAM在RGB-D场景中相机位姿估计精度比前代方法提升2倍。

Photo-SLAM——唯一的纯C++/CUDA实现 HuajianUP/Photo-SLAM(约**722** stars,CVPR'24)是本次调研中**唯一完全用C++实现的3DGS-SLAM系统**,不依赖Python运行时。其技术独特性在于**三层混合编译架构**: - 阶段1:编译ORB-SLAM3第三方库(DBoW2 → g2o → Sophus,各自独立CMake项目) - 阶段2:编译ORB-SLAM3主库(链接OpenCV + g2o + DBoW2 + Sophus) - 阶段3:编译Photo-SLAM主项目(链接LibTorch C++ API + ORB-SLAM3 + CUDA Rasterizer) CMakeLists.txt同时启用CXX和CUDA两种编译器语言,find_package(Torch REQUIRED)定位LibTorch,CUDA编译目标包括cuda_rasterizer库(forward.cu/backward.cu/rasterizer_impl.cu等)和simple_knn库。三个CMakeLists.txt(主项目、ORB-SLAM3、DBoW2)的OpenCV_DIR必须保持一致。LibTorch替代PyTorch避免了Python GIL瓶颈,使系统可在Jetson AGX Orin嵌入式平台实时运行。C++14标准,依赖CUDA 11.8+、cuDNN 8.9+、LibTorch ≤2.1.2、OpenCV 4.7.0+。


四、深度学习特征匹配正在重塑SLAM前端 cvg/LightGlue(约**4,400** stars,ICCV 2023)和**magicleap/SuperGluePretrainedNetwork**(约**4,000** stars,CVPR 2020)均为纯Python项目。LightGlue支持SuperPoint、DISK、ALIKED、SIFT四种特征(不直接支持ORB),通过自适应深度早停和关键点剪枝在RTX 3080上达**150 FPS@1024关键点**,比SuperGlue快4-10倍。第三方LightGlue-ONNX和LightGlue-OnnxRunner提供C++ ONNX推理部署方案。 colmap/colmap(约**11,100** stars)是star数最高的项目,使用**C++17**标准,核心优化库为Ceres Solver + Eigen + SuiteSparse。不直接依赖OpenCV——使用OpenImageIO处理图像I/O、VLFeat进行特征提取。v3.13+已原生集成ALIKED特征提取和LightGlue匹配,标志着深度学习特征匹配正式进入SfM工业标准。CUDA支持完整覆盖SIFT-GPU提取和MVS密集重建。 深度学习特征匹配的工程化趋势已经非常明显:SL-SLAM(2024)用SuperPoint+LightGlue通过ONNX Runtime完全替换ORB_SLAM3前端,在低光照等挑战场景中表现显著优于传统特征。但**ORB在嵌入式/低功耗设备上仍不可替代**——纯CPU即可实时运行,无需GPU。


五、优化器生态与OpenCV使用模式全景对比 | 项目 | Stars | C++标准 | 优化器 | 前端方法 | OpenCV核心用途 |

|------|-------|---------|--------|----------|---------------| | ORB_SLAM3 | 8.3k | C++14 | g2o | ORB特征 | ORB/CLAHE/undistort | | stella_vslam | 1.2k | C++11 | g2o(系统版) | ORB特征 | ORB/特征匹配 | | VINS-Mono | 5.8k | C++11 | Ceres | KLT光流 | calcOpticalFlowPyrLK/goodFeaturesToTrack | | VINS-Fusion | 4.4k | C++11 | Ceres | KLT光流 | calcOpticalFlowPyrLK/goodFeaturesToTrack | | OpenVINS | 2.8k | C++14 | 自研EKF/MSCKF | KLT光流+ORB | 光流/CLAHE/undistort | | DM-VIO | 1.2k | C++14 | GTSAM+自研GN | 直接法(DSO) | 仅图像I/O | | Kimera-VIO | 1.8k | C++17 | GTSAM(iSAM2) | ORB/FAST+光流 | StereoBM/特征/金字塔 | | OKVIS2 | 178 | C++14/17 | Ceres | BRISK特征 | 特征检测/相机模型 | | DSO | 2.4k | C++11 | 自研GN | 直接法(梯度选点) | 仅图像I/O | | FAST-LIVO2 | 3.8k | C++14 | ESIKF | 直接法patch对齐 | 图像patch/畸变矫正 | | R3LIVE | 2.4k | C++14 | ESIKF | 自定义LK光流 | parallel_for_/金字塔 | | FAST-LIVO | 1.6k | C++14 | ESKF | 直接法patch对齐 | 图像patch/畸变矫正 | | Photo-SLAM | 722 | C++14 | g2o(ORB-SLAM3) | ORB特征 | ORB/DNN/图像处理 | | COLMAP | 11.1k | C++17 | Ceres | SIFT/ALIKED | 不依赖OpenCV |

优化器阵营划分

g2o阵营(图优化专用):ORB_SLAM3、stella_vslam、Photo-SLAM。g2o以顶点(Vertex)和边(Edge)的图结构建模,代码简单直观,是特征法Visual SLAM的首选。

Ceres阵营(通用非线性最小二乘):VINS-Mono/Fusion、OKVIS2、COLMAP。Ceres的自动微分能力(无需手写Jacobian)和强大的社区支持使其成为VIO紧耦合优化的主流选择。

GTSAM阵营(因子图建模):Kimera-VIO、DM-VIO、PIN-SLAM。GTSAM内置iSAM2增量求解器和IMU预积分API,适合需要增量式优化和因子图建模的场景。 自研优化器:DSO(手写GN+SSE)、OpenVINS(自研EKF/MSCKF)。代表对特定问题的极致优化,性能最高但可维护性和可扩展性较低。 ESKF/ESIKF滤波器:FAST-LIVO/LIVO2、R3LIVE。HKU-MARS系列统一采用误差状态卡尔曼滤波范式,适合多传感器高频融合。


结论:三个关键洞察 第一,C++标准正在缓慢升级但远未统一。 多数经典SLAM项目仍停留在C++11/14,仅Kimera-VIO和COLMAP使用C++17。这反映了SLAM社区对ROS/Ubuntu LTS兼容性的保守态度——但C++17的std::optional、结构化绑定等特性确实能显著改善代码质量。 第二,3DGS-SLAM领域出现了Python与C++的路径分叉。 Python+PyTorch路线(MonoGS、SplaTAM)开发效率高、社区活跃,但无法脱离GPU服务器。Photo-SLAM的纯C++/CUDA/LibTorch路线虽然star数较低,但其嵌入式部署能力代表了真正走向产品化的技术方向。这种分叉将是未来2-3年的核心技术选择。 第三,OpenCV在SLAM中的角色正在分化。 特征法SLAM(ORB_SLAM3)深度依赖OpenCV的features2d/calib3d模块;光流法VIO(VINS系列)主要使用video模块的calcOpticalFlowPyrLK;直接法系统(DSO、FAST-LIVO2)几乎不使用OpenCV的算法模块,仅用于图像I/O;而COLMAP甚至完全不依赖OpenCV。深度学习特征匹配(LightGlue)通过ONNX/TensorRT绕过OpenCV直接部署——OpenCV正从"SLAM必备基础库"变为"可选图像处理工具"。