首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从零开始搭二维激光SLAM — 前言[通俗易懂]

从零开始搭二维激光SLAM — 前言[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-09-23 03:17:32
发布于 2022-09-23 03:17:32
1.1K0
举报

大家好,又见面了,我是你们的朋友全栈君。

我眼中的SLAM

从最开始接触SLAM已经3年了,从二维激光SLAM到三维激光SLAM,再到视觉SLAM,都有一些接触,现将简单梳理一下SLAM的各个模块的功能以及实现方式,为本系列文章起到个总领作用。

1 SLAM是什么

SLAM(simultaneous localization and mapping)的中文翻译为 同步定位与地图构建。目的有2个,一个是进行定位,一个是进行周围环境的地图的构建,二者相互依赖,只有同时进行求解才能够解决这个问题。

为什么一定要同时进行求解呢?

人通过眼睛,通过手部等肢体的触摸进行感知,从而了解周围的环境,人的大脑自动的为周围环境进行了模型搭建(地图构建),所以人可以做到闭着眼睛通过感觉拿到水杯等物体。同时,人可以通过眼睛的感知,知道自己的手处于水杯的前方(定位),通过再向前伸手就可以碰到水杯,所以,当人看着水杯的时候,几乎所有人都可以准确的拿到水杯。

机器人想要屋子里进行导航,也是同样的道理。首先通过激光雷达,摄像头等传感器确定了周围环境的地图(地图构建),当机器人向前走了1米,这时候再将周围的环境建成地图,而且要将地图准确地放到之前建的地图的相应位置处(定位)。

定位,是通过将当前传感器感知到的环境信息与构建好的环境地图进行匹配,确定机器人在当前地图中的位置,只有地图准确了,定位才能够准确。

地图构建,通过将当前传感器感知到的环境信息构建成地图,这时的地图是要放到机器人当前位置处的,所以只有定位准确了,构建的地图才能够与真实环境相符合。

所以定位与地图构建,二者相互依赖,必须要同时进行求解才能构建好地图。

2 SLAM的目的或应用是什么

个人认为SLAM最大的应用就是建图,通过SLAM的处理,获得一个能够在之后继续使用的地图。而由于SLAM本身包含了定位,当不保存地图的时候,SLAM也可以当成个定位算法来用。

  • 二维激光SLAM构建的二维栅格地图,可以用来做机器人的定位与导航。
  • 三维激光SLAM构建的三维点云地图,可以用来做无人车的定位与导航,也可以用来做三维建模。
  • 视觉SLAM构建的稀疏点云地图,可以用来做定位。
  • 视觉SLAM构建的半稠密与稠密的点云地图,可以用来做定位与导航,也可以用来做VR领域的交互场景,也可以用来做三维建模。

上图为二维激光SLAM构建的二维栅格地图

上图为三维激光SLAM构建的三维点云地图

上图为视觉SLAM(ORB-SLAM2)构建的稀疏点云地图

上图为视觉SLAM构建稠密点云地图

3 SLAM的三个模块

众所周知,目前阶段,SLAM的框架大体上已经固定了,分为前端里程计模块,后端优化模块,以及回环检测模块。

接下来,我将简要介绍这三个模块的功能,以及实现每个模块的方法。

3.1 前端里程计

3.1.1 什么是前端里程计

机器人的轮子上有种叫做编码器的传感器,用于测量轮子具体走了多远。前端里程计也是同样的目的,就是为了测量机器人从开始后到现在到底走了多远,与初始位置处的相对距离和相对姿态(位姿)。

3.1.2 怎么实现呢

对于激光SLAM来说,激光雷达的频率一般是10Hz-40Hz之间。我只要确定第一帧雷达数据与第二帧雷达数据的时间间隔内,机器人走了多远,再确定第二帧到第三帧雷达数据的时间间隔内,机器人走了多远(位姿变换),依次类推,我们就可以一直确定机器人到底走了多远,确定机器人当前的位姿与初始时刻的相对位姿。

对于视觉SLAM来说,摄像头的数据是一帧一帧的图像,可能是RGB彩色图像,也可能是彩色图像加上深度图像。一般的处理方法为在图像中提取特征点,然后确定特征点在空间中的坐标值,通过这些特征点,确定机器人在2帧图像间的位姿变换,再确定第二帧图像与第三帧图像间的位姿变换,依次类推,就可以确定了机器人当前的位姿与初始时刻的相对位姿。

上述过程确定了机器人相对于初始时刻以及相对于每帧数据到来时的位姿变换,这个过程就是定位的过程。

3.1.3 具体实现方法

对于激光SLAM来说,求从前一帧雷达数据到当前帧雷达数据间的位姿变换,一般将这个过程称为 扫描匹配(scan-matching) 过程。scan就是雷达的数据,通过与前一帧数据进行匹配,从而确定处位姿变换。

目前的扫描匹配方法为:

  • scan-to-scan:雷达数据与雷达数据进行匹配
  • scan-to-map:雷达数据与地图进行匹配
  • scan-to-submap:雷达数据与子地图进行匹配
  • map-to-map:地图与地图进行匹配

对于视觉SLAM来说,求从前一帧图像到当前帧图像间的位姿变换,一般将这个过程称为 BA(Bundle Adjustment),求解BA的方法有很多,由于目前我对视觉SLAM了解不多,不在这里进行更多的说明。

3.2 后端优化

3.2.1 为什么需要后端优化

不管是使用编码器得到的里程计,还是前端计算出来的里程计,都不是完全准确的。

即使选用的编码器十分精确,当轮子在光滑的地面上出现打滑时(数据比实际值偏大)或者在轮子路过了一个坑或者土包时,都会导致里程计的测量值与实际值不匹配。

同样的,由于所有传感器都是存在误差的,我们通过前端里程计计算出来的里程计数值也一定是存在误差的,而且这个误差将随着时间的增长而不断增大。

这将导致机器人的位置与实际的位置相差的越来越大,最终导致机器人的位置与真实的位置不符,不能构建很好的地图。

3.2.2 什么是后端优化

由于前端里程计会有累计误差,那有没有一种方法可以将这种累计误差减小甚至消除掉呢?

这就是后端优化的作用,通过图结构,将机器人的各个位姿以及生成的地图数据,进行联合优化,通过优化求解,将所有的误差平均分散到每个机器人位姿以及每个地图数据上去,当我的优化过程十分完美的时候,这些累计误差可以减小到可以忽略的地步。

对于激光SLAM与视觉SLAM,他们的后端优化过程都是差不多的,都是通过图结构来减小误差,只不过由于传感器的数据类型不同,具体的实现方法也不完全相同。

3.3 回环检测

我们可以通过后端优化来减小位姿,那么,有没有一种比较强的约束来对优化的方程进行约束呢?

答案肯定是存在的,那就是回环检测

当我们人类从公园的东门出发,转了10分钟之后再回到东门,我们可以轻而易举的分辨出这就是之前我来过的地点,和之前的东门是同一个东门。

但是,对于机器人而言,同样从东门出发,走了10分钟。由于机器人的位姿是通过逐步累加得到的,这样的计算存在累计误差,当机器人再次回到东门时,有可能机器人认为自己还和东门差距20米。这20米就是机器人由于长时间定位产生的偏差。

我们可以通过某种手段,将当前传感器感知的环境信息,与机器人之前构建的地图相对比,如果匹配程度很高,则我们认为,机器人到了一个之前去过的地方,那么当前的位置应该与之前路过这个位置时相距不会太远(约束)。

我们可以将这个约束,输入到后端优化过程中,当做一个新的并且十分强烈的约束,通过这个强烈的约束,当我们进行优化完成后,能够大幅度的进行误差的消除。

4 SLAM的发展

4.1 高精确度地图

这是目前学术研究的重点,很多的工作量都是为了如何构建更准确,更精确的地图。

4.2 长期环境下的建图

人们接触的环境从来没有一成不变的,但是我们每次进行SLAM保存的地图都是不会再变换的,如何在不占资源的情况下,一边运行着导航任务,一边将之前的地图进行更新,也是一个研究重点。目前已经有几家公司可以做到。

4.3 减小计算量

目前的各个SLAM算法都有着不小的计算量,如果要是能够实时运行稠密地图的构建,那么将会把VR领域抬到一个新的高峰。这也是我一直关注这VR领域的原因。

4.4 语义SLAM

人们可以通过眼睛来感知环境的同时,识别出能看到的物体的名字与种类。语义SLAM同样可以做到这样,具有语义标签的环境地图将会对导航产生更大的帮助。

4.5 感知代替SLAM

当机器人的理解能力逐步提升,我们就不需要再去单纯地构建地图,机器人所见即可为一个地图,像人一样的感知周围环境,即可确定自身位置,这就不再需要去保存地图。

总结

本文将我自己理解的激光SLAM与视觉SLAM进行简单说明,由于认知有限,如有错误请见谅,并于评论中告知,十分感谢。

下篇文章将简要介绍本系列文章写的主要方向与要实现的功能。


文章将在 公众号: 从零开始搭SLAM 进行同步更新,欢迎大家关注。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172366.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
selenium源码通读·8 |webdriver/common/keys.py-Keys类分析
1 源码路径selenium/webdriver/common/keys.py图片2 功能描述模拟键盘的输入;源码如下:class Keys(object): """ Set of special keys codes. """ NULL = '\ue000' CANCEL = '\ue001' # ^break HELP = '\ue002' BACKSPACE = '\ue003' BACK_SPACE = BACKSPACE TAB = '\ue
虫无涯
2023/02/09
2560
selenium源码通读·7 |webdriver/common/by.py-By类分析
1 源码路径selenium/webdriver/common/by.py图片2 功能描述翻译:一组受支持的定位器策略,即支持的定位方式定位方式包含八种:class By(object): """ Set of supported locator strategies. """ ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NA
虫无涯
2023/02/09
3190
Selenium4+Python3系列(八) - Cookie、截图、单选框及复选框处理、富文本框、日历控件操作
我所在的城市昨天出了近20+的阳性案例,但这丝毫没有 影响 到996的工作时间,当然,也没有影响到我想继续更新文章的决心。
软件测试君
2022/12/05
2.7K0
Selenium4+Python3系列(八) - Cookie、截图、单选框及复选框处理、富文本框、日历控件操作
大模型开发实战:(一)使用 Selenium 进行网页爬虫
Selenium 由 Jason Huggins 于 2004 年发起,最初名为 JavaScript Testing Framework,后因受到希腊神话中“月亮女神 Selene”的启发而更名为 Selenium。它最初是为了解决网页自动化测试需求而诞生的开源工具,但因其能模拟真实浏览器操作(如点击、输入、滚动等),也被广泛用于网页数据爬取。爬虫工具有很多,例如 BeautifulSoup4,为什么选择自动化测试工具 Selenium 进行爬虫?目前绝大部分 Web 应用都使用 JavaScrip 动态加载数据,而 BeautifulSoup4 只能解析初始页面的 HTML 源码,对于动态加载的数据无法获取,因此使用 Selenium 模拟用户,完成数据加载的操作。
张高兴
2025/05/21
1.5K0
大模型开发实战:(一)使用 Selenium 进行网页爬虫
Python爬虫利器Selenium从入门到进阶
selenium是最广泛使用的开源Web UI自动化测试套件之一,它所支持的语言包括C++、Java、Perl、PHP、Python和Ruby,在数据抓取方面也是一把利器,能够解决大部分网页的反爬措施,当然它也并非是万能的,一个比较明显的一点就在于是它速度比较慢,如果每天数据采集的量并不是很高,倒是可以使用这个框架。
用户6888863
2021/12/10
1.9K0
Python爬虫利器Selenium从入门到进阶
Python爬虫(二十一)_Selenium与PhantomJS
本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据,更多内容请参考:Python学习指南 Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动化操作,不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。 Selenium可以根据我们的指令,让浏览器自动加载页面,获取需要的页面,甚至页面截屏,或
用户1174963
2018/01/17
3K0
Python爬虫(二十一)_Selenium与PhantomJS
使用Selenium自动化操作浏览器
Selenium可以自动化操作浏览器,例如:选择元素,输入,点击等,可以用于软件自动化测试,爬虫等工作,也可以做你想做的任何事情。
YaoQi
2025/07/14
3812
使用Selenium自动化操作浏览器
selenium的键盘事件
在测试中,鼠标事件是很常见的,如双击等,鼠标事件需要导入fromselenium.webdriver.common.action_chains import ActionChains
无涯WuYa
2018/10/25
2.2K0
selenium的键盘事件
selenium源码通读·5 |webdriver/common/action_chains.py-ActionChains类分析
1 源码路径selenum/webdriver/common/action_chains.py图片2 功能描述提供鼠标操作,模拟用户的鼠标行为;如鼠标的各种单击、双击、滑动、拖拽等操作。3 使用方法源码说的很清晰了,只要使用以下的方法即可: ActionChains can be used in a chain pattern:: menu = driver.find_element_by_css_selector(".nav") hidden_submenu = driver
虫无涯
2023/02/08
6020
[Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、鼠标操作)
Selenium是一款用于测试Web应用程序的经典工具,它直接运行在浏览器中,仿佛真正的用户在操作浏览器一样,主要用于网站自动化测试、网站模拟登陆、自动操作键盘和鼠标、测试浏览器兼容性、测试网站功能等,同时也可以用来制作简易的网络爬虫。
Eastmount
2021/12/02
5.6K0
[Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、鼠标操作)
爬虫杀手锏-PhantomJS(附案列网站模拟登录豆瓣网)
Selenium: 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。
一墨编程学习
2018/12/14
1.5K0
自动化-Selenium 3-常用API(Python版)
ActionChains类提供的鼠标事件常用方法(perform()执行所有ActionChains中存储的行为):
wangmcn
2022/07/22
1.6K0
自动化-Selenium 3-常用API(Python版)
知否知否-----selenium知多少
关于selenium,就不多介绍什么了,主要就是用来进行自动化的工具。怎样进行自动化,这才是它大放异彩的地方。下面就来看看吧!
我被狗咬了
2019/09/23
6540
知否知否-----selenium知多少
【Python爬虫实战】深入解析 Selenium:从元素定位到节点交互的完整自动化指南
Selenium 是进行网页自动化操作的强大工具,在测试、数据抓取、用户行为模拟等领域广泛应用。本指南将带您详细了解如何在 Selenium 中查找和定位页面元素,并深入介绍各种节点交互方法,包括点击、输入文本、选择选项等操作。无论您是初学者还是经验丰富的开发者,本篇文章将帮助您掌握 Selenium 自动化的核心技能,实现更高效的网页自动化操作。
易辰君
2024/11/07
1.8K0
Selenium常见元素定位方法和操作的学习介绍
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
菲宇
2019/10/22
2.5K0
python selenium定位元素
查找元素: find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector 查找多个元素: find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector
用户5760343
2022/05/13
2K0
《手把手教你》系列练习篇之7-python+ selenium自动化测试 -压轴篇(详细教程)
  “压轴”原本是戏曲名词,指一场折子戏演出的倒数第二个剧目。在现代社会中有很多应用,比如“压轴戏”,但压轴也是人们知识的一个盲区。“压轴”本意是指倒数第二个节目,而不是人们常说的倒数第一个,倒数第一个节目称“压台”。想看“压台篇”,敬请关注宏哥
北京-宏哥
2019/12/10
1.5K0
《手把手教你》系列练习篇之7-python+ selenium自动化测试 -压轴篇(详细教程)
Python Selenium库的使用「建议收藏」
Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。
全栈程序员站长
2022/07/29
4.8K0
Python Selenium库的使用「建议收藏」
《手把手教你》系列练习篇之6-python+ selenium自动化测试(详细教程)
  前面文章我们了解了如何获取元素的text属性值,和判断元素是否显示在页面(is_displayed()方法),本文我们来学习下,判断一个控件是否被选中状态、获取页面元素的大小、组合键-全选文字、组合键-退格键删除文本和鼠标右键等练习的内容。
北京-宏哥
2019/12/10
1.4K0
《手把手教你》系列练习篇之6-python+ selenium自动化测试(详细教程)
selenium 模拟键盘事件 复制粘贴、右键、回车等
#coding=utf-8 ''' selenium ''' from selenium import webdriver as wd import time bc=wd.Chrome(executable_path='f:\\chromedriver') #bc=wd.Ie(executable_path='f:\\IEDriverServer') bc.get('https://www.sogou.com') #模拟键盘事件 from selenium.webdriver.common.keys im
用户8449980
2021/07/11
2.4K0
推荐阅读
相关推荐
selenium源码通读·8 |webdriver/common/keys.py-Keys类分析
更多 >
LV.1
吉瑞德商PHP 研发
目录
  • 我眼中的SLAM
    • 1 SLAM是什么
      • 为什么一定要同时进行求解呢?
    • 2 SLAM的目的或应用是什么
    • 3 SLAM的三个模块
      • 3.1 前端里程计
      • 3.2 后端优化
      • 3.3 回环检测
    • 4 SLAM的发展
      • 4.1 高精确度地图
      • 4.2 长期环境下的建图
      • 4.3 减小计算量
      • 4.4 语义SLAM
      • 4.5 感知代替SLAM
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档