微鉴道长SLAM学习笔记(目录)

下面是第一版视觉SLAM14讲我的笔记目录。文章的内容不仅限于14讲,包括一些拓展的内容。

SLAM14讲学习笔记(一) 李群李代数基础

SLAM14讲学习笔记(二)相机模型总结

SLAM14讲学习笔记(三)非线性优化基础

SLAM14讲学习笔记(四)视觉里程计(特征点法)和重难点总结

SLAM14讲学习笔记(五)视觉里程计(光流法和直接法)和对于雅克比矩阵的理解

SLAM14讲学习笔记(六)后端(最难一章:卡尔曼滤波器推导、理解以及扩展)

SLAM14讲学习笔记(七)后端(BA与图优化,Pose Graph优化的理论与公式详解、因子图优化)

SLAM14讲学习笔记(八)回环检测

SLAM14讲学习笔记(九)单目稠密重建、深度滤波器详解与补充

SLAM14讲学习笔记(十)建图与SLAM开源方案对比

SLAM14讲学习笔记(十一)g2o图优化中的要点与难点(前端VO中雅克比矩阵的定义)

SLAM14讲学习笔记(十二)ch9设计前端(代码详述)

SLAM14讲学习笔记(十三)ch10 后端1(代码详述)

SLAM14讲学习笔记(十四)ch13 建图(代码详述带注释)

SLAM14讲学习笔记(十五)卡尔曼滤波器的直观理解

SLAM学习笔记(十六)快速了解EPnP算法原理

SLAM学习笔记(十七)激光SLAM——Cartographer配置文件参数解释及报错原因

SLAM学习笔记(十八)3D激光SLAM——Cartographer第一视角点云可视化配置与使用方法(最新)

SLAM学习笔记(十九)开源3D激光SLAM总结大全——Cartographer3D,LOAM,Lego-LOAM,LIO-SAM,LVI-SAM,Livox-LOAM的原理解析及区别

SLAM学习笔记(二十)LIO-SAM流程及代码详解(最全)

SLAM就业问题汇总复习(持续更新中)


最近学完了激光SLAM、视觉惯性里程计VIO的基本理论。另外最近实验室新买了第二版的十四讲,过几天看看,补充点东西上来。然后“SLAM14讲学习笔记”的内容就到此为止了。还是会继续更新的,不仅仅限于14讲的内容,请大家关注。新的内容将不再写成《SLAM14讲笔记》而是写成《SLAM学习笔记》。

之后我计划更新“VIO学习笔记”和“激光SLAM学习笔记”。但是最近实验室项目很忙,一直没有空上来总结。所以这里写一个总的目录,之后将抽空把内容更新进来。

另外,还有事件相机(event-based camera)我大概做了一年多,这个业内人都知道和SLAM密切相关。之前我发现网上的资料十分缺少,因此之后想抽时间总结一些这一年来关于事件相机的心得体会和学习笔记、工程代码,可以给大家提供一些必要的帮助。但是这个目前不能放核心的东西上来,不然叫老板看到,后果不得了。

(这个暂时没空写了,只写了一篇关于配置模拟器的事件相机(Event-based camera)模拟器ESIM配置及使用指南,我现在不从事件相机的工作,平时真的很忙,估计以后就不写了,如果在做的人可以留言沟通一下)


毕业后阴差阳错的从定位做到了导航,目前主要通过强化学习来做。以后会更新一些相关的内容。有兴趣的同学可以一起交流。

### SLAM 14讲 第10章 内容总结 SLAM 14讲的第十章主要围绕 **视觉里程计(Visual Odometry, VO)** 的实现展开,重点讨论如何通过连续帧间的特征匹配计算相机运动。以下是该章节的核心内容及其示例代码解析: #### 1. 特征提取与描述子 在VO中,通常使用SIFT、SURF或ORB等算法提取图像中的特征点并生成对应的描述子。这些特征用于后续的匹配过程。 ```cpp cv::Ptr<cv::FeatureDetector> detector = cv::ORB::create(); std::vector<cv::KeyPoint> keypoints; detector->detect(image, keypoints); ``` 上述代码展示了如何利用OpenCV库创建一个ORB检测器,并从中提取关键点[^1]。 #### 2. 特征匹配 为了估计两幅图像间的关系,需要对前后帧的关键点进行匹配。常用方法包括暴力匹配(Brute Force Matching)和FLANN匹配。 ```cpp cv::BFMatcher matcher(cv::NORM_HAMMING); std::vector<cv::DMatch> matches; matcher.match(descriptors_1, descriptors_2, matches); ``` 此部分实现了基于Hamming距离的特征匹配操作。 #### 3. 基础矩阵与本质矩阵 通过RANSAC算法筛选出可靠的匹配点后,可以进一步求解基础矩阵 \( F \) 和本质矩阵 \( E \),从而推导出相对位姿关系。 ```cpp cv::findEssentialMat(points1, points2, K, method=cv::RANSAC, prob=0.999, threshold=1.0, mask=inliers_mask); cv::recoverPose(E, points1, points2, R, t, K); ``` 这里分别调用了`findEssentialMat`函数获取本质矩阵以及`recoverPose`函数恢复旋转和平移向量。 #### 4. PnP问题求解 当已知三维空间点与其对应二维投影位置时,可以通过PnP算法估算相机姿态。 ```cpp cv::solvePnPRansac(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec); ``` 以上片段说明了借助`solvePnPRansac`完成鲁棒性的单目重定位任务。 --- ### 示例代码综合展示 以下是一个完整的VO流程简化版本: ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 加载图片序列 std::vector<cv::Mat> images = {cv::imread("frame1.png"), cv::imread("frame2.png")}; // 初始化ORB特征检测器 cv::Ptr<cv::ORB> orb = cv::ORB::create(); std::vector<std::vector<cv::KeyPoint>> key_points(2); std::vector<cv::Mat> descriptors(2); for (size_t i = 0; i < 2; ++i) { orb->detectAndCompute(images[i], cv::noArray(), key_points[i], descriptors[i]); } // 进行特征匹配 cv::BFMatcher matcher(cv::NORM_HAMMING); std::vector<cv::DMatch> matches; matcher.match(descriptors[0], descriptors[1], matches); // 提取匹配点坐标 std::vector<cv::Point2f> pts1, pts2; for (const auto& match : matches) { pts1.push_back(key_points[0][match.queryIdx].pt); pts2.push_back(key_points[1][match.trainIdx].pt); } // 计算本质矩阵 cv::Mat essential_matrix = cv::findEssentialMat(pts1, pts2, cv::CameraMatrix, cv::RANSAC, 0.999, 1.0); // 恢复相机姿态 cv::Mat R, t; cv::recoverPose(essential_matrix, pts1, pts2, cv::CameraMatrix, R, t); std::cout << "Rotation Matrix:\n" << R << "\nTranslation Vector:\n" << t << std::endl; return 0; } ``` --- ### 总结 本节介绍了视觉里程计的基本原理及其实现步骤,涵盖了从特征提取到最终位姿估计的过程。每一步都依赖于精确的数据处理和技术支持,例如特征匹配的质量直接影响到最后的结果准确性。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值