目标是模仿MMDet框架,写一个类似功能的SLAM C++软件框架来通用地完成SLAM算法,搭积木一样构建SLAM系统,以此来实现SLAM项目的快速开发与验证,目前给出一个初步的设计架构方案:
整体框架设计:整个系统分为七个核心算法模块:跟踪(前端的完整里程计)、地图(地图表示、查询与新增)、位置(回环检测与重定位)、后端(长期一致性约束)、传感器IO(数据读取与预处理)和可视化(与ROS交互并可视化)、全局资源(管理长期的共享数据,如地图、状态)七大模块,每个模块实现一种功能,每个模块可以使用不同算法插件来实现功能的组合,如前端可以使用ORB描述子提取插件、点面残差提取插件等,这种做法将SLAM pipeline重新构造成最小可复用组件,开发者可以像搭乐高一样通过连接组件并设置参数来构建完整系统,类似于深度学习框架中组合网络层的方式,整个SLAM项目面向激光/视觉/惯性的多传感器融合方案
- 使用功能模块和算法插件两种概念来构建SLAM系统,模块对应一个具体任务功能,算法对应一种具体实现方法(比如说视觉前端可以使用ORB描述子也可以使用光流法),以此来实现解耦和模块化,并且便于对单个算法或者模块进行测试
- 为实现上述插件机制,可以为每类功能模块定义一个抽象基类,内部定义模块需要的主要接口函数,例如,TrackingBase定义接口Track(Frame& frame)来处理新帧位姿估计;MapBase定义接口UpdateMap(KeyFrame& kf)等,具体算法插件模块继承相应的基类并实现接口方法。通过C++的多态机制,框架核心部分只依赖基类接口编程,无需了解具体实现细节,以此便于实现模块替换
- 使用注册表或者工厂模式来实现从字符串到模块的创建,维护一个全局注册表,便于通过YAML或其他配置文件中的参数来进行查表和实现实例化,并且便通过一个总的构建器对象搭建起来一个slam系统,如此用户只需编辑配置文件即可切换算法,同时通过C++17的内联函数来实现注册的唯一性,也就是可以在创建新模块/插件后直接注册和使用
- 基于 Eventpp 实现轻量级进程内 TopicBus,替代 ROS 的模块通信,且进程内共享同一个管理者。各模块只需按 topic 与消息类型对齐即可发布/订阅,降低耦合、提升可移植性、避免序列化/反序列化带来的时间开销。发布非阻塞,泵线程负责分发,回调默认异步投递到线程池,避免耗时处理拖慢系统;回调既支持类内成员函数也支持类外函数,便于维护与测试。
- 日志系统基于 spdlog 构建全局 LogManager,进程内共享同一组 sinks(终端/文件可选)与异步线程池,统一落盘。模块/插件通过 Module/Plugin 获取带层级标签的 logger(如 [Front][ORB]),自定义前缀格式化实现自动对齐。支持对象与指针两种调用(log.info / log->warn)及互转,并可按 sink 分级控制输出级别与终端颜色。
- 使用Builder构建器作为装配线与拓扑调度器,把YAML等配置文件中的内容组织为一个可执行的SLAM系统,通过模块/插件创建、依赖注入插件指针、共享上下文的方式,构建出完整的SLAM模块化架构
- 模块使用主被动混合的方式进行执行,关键模块如传感器IO、跟踪等有自己的线程和循环来主动执行,其他的模块如地图、后端等模块使用事件驱动+线程池方法被动执行,并且统一使用 TopicBus和Context进行交互,模块之间不存在相互调用
- 框架将地图、状态、关键帧/约束图、回环库等长期共享数据统一封装为 Resources,由 Builder 创建并管理生命周期与持久化。各模块仅通过 Query/Write/Snapshot 能力接口访问资源,配合版本/快照与读写锁实现并发安全;写权限尽量收敛到后端/地图维护线程,前端高频仅读,以支持异步融合、大地图分区加载与可替换实现。
第一步是复现成功Fastlio算法