0. 简介
在深入剖析了Ceres、Eigen、Sophus、G2O后,以V-SLAM为代表的计算方式基本已经全部讲完。就L-SLAM而言,本系列也讲述了PCL、Open3D、与GTSAM点云计算部分。最近在了解boost,个人觉得这些仍然在SLAM以及自动驾驶中是必须的,打算仍然延续本质剖析的结构来续写这个系列,方便自己回顾以及后面的人一起学习。
1. C++总体介绍
通用库
Boost:Boost是功能相当丰富的C++基础库,boost里有很多好用的组件,都值得我们学习,造轮子时也有个方向。
Folly:Facebook的开源库,和Boost类似,该框架基于C++14的库,目的不是为了替代标准库,而是对标准库的一种补充,尤其是大规模下的性能。
Abseil:Google的STL,我个人更喜欢的一个开源库,主要文档比较全,官方文档关于Abseil介绍的也很详细。这个库的特点是用 C++ 11 的代码实现了许多 C++ 14 和 C++ 17 的特性.
通讯
zeromq:zmq是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库。它提供一个高性能消息队列,该库设计成常见的套接字风格的API。ZeroMQ以嵌入式网络编程库的形式实现了一个并行开发框架(concurrency framework),能够提供进程内(inproc)、进程间(IPC)、网络(TCP)和广播方式的消息信道,并支持扇出(fan-out)、发布-订阅(pub-sub)、任务分发(task distribution)、请求/响应(request-reply)等通信模式。
asio:asio 是一个跨平台的C++网络编程框架,通过先进的C++方法为开发人员提供连续异步模型。(boost中存在该模型).
muduo:一个基于 Reactor 模式的现代 C++ 网络库,它采用非阻塞 IO 模型,基于事件驱动和回调,支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。
protobuf:Google出品,protobuf一个具有高效的协议数据交换格式工具库(类似Json),但相比于Json,Protobuf有更高的转化效率,时间效率和空间效率都是JSON的3-5倍。
poco:一个开源的C++类库的集合,它主要提供简单的、快速的网络和可移植应用程序的C++开发,这个类库和C++标准库可以很好的集成并填补C++标准库的功能空缺。POCO库的模块化、高效的设计及实现使得特别适合嵌入式开发。
libevent:一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动,高性能,轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台;支持多种 I/O 多路复用技术:epoll、poll、select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级等。
音视频
FFmpeg:ffmpeg的功能相当强大,音视频采集、音视频格式转换、滤镜、水印、音视频编解码、推送到流媒体服务器等等,太多了,对视频的绝大多数处理都可以使用ffmpeg,可以说无所不能。
图像处理
OpenCV:OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS多种平台, 如今也提供对于C#、Ch、Ruby,GO的支持。
图形
OpenGL:用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API),图型开发者貌似都离不开OpenGL,与纹理有关的操作基本都会用到OpenGL,常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。
Vulkan:下一代的OpenGL,可解决OpenGL很多框架层面的缺陷,更高性能,可能我们以后都会从OpenGL迁移到Vulkan吧,但升级永远没有那么容易,成本太高,至少它现在还没那么普及。
Ogre:一个三维(3D)图形渲染引擎。它是面向对象的,并且高效,抽象化了不同的API和平台,这样可以以场景为对象来使用物体,支持多种场景。它已经成功地被应用于诸多三维仿真领域,包括网络游戏和三维仿真项目。
线性代数
Eigen:一个线性算术的C++模板库,功能强大、快速、优雅以及支持多平台。
GLM:由于 C/C++标准库中没有几何数学库,这样造成在开发一个三维系统之初往往都需要自行实现一个实用的几何数学库,这样太费时费力了。GLM的出现可以很好的解决这个问题,而且GLM不需要编译成任何库,只需要依赖头文件即可使用(OpenGL搭配GLM使用,很爽)。
JSON
C++语言就在rapidjson和nlohmann/json中选一个,C语言就用cJSON
LOG
spdlog:目前最火的C++log库,只需要头文件即可,兼容C++11,相当方便
glog:Google Glog 是一个C++语言的应用级日志记录框架,提供了 C++ 风格的流操作和各种辅助宏。
界面
Qt:工具丰富、功能丰富、开源并跨平台、架构的优势等,导致原来越多的程序员投向了QT的怀抱。
参数解析
gflags:google开源的gflags是一套命令行参数解析工具,功能强大,使用起来非常方便,gflags还支持从环境变量、配置文件读取参数
rpc
brpc:brpc又称为baidu-rpc,百度出品。brpc目前被应用于百度公司内部和其他外部好多公司的各种核心业务上。
grpc:gRPC 是可以在任何环境中运行的现代开源高性能 RPC 框架。google出品,必属经典。
2. boost介绍
Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。当中有很多扩展库已经在C++的标准库中应用。按照实现的功能,Boost可为大致归入以下20个分类,在下面的分类中,有些库同时归入几种类别。详细的内容可以参考百度百科。目前在SLAM当中最常用的就是Geometry和Graph库。 Geometry库是用于解决几何问题的概念、原语和算法。而Graph 库则是处理图结构的库。
3. boost之Geometry
以下是Geometry常用的头文件以及typedef方式。
以下是Geometry常用的实现方法