2023-11-28 17:52:25 +08:00
|
|
|
|
|
|
|
|
|
|
2023-11-28 23:44:19 +08:00
|
|
|
|
# ORB-SLAM3 -UESTC
|
|
|
|
|
|
|
|
|
|
概述:基于ORB-SLAM3调整的专用版本。`Workspace`目录下的ORB-SLAM3的核心部分源自
|
2023-11-28 17:52:25 +08:00
|
|
|
|
|
|
|
|
|
## 一、基本操作
|
|
|
|
|
|
|
|
|
|
### 1.1 代码的编译和运行
|
|
|
|
|
|
2023-12-01 13:31:06 +08:00
|
|
|
|
代码的编译和运行参考文档`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;
|
|
|
|
|
}
|
2023-11-28 17:52:25 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|