slam学习(3)

本文介绍了SLAM技术中的定位部分,重点讲述了如何利用图像特征匹配来计算机器人的运动变化。首先通过OpenCV提取和匹配图像特征,再利用匹配结果求解机器人的旋转和平移,最终实现对机器人运动状态的精确估计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SLAM是由“定位”(Localization)和“建图”(Mapping)两部分构成的。现在来看定位问题。要求解机器人的运动,首先要解决这样一个问题:给定了两个图像,如何知道图像的运动关系呢?

假如有两帧数据,目的是求出一个旋转矩阵RR和位移矢量tt这个问题可以用经典的ICP算法求解。其核心是奇异值分解(SVD)。OpenCV中的函数就可以求解此问题,不了解原理细节的话,可以直接使用opencv。那么从这个数学问题上来讲,我们的关键就是要获取一组一一对应的空间点,这可以通过图像的特征匹配来完成


【特征提取】

要在一个图像里提取特征,第一步是计算“关键点”,然后,针对这些关键点周围的像素,计算其“描述子”。在OpenCV中,分别由cv::FeatureDetector和cv::DescriptorExtractor来计算。在 keypoint 上计算描述子。描述子是一个cv::Mat的矩阵结构,它的每一行代表一个对应于Keypoint的特征向量。当两个keypoint的描述子越相似,说明这两个关键点也就越相似。我们正是通过这种相似性来检测图像之间的运动的。

【特征匹配】

  我们对上述的描述子进行匹配。在OpenCV中,你需要选择一个匹配算法,例如粗暴式(bruteforce),近似最近邻(Fast Library for Approximate Nearest Neighbour, FLANN)等等。这里我们构建一个FLANN的匹配算法

有了匹配后,可以用drawMatch函数画出匹配的结果:

 

 

 

 

 

 

 

 

 

  不管如何说,仅靠描述子的匹配似乎是太多了些,把许多不相似的东西也匹配起来了。(由于这两个图像只有水平旋转,所以水平的匹配线才是对的,其他的都是误匹配)。因此,需要筛选一下这些匹配,例如,把distance太大的给去掉(源文件69到88行)。

  筛选的准则是:去掉大于最小距离四倍的匹配,是高人的经验值

 

 

 

 

 

 

 

 

 

 

 

  筛选之后,匹配就少了许多了,图像看起来也比较干净。

求解PnP

  求解PnP的核心是调用OpenCV里的SolvePnPRansac函数。该函数的接口如下(来自OpenCV在线API):

  可以看到,这个函数需要输入一组匹配好的三维点: objectPoints 和一组二维图像点: imagePoints. 返回的结果是旋转向量 rvec 和平移向量tvec。其他的都是算法中的参数。因此,我们需要想办法构建这两组输入点,它们实际上就是从goodmatches里抽取来的。

  由于我们已经提取了KeyPoint,知道了它们的像素坐标。那么,利用上一节提供的库函数,就可以直接转到三维点啦。

求解完成后,rvec和tvec就含有了位移和旋转的信息,至此,我们已经成功地计算出两个图像的运动啦!


转载http://www.cnblogs.com/gaoxiang12/p/4659805.html

### 关于SLAM学习教程与入门指南 对于希望深入理解并掌握SLAM技术的人来说,存在多种途径可以获取高质量的学习资料和支持。下面是一些建议: #### 利用开源项目作为学习起点 一个非常有价值的资源来自于名为《自己动手做一台SLAM导航机器人》的项目指南[^1]。此文档不仅提供了详细的理论讲解和技术实现细节,还包含了具体的实例操作说明,帮助读者逐步建立起自己的SLAM实验环境。 #### 探索专门针对SLAM的技术社区和工具集 slam-tricks是一个被广泛推荐的知识库,适合各个层次的研究人员和技术爱好者使用[^2]。这里汇聚了大量的实战经验和技巧分享,能够加速个人技能的成长过程。 #### 针对特定主题的在线课程 如果倾向于结构化的教学方式,则可以选择参加一些专业的培训计划。例如,“具身智能”系列课程就非常适合那些渴望全面了解包括但不限于SLAM在内的前沿科技的人士[^4]。这些课程通常会提供系统的知识点覆盖,并配有讲师指导下的实操环节。 #### 实践案例分析 为了更好地理解和应用所学知识,可以通过具体应用场景加深印象。比如,在点云数据处理方面,Point Cloud Library (PCL) 提供了一套完整的解决方案框架,涵盖了从输入输出到可视化等多个重要步骤[^5]。熟悉这类实用型软件包有助于提高解决实际问题的能力。 ```python import pcl cloud = pcl.load_XYZRGB('test_pcd.ply') # 加载点云文件 filter_voxel_grid = cloud.make_voxel_grid_filter() filter_voxel_grid.set_leaf_size(0.05, 0.05, 0.05) filtered_cloud = filter_voxel_grid.filter() # 对点云进行体素化降采样过滤 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值