

# ORB-SLAM3 -UESTC

概述：基于ORB-SLAM3调整的专用版本。`Workspace`目录下的ORB-SLAM3的核心部分源自

## 一、基本操作

### 1.1 代码的编译和运行

​		代码的编译和运行参考文档`Workspace/README.md`

## 二、数据的接入与部署

### 2.1 单目摄像头加入IMU数据实时接入

​		由于ORB-SLAM3采用的是读取图片和csv文件的方式运行，不适用于小车的实际实时接入数据。所以，我们需要对原本的读取代码进行改进，并且对我们使用的IMU实现一个读取器。伪代码如下：

```c++
// 单目摄像头+IMU接入ORB-SLAM3伪代码

int main(){
    // 创建IMU数据读取器
    IMUReader imuReader("/dev/ttyUSB0");
    // 创建ORB_SLAM3定位系统
    ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::IMU_MONOCULAR, true);
    // 默认30fps帧率
    int fps = 30;
    // 初始化摄像头
    cv::VideoCapture cap = cv::VideoCapture(0);
    cap.set(cv::CAP_PROP_FRAME_WIDTH, 640);
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480); 
    // 清空IMU内部缓存，等待1fps的时间用于填充数据
    imuReader.clear();
    delay_ms(1000 / fps);
    while(true){
    	Mat frame;
        // 通过Opencv从摄像头读取视频帧
        cap >> frame;
        // 获取当前系统的时间戳
        tframe = get_systemTick();
        // imuReader从串口读取数据
        IMUData vImuMeas;
        int statsu = imuReader(vImuMeas);
        // 清空IMUReader内部缓存, imuReader内部线程继续读取新的数据
        imuReader.clear();
        // 如果读取IMU状态正确
        if(status){
            // 视觉+IMU VSLAM
            SLAM.TrackMonocular(frame,tframe,vImuMeas);
        }else{
            // 纯视觉 VSLAM
            SLAM.TrackMonocular(frame,tframe);
        }
    }
    return 0;
}

```

