先抛出个大问题:
如何实现VIO(visual-inertial odometry)设备使用Monado外接SLAM算法?
这是一个庞大的问题
要实现OpenXR–Monado Runtime–SLAM这条通路在具体VIO device上落地非一朝一夕
通过源码以及Collabora团队的博客可以看到,Monado已在多个硬件设备上进行了适配
但是也仅限于在Linux环境里
运行示例 (SLAM-VIO Tracking for Monado OpenXR):
左上:RealSense D455 (data source)
右上:Basalt SLAM
左下:OpenXR application
Monado目前对VIO(视觉惯性里程计)设备的适配主要有:
索尼:PSMV,PSVR
微软:WinMR
Intel:Realsense
PSMV,PSVR是Outside-In
WinMR,Realsense是Inside-Out
Visual-inertial tracking for Monado
从Collabora今年4月5号发布的这篇博客可以看到:
1.Monado为了支持外接SLAM算法,对比研究了如今比较流行的三个开源SLAM系统
(1).Kimera-VIO:有商业许可
非常有前途的VIO系统,支持一个(单目)或两个(立体)相机和IMU一起操作,
但是并没有得到good result
(不清楚是没有调通还是没有得到太好的result)
(2).ORB-SLAM3: 没有商业许可
SLAM理论实现的第三次迭代,评价很高,当今最为流行。
可以在几乎任何传感器配置下运行,从纯单目(无IMU)SLAM 到全立体IMU SLAM,
实测结果可用,tracking运行良好
(3).Basalt:有商业许可
主要支持立体声配置,足够灵活,速度惊人,非常适合 XR 等实时应用程序。
ORB-SLAM3 也不错,但ORB-SLAM3的强项似乎在于处理预先记录的数据集。
Basalt 不仅速度非常快,源代码逻辑清晰,是软件工程思想的良好体现
另外还有ProSLAM、OpenVINS、RTAB-Map 和 HybVIO暂时没有进行研究。
2.通过研究三个SLAM算法,monado实现了一个标准头文件:slam_tracker.hpp
(1).这个标准头文件将这些SLAM算法与Monado进行集成
(2).每个SLAM系统都需要对该头文件实现一个Adapter
这个Adapter衔接Monado和SLAM系统内每一个package pipeline的input和output
(3).在实现过程中,需要具备系统pipelines的状态控制和一些队列机制的知识
(4).在Monado中,一个核心SLAM Tracker类负责与Adapter交互,
并实现通用的额外功能(例如,姿势预测)
(5).流程打通后
只需Camera和 IMU 硬件的驱动程序将其数据流传输给SLAM Tracker类就行了
3.RealSense驱动程序的实现,比WinMR要好一些
(可能也是因为RealSense比WinMR设备要更简单一些)
左: Samsung Odyssey+
右: Intel RealSense D455
废话不多说了
下面就以一张较为粗略的代码流程图呈现 Realsense 在Monado中是如何衔接外部SLAM的
以后非必要不再以贴代码的方式来呈现了
上图简洁又明了,逻辑也一目了然
从流程图中可以看到
最终会走到一个比较重要的函数:t_slam_create( )
这个函数里包含了slam_tracker具体实现的重要参数、结构体、函数和基本步骤
下面再上一张t_slam_create( )函数的详解图:
Monado中设备衔接外部SLAM的代码还涉及到具体设备的驱动程序,
以及其他一些较为复杂的实现逻辑
目前看源码跟到的也只是其中很小的一部分,
后续还会持续跟踪,逐步完善补充