詹力 4fa5f3f8ff | ||
---|---|---|
Docs | ||
Workspace | ||
.gitignore | ||
README.md |
README.md
ORB-SLAM3 -UESTC
概述:基于ORB-SLAM3调整的专用版本。Workspace
目录下的ORB-SLAM3的核心部分源自
一、基本操作
1.1 代码的编译和运行
代码的编译和运行参考文档Workspace/README.md
二、数据的接入与部署
2.1 单目摄像头加入IMU数据实时接入
由于ORB-SLAM3采用的是读取图片和csv文件的方式运行,不适用于小车的实际实时接入数据。所以,我们需要对原本的读取代码进行改进,并且对我们使用的IMU实现一个读取器。伪代码如下:
// 单目摄像头+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;
}