61 lines
1.8 KiB
Markdown
61 lines
1.8 KiB
Markdown
|
||
|
||
# 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;
|
||
}
|
||
|
||
```
|
||
|