连载文章,长期更新,欢迎关注:
每当说起雷达,很多人可能想到的就是军事领域探测敌机那种庞然大物。其实,雷达是指利用探测介质探测物体距离的设备,比如无线电测距雷达、激光测距雷达、超声波测距雷达等,如图4-35所示。由于激光具有很好的抗干扰性和直线传播特性,因此激光测距具有很高的精度。基于激光测距原理的激光雷达,测距精度往往可以达到厘米级或毫米级,广泛应用于机器人导航避障、无人驾驶汽车、环境结构建模、安防、智能交互等领域。
激光雷达测距方式主要是三角测距和TOF(Time of Fly,飞行时间)测距两种,三角测距实现起来简单,TOF测距精度高。激光探头需要旋转起来,形成对更广泛范围的扫描探测。根据激光探头发出激光束的数量,可以分为单线激光雷达和多线激光雷达。还有一些不常规的激光雷达,比如固态激光雷达、单线多自由度旋转激光雷达、面激光束雷达等。在将激光雷达应用到我们的机器人项目中时,需要根据应用场景选择合适型号的激光雷达。在软件层面上,通常是在上位机电脑上运行ROS驱动程序获取雷扫描数据,对扫描数据做滤波等必要的数据处理,最后扫描数据就交给上层的建图、避障、导航等算法做运算。激光雷达数据与轮式里程计、IMU、视觉等进行多传感器融合,往往可以实现更好的效果。

图4-35 常见雷达种类
从测距和扫描两方面来讨论激光雷达原理,测距原理介绍三角测距和TOF测距两种方法,扫描原理介绍单线激光雷达、多线激光雷达等。
1.测距原理
(1)三角测距
三角测距如图4-36所示,激光器发射一束激光,被物体A反射后,照射到图像传感器的A’位置,这样就形成了一个三角形,通过解算可以求出物体A到激光器的距离。激光束被不同距离的物体反射后,形成不同的三角形。我们不难发现随物体距离不断变远,反射激光在图像传感器上的位置变化会越来越小,也就是越来越难以分辨。这正是三角测距的一大缺点,物体距离越远,测距误差越大。

图4-36 三角测距
(2)TOF测距
TOF测距如图4-37所示,激光器发出激光时,计时器开始计时,接收器接收到反射回来的激光时,计时器停止计时,得到激光传播的时间后,通过光速一定这个条件,很容易计算出激光器到障碍物的距离。由于光速传播太快了,要获取精确的传播时间太难了。所以这种激光雷达自然而然成本也会高很多,但是测距精度很高。

图4-37 TOF测距
2.扫描原理
上面介绍测距原理时,只是单个的激光器,也就是说只能扫描单个点,这个装置也叫单线激光测距模组。激光雷达中,将单线激光测距模组安装到旋转机构中,就能对环境进行多点扫描。激光雷达中的旋转机构需要考虑的关键问题是通信与供电问题,这也直接决定了激光雷达的性能和寿命。因为激光测距模组处于旋转状态,所以模组不能直接用导线与底座连接,行业内一般用滑环或光磁耦合实现连接。滑环是机械式的触点,旋转过程中触点始终保持接触,实现电路的连接导通,缺点是使用久了会磨损,机械触点也导致旋转过程发出很多噪音。光磁耦合不需要接触式的连接,模组与底座通过电磁感应进行电能输送,模组和底座有一一对应的发光二极管接收管用于光通信,当然这种连接方案成本会更高。

图4-38 测距模组旋转机构
(1)单线激光雷达
单线激光模组和旋转机构就构成了单线激光雷达,单线激光雷扫描点通常处在同一平面上的360度范围,因此也叫2D激光雷达。其扫描点,如图4-39所示。

图4-39 单线激光雷达扫描点
(2)多线激光雷达
单线激光雷达只能扫描同一平面上的障碍信息,也就是环境的摸一个横截面的轮廓,这样扫描数据信息很有限。在垂直方向同时发射多束激光,再结合旋转机构,就能扫描多个横截面的轮廓,这就会多线激光雷达,也叫3D激光雷达。其扫描点,如图4-40所示。

图4-40 多线激光雷达扫描点
(3)其他激光雷达
除了上面常见的单线激光雷达和多线激光雷达,还有一些特殊的激光雷达,比如固态激光雷达、单线多自由度旋转激光雷达、面激光束雷达等,如图4-41所示。

图4-41 其他激光雷达
主流的激光雷达,都是激光模组和旋转机构两部分,存在雷达体积大、旋转噪声大、寿命短等问题。固态激光雷达的扫描不需要机械旋转部件,而是用微机电系统、光学相控阵、脉冲成像等技术替代。固态激光雷达的优点是结构简单、体积小、扫描精度高、扫描速度快等,缺点是扫描角度有限、核心部件加工难道大、生产昂贵等。
单线激光雷达能够扫描一个截面上的障碍点信息,如果将单线激光雷达安装到云台上,单线激光雷达原来的扫描平面在云台旋转带动下就能扫描三维空间的障碍点信息,这就是单线多自由度旋转激光雷达。由于激光模组在多自由度下旋转扫描,同一帧中的扫描点存在时间不同步的问题。在激光测距模组本身的测距频率一定的条件下,多轴旋转使得扫描点的空间分布变得更加稀疏。
更多线激光雷达类似,可以用一字激光束扫描,然后加旋转机构,就可以扫描三维空间的障碍点信息,这就是面激光束雷达。多线激光雷达可以看成面束激光的离散形式,经障碍物反射回来的成像图案也是离散形式,离散出来的多个激光束更稳定更易于分辨。而面束激光扫描点更稠密,包含的障碍信息更多,不过稳定性会差一些。
(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)
选择合适的雷达安装到自己的机器人上之后,运行雷达厂家提供的ROS驱动程序,就可以通过ROS获取雷达的数据了。有时候雷达数据会受到一些干扰,需要经过一些简单的滤波。由于雷达是通过旋转进行扫描,所以扫描数据点会受机器人自身移动而产生偏差,这就是要讨论的时间同步问题。
1.上位机ROS驱动程序
(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)
2.扫描点处理
(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)
3.扫描点的时间同步
(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)
Gitee下载(国内访问速度快):gitee.com/xiihoo-robot/Books_Robot_SLAM_Navigation
【1】 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject
我需要使用ActiveMerchant库在我们的一个Rails应用程序中设置支付解决方案。尽管这个问题非常主观,但人们对主要网关(BrainTree、Authorize.net等)的体验如何?它必须:处理定期付款。有能力记入个人帐户。能够取消付款。有办法存储用户的付款详细信息(例如Authotize.netsCIM)。干杯 最佳答案 ActiveMerchant很棒,但在过去一年左右的时间里,我在使用它时发现了一些问题。首先,虽然某些网关可能会得到“支持”——但并非所有功能都包含在内。查看功能矩阵以确保完全支持您选择的网关-http
我有一个Rails应用程序,我正在尝试使用acts_as_list插件设置可排序列表。数据库中的位置字段正在更新,但是在呈现页面时,不考虑顺序。我想我是在寻求帮助。这是我的模型...classQuestionMembership:question_membershipsendclassQuestion:question_membershipsacts_as_listend还有给我列表的草率View代码...>true)%>拖放用于重新排序。数据库中QuestionMembership对象的位置值更新,页面实际上正确显示重新排序。问题是在页面重新加载时,它默认返回到它感觉的任何顺序。我认
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s