# VIO与SLAM

OAK相机也可用于定位（[VIO](https://en.wikipedia.org/wiki/Visual_odometry)）和
[SLAM](https://en.wikipedia.org/wiki/Simultaneous_localization_and_mapping)（同步定位与建图）。

 * [RVC2](https://docs.luxonis.com/hardware/platform/rvc/rvc2.md)：RVC2的计算能力——尤其是CPU性能——相当有限，因此对于VIO/SLAM，你需要在主机上运行算法。
 * [RVC3](https://docs.luxonis.com/hardware/platform/rvc/rvc3.md)：由于配备四核ARM处理器，你可以在相机本身上运行VIO/SLAM算法。详见[RAE
   设备端VIO与SLAM](#RAE%20on-device%20VIO%20%26%20SLAM)。

多个支持OAK相机的SLAM和定位项目：

 * [ORB SLAM3](https://qiita.com/nindanaoto/items/20858eca08aad90b5bab) 配合OAK-D和ROS1，作者 @nimda
 * [RTAB-Map](https://github.com/introlab/rtabmap)
   最近（[此PR](https://github.com/introlab/rtabmap/pull/696)）增加了对depthai和OAK相机（通过ROS）的支持
 * [SpectacularAI的SLAM](https://twitter.com/oseiskar/status/1536344550305763328?s=20&t=YY432W59nsZd6_IhhfBW4A) 配合OAK-D——非商业用途免费
 * [ArduCam 视觉SLAM教程](https://www.arducam.com/docs/opencv-ai-kit-oak/performing-location-with-visual-slam/)
 * [DepthAI-SLAM](https://github.com/bharath5673/depthai-slam)
 * [无人机设备端基于神经网络的定位](#Drone%20on-device%20NN-based%20localization)

## 设备端SuperPoint用于定位和SLAM

一位客户与我们分享了一个解决方案，该方案在设备端（基于[RVC2](https://docs.luxonis.com/hardware/platform/rvc/rvc2.md)的OAK-D）运行SuperPoint（[GitHub仓库](https://github.com/rpautrat/SuperPoint)，[Arxiv论文](https://arxiv.org/abs/1712.07629)）
特征提取神经网络，然后将特征用于定位和SLAM（在主机上）。

## RAE 设备端VIO与SLAM

下面的演示展示了如何通过[Spectacular AI](https://www.spectacularai.com/) SDK在设备端运行VIO与SLAM。
视差匹配和特征提取+跟踪在[RVC3](https://docs.luxonis.com/hardware/platform/rvc/rvc3.md)的加速模块上完成。 然后将特征与视差结合，提供用于视觉里程计的跟踪3D点，Spectacular AI
SDK将其与IMU数据融合， 以实现机器人的精确定位。

## 同步帧与IMU消息

对于VIO/SLAM解决方案，你需要将IMU消息同步到曝光中间时刻。有关曝光时序和时间戳的详细信息，请参见[帧捕获图](https://docs.luxonis.com/hardware/platform/deploy/frame-sync.md)。
[此处](https://github.com/luxonis/oak-examples/tree/master/gen2-syncing#imu--rgb--depth-timestamp-syncing)提供IMU/帧同步演示。

一些更高级的算法会对多个IMU消息（曝光前后）加权，并插值出最终值。

## 无人机设备端基于神经网络的定位

一种新颖的AI空间定位方法，使用OAK相机。无人机在设备端运行神经网络推理以提供定位。
[论文链接](https://link.springer.com/article/10.1007/s11554-023-01259-x)，[GitHub仓库链接](https://github.com/QuetzalCpp/DeepPilot4Pose)。
