- Eigen:Eigen 是 C++ 的一个开源线性代数库,主要是进行矩阵运算,对导航算法相当关键,要知道导航算法基本都是矩阵计算。除了基本的矩阵计算之外,支持四元数、旋转矩阵,C++ 写的导航定位的开源代码中基本都是用 Eigen。使用 Eigen 有个麻烦的地方就在于难以调试,经常报错了,你找不到问题在哪,尤其是一口气写了一大段。有的错误写出来的时候编译器就会提示你错了,有的编译的时候就报错并且告诉你哪一行出错了,这两种都还比较友好;麻烦的是的是有的编译的时候报错不告诉你哪一行错,有的编译能过,运行到那一行才出错。所以如果你对 Eigen 不是很熟,建议写两行就编译一下,写几句就单步调试一下,要不然写多了不好调试。
- OpenBLAS:也是一个线性代数库,其中 BLAS 全称 Basic Linear Algebra Subprograms 基础线性代数程序集,可以实现高性能计算,它优化了多种处理器架构下的性能,可以多线程并行计算;有些后处理 GNSS 算法不用卡尔曼滤波,而直接用最小二乘,矩阵维数相当大,用 OpenBLAS 来实现矩阵运算。
- Gflags:Gflags 是一个由 Google 开发并用于 C++ 的命令行参数管理库,它为C++开发者提供了一种高效、简洁的方式来处理命令行参数,从而简化了程序的配置和使用过程。提供一种声明式的方式来定义、解析和检查命令行标志。这些命令行标志(或称为“参数”)允许程序员在程序执行时通过命令行参数传递配置信息,从而控制程序的行为,例如设置日志级别、指定配置文件位置等。通过 gflags,用户可以在运行程序时方便地临时修改输入参数,如果没有指定参数,则使用默认参数。例如,一个可执行程序可以通过命令行参数来指定其连接的IP地址和端口号,或者使用默认设置。
- Glog:Glog,即 Google Logging,是一个由 Google 开发的、基于程序级记录日志信息的C++库。这个库的设计是为了在应用程序中实现高性能、灵活和可定制的日志记录。采用了高效的缓冲机制和异步写入日志的方式,使得日志记录操作不会阻塞主程序的执行;提供了丰富的配置选项,允许开发者通过命令行参数或配置文件来定制日志输出的行为,包括指定要记录的日志级别、日志文件的路径、是否同时输出到标准错误流等;Glog 支持多种日志级别,包括 INFO、WARNING、ERROR和FATAL;此外,Glog还具有一些其他的功能,如条件中止程序(通过丰富的条件判定宏来预设程序终止条件)、异常信号处理(自定义异常处理过程)以及系统级日志记录等。
- easyloggingpp:也是一个日志库,比 Glog 轻量,只有头文件,也是四种日志级别,简单使用,体验和 Glog 差不多。
- Ceres-Solver:Ceres Solver是一个 Google 开源的C++库,用于解决具有边界约束的非线性最小二乘问题和一般无约束优化问题,是图优化程序使用最多的库,Ceres Solver的依赖项包括 CMake、Eigen、glog和gflags,这些都是必要的。还有一些可选的依赖项,如SuiteSparse、BLAS and LAPACK 以及 CUDA。
- g2o:也有部分图优化程序使用,但不如 Ceres 多。General Graphic Optimization,即通用的图优化算法库,提供了一种建模和求解图优化问题的框架,使得用户可以方便地定义自己的优化问题并使用不同的数值优化方法进行求解;使用g2o求解优化问题时,需要先定义节点(顶点)和边,包括初始化函数、更新函数、误差计算函数、输入输出函数等。然后在主程序内部,实例化g2o求解器,选择迭代求解方式,实例化所使用的节点与边来逐步建立图模型,设置迭代次数并开始求解。。
- gtsam:GTSAM(Georgia Tech Smoothing and Mapping library)是一个使用BSD许可的C++库,主要用于机器人技术和计算机视觉应用中的传感器融合。它实现了用于SLAM(同时定位和地图构建)、VO(视觉里程计)和SFM(运动结构)等任务的关键算法。广泛应用场景包括机器人定位、结构化环境建模(如3D重建)、多目标跟踪以及传感器网络同步等。无论是学术研究者还是工业界开发者,GTSAM都能提供强大而灵活的工具,帮助他们在机器人学和计算机视觉等领域实现更精准的估计和优化。
- Yaml-Cpp:YAML,即 YAML Ain't Markup Language,是一种轻量级的数据序列化格式,被广泛应用于各种场景,如配置文件、数据交换、Web 应用程序等。相比于其他格式,如XML和JSON,YAML的语法更为简洁明了,易于阅读和编写。它使用缩进的方式组织数据,支持多种数据类型,包括纯量数据、序列数据和映射数据,并可以使用嵌套的方式表示数据结构,支持多层级的嵌套。此外,YAML还支持Unicode编码,并可以在多种编程语言中实现,如Python、Java、Ruby、PHP等。yaml-cpp库的功能包括但不限于:提供了将C++对象转换为YAML文本的功能,生成的YAML文本可以保存到文件或者作为网络传输中的数据。支持YAML 1.2规范的语法,包括基本类型、映射、序列、流等,同时还支持YAML的标记(Tag)扩展,可以根据需要自定义并解析标记。
- OpenCV:OpenCV,全称 Open Source Computer Vision Library,涵盖了数字图像和视频处理的大部分内容。它提供了图像和视频的读取、写入、显示、变换、滤波等基本操作,还支持特征提取、目标检测、人脸识别、物体跟踪、相机标定、三维重建等高级功能。此外,OpenCV还集成了各种机器学习算法,如支持向量机、随机森林等,可以用于图像分类、目标检测等任务。
- PCL:PCL(Point Cloud Library)实现了大量点云相关的通用算法和高效数据结构,主要涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等领域。
- Boost:Boost 库是一个强大而灵活的工具集,为C++程序员提供了丰富的扩展功能,包含了160余个库/组件,涵盖了字符串与文本处理、容器、迭代器、算法、图像处理、模板元编程、并发编程等多个领域。其中,许多组件如正则表达式库、线程和并发编程工具、时间和日期处理功能、文件系统操作接口、序列化和反序列化功能、数学和统计工具以及网络编程工具等,都在实际编程中发挥着重要作用。是C++最重要的库,在C++11之前的程序中大量使用,缺点是比较臃肿,由于很多Boost库的特性都被现代C++语法吸收了,所以现在渐渐的用的少了。
- better-enums:是一个编译时工具,提供了一个更强大、更易用且类型安全的方式来定义和操作枚举,通过提供一组静态工厂方法和扩展功能,使得枚举不再仅仅是简单的常量列表。在C++中,它允许转换枚举、循环它们、找到它们的最大值,静态地执行约定,并将结果作为模板参数传递给constexpr函数。所有这些反射功能都可以满足元编程需求。
- DBoW2:词袋库,用于 ORB-SLAM 等 SLAM 算法中的回环检测。它使用特征提取算法(如Fast)提取图像的特征描述子,并根据一定的策略将这些特征描述子聚类为“单词”,通过树的形式组织,得到一个vocabulary tree(词汇树)。之后,利用vocabulary tree将图像转换为{单词,权值}的向量表示,通过计算向量间距离的方式计算图像之间的相似性。
- matplotlib-cpp:C++ 绘图库,科研绘图,实现同 MATLAB 中 Plot 和 Python 中 Matplot 类似的功能。
- progressbar:一个极简的C++终端进度条库,100多行代码。
- googletest:C++ 测试框架,我还没咋用过,但对于工业落地的项目,测试至关重要,专门有测试岗。