激光雷达(LDS)技术原理解释及实现过程

一、激光雷达(LDS)简介
1.激光雷达应用举例: 现在自主移动机器人领域非常火爆,无人车、无人飞机、水下机器人、仓储机器人、扫地机等应用层出不穷。激光雷达传感器是地面移动机器人的标配,一些空中机器人也必须使用激光雷达。
2.国内市面上激光雷达举例: 乐行天下(Inmotion)的激光雷达IMLidar,官方网址是 http://robot.imscv.com/ 。其性能稳定可靠,国内前列。具体数据见下图。


图1.1 产品图

图1.2 雷达参数
二、测距模组原理分析及设计
1.三角测距原理
三角测距测量模型如下图。


图2.1 三角测距模型
从测距模型,根据相似三角形原理,我们可知,

其中,q为实测距离,s为激光头与镜头的距离,f为镜头的焦距,x与s对应;x该变量假设了角 度β是一个常量。
角度β和q的关系如下,

对函数(1) 求导,可得,
2.测距模块设计
测距模块的设计需要考虑多种因素。
我们测距模块设计的评价函数(标准)是:系统分辨率、测距的最小值和最大值。
评价函数对应的关键可控变量有:镜头焦距(图2.1中的f)、测距模块机械尺寸(图2.1中的s)、激光头中轴线与镜头中轴线夹角(图2.1中角度β的余角);除了关键变量外,还有比如镜头视场角、透光率、光圈,感光芯片的尺寸、分辨率等等。
先介绍一个概念,系统分辨率:一个像素的平移,对应的实测距离变化量。
由公式(3)可知, 当dx为一个像素大小时,dq就是系统分辨率,即系统分辨率 r = -k*q*q/(fs)。
下图中,绿色的线代表系统分辨率,蓝色的线代表最小测量距离,即盲区。

图2.2 系统分辨率与测距函数
图中的曲线对应的感光芯片的参数是:752个像素,每个像素6微米。
我们期望最小测距不大于20cm,那么f*s就得不大于900;系统分辨率在6m处不大于30cm,那么 f*s就得大于700;因此我们选择了 f*s = 800。考虑到镜头焦距的标准情况,以及激光雷达尺寸不能太大,我们选择f = 16mm,s = 50mm。
至于夹角β,取决于感光芯片的尺寸和分辨率,即


图2.3 IMLidar测距模块
三、测距模组工程实现
1.模组校准
测距模组的主要误差来源是系统分辨率和校准误差。
校准的目的是把实际模组尽可能匹配理想模型。见图2.3,激光头的指向角度、镜头的指向角度、镜头畸变都是需要调整的关键部分。其中,激光头和镜头可由机械装置调节达到理想位置。对于镜头的畸变,我们分两步处理:a、定位激光点的成像像素到亚像素级别。b、对于不同的实测距离,我们进行相应的距离补偿,适配曲线 1/x (详见公式(1))。

图3.1 校准曲线

图3.2 校准误差与测量距离的函数
从图3.2可知,测量距离越远,误差就越大。
以上讲到的校准方法是基于一个基本前提:热应力和机械振动都比较小。
实际实现过程中,热应力和机械振动都不可忽视。我们设计的时候需要选择刚性比较好、热应力影响小的材料。
2.测距算法
我们知道,光斑的能量分布可近似为一个高斯模型。因此,为了减小误差,我们选择灰度质心法来估算光斑成像点的像素位置。

以下是使用了该算法的测距效果:STD

图3.3 REVO测距效果

3.环境光干扰

我们使用了650nm的红激光做实验。选择激光的时候需要考虑:
a、对人眼的危害情况。b、测距信噪比。c、对环境光的抗干扰能力。
我们对IMLidar做了实测。IMLidar的激光安全等级是class-I。激光的功率越大,测距的信噪比就越高(有上限)。直视太阳光,IMLidar失效;但在非直视太阳光的室外、普通室内的环境下,环境光对测距效果没影响。
对于环境光的影响,我们通常采用两种方式处理,一是时间滤波,二是窄带滤波。

图3.4 激光功率
上图体现了激光脉宽与最大允许光强的关系。选择参数是一个博弈的结果,需要多方面权衡利弊。
4. 硬件逻辑
激光雷达的工作流程是:
a、发射激光,同时感光芯片曝光。
b、读取像素数据。
c、计算出像素的中心(质心)位置。
d、把c中的计算结果(像素位置)换算成距离信息。

硬件的逻辑详见下图:

图3.5 LDS硬件逻辑
5.测距性能
REVO测距性能情况如下:10%反射率和90%反射率的条件下的测距效果。


图3.6 REVO测距性能
针对IMLidar,我们测试发现它稳定工作后,误差可保持在测量距离的1%以内。

四、激光雷达扫描工程实现
1. 雷达旋转扫描
我们定义雷达测距的参考点为雷达的旋转中心。


图4.1 雷达旋转
由图4.1,我们可知:

也就是说,雷达旋转起来后,测距的参考点与原来不转的测距模组的参考点不同。因此,我们需要对测距数据做一个公式(6)的换算处理。 2. 角度与测距同步
激光雷达传感器对外提供的数据是距离和角度信息,也就是一个极坐标信息。
角度获取与测距需要同步,才能反映环境信息。
3. 寿命问题
以前的低成本激光雷达都采用滑环的方式给旋转体供电和通信。滑环的寿命比较短,只有大概 1000个小时,因此导致整个雷达的寿命受到影响。IMLidar采用无线供电方式,因此寿命会比较长。具 体数据难以实测。
4. 实测表现
下面是REVO的实测结果。IMLidar的性能实测更好。

图4.2 雷达实测
五、总结
文章主要参考了ICRA上的一篇论文“A Low-Cost Laser Distance Sensor”。
IMLidar的核心设计思想估计也是如此。从原理模型设计到消费级产品,这个过程非常艰难,但相信也很有意思。
作者:李少海。联系方式:QQ395217658。




前言: 说起来,该3D激光扫描测距仪(3D激光雷达)就核心设计原理来而言,应该在激光键盘(https://www.cirmall.com/circuit/2978/detail?3)设计项目之后。现在给大伙讲讲3D扫描测距仪的相关原理和制作细节。请耐心读完,方可吸收其中的精华。 在开始介绍原理前,先给出一些扫描得到的3D模型以及演示视频,给大家一个直观的认识 扫描得到的房间一角: 扫描的我 扫描仪实物 激光三角测距原理这里统一列出他们的参数: 摄像头:VGA画质的USB摄像头,30fps (市面普遍可以购买的型号)。非广角 激光器:50mW 红外一字线激光 808nm 滤光片:10mm直径红外低通滤光片 舵机:HS-322hd 43g标准舵机 本文结构简单介绍了激光雷达产品的现状 : 线状激光进行截面测距原理 3D激光扫描仪的制作考虑 参考文献 简介-激光扫描仪/雷达: 这里所说的激光扫描测距仪的实质就是3D激光雷达。如上面视频中展现的那样,扫描仪可以获取各转角情况下目标物体扫描截面到扫描仪的距离,由于这类数据在可视化后看起来像是由很多小点组成的云团,因此常被称之为:点云(Point Clould)。在获得扫描的点云后,可以在计算机中重现扫描物体/场景的三维信息。 这类设备往往用于如下几个方面: 机器人定位导航 目前机器人的SLAM算法中最理想的设备仍旧是激光雷达(虽然目前可以使用kinect,但他无法再室外使用且精度相对较低)。机器人通过激光扫描得到的所处环境的2D/3D点云,从而可以进行诸如SLAM等定位算法。确定自身在环境当中的位置以及同时创建出所处环境的地图。这也是我制作他的主要目 的之一。 零部件和物体的3D模型重建 地图测绘 现状: 目前市面上单点的激光测距仪已经比较常见,并且价格也相对低廉。但是它只能测量目标上特定点的距离。当然,如果将这类测距仪安装在一个旋转平台上,旋转扫描一周,就变成了2D激光雷达 (LIDAR)。相比激光测距仪,市面上激光雷达产品的价格就要高许多: Hokuyo 2D激光雷达截图: 上图为Hokuyo这家公司生产的2D激光雷达产品,这类产品的售价都是上万元的水平。其昂贵的原因之一在于他们往往采用了高速的光学振镜进行大角度范围(180-270)的激光扫描,并且测距使用了计算发射/反射激光束相位差的手段进行。当然他们的性能也是很强的,一般扫描的频率都在10Hz以上,精度也在几个毫米的级别。 2D激光雷达使用单束点状激光进行扫描,因此只能采集一个截面的距离信息。如果要测量3D的数据 ,就需要使用如下2种方式进行扩充: 采用线状激光器 使用一个2D激光雷达扫描,同时在另一个轴进行旋转。从而扫描出3D信息。 说明: 第一种方式是改变激光器的输出模式,由原先的一个点变成一条线型光。扫描仪通过测量这束线型光在待测目标物体上的反射从而一次性获得一个扫描截面的数据。这样做的好处是扫描速度可以很快 ,精度也比较高。但缺点是由于激光变成了一条线段,其亮度(强度)将随着距离大幅衰减,因此测距范围很有限。对于近距离(<10m)的测距扫描而言,这种方式还是很有效并且极具性价比的,本文介绍的激光雷达也使用这种方式, 对于第二种方式,优点是可以很容易用2D激光雷达进行改造,相对第一种做法来说,他在相同的激光器输出功率下扫描距离更远。当然,由于需要控制额外自由度的转轴,其误差可能较大,同时扫描速度也略低。 这类激光雷达产品目前在各类实验室、工业应用场景中出现的比较多,但对于个人爱好着或者家用 设备中,他们的价格实在是太高了。当然,目前也有了一个替代方案,那就是kinect,不过他的成像 分辨率和测距精度相比激光雷达而言低了不少,同时无法在室外使用。 低成本的方案 造成激光雷达设备高成本的因素为 使用测量激光相位差/传播时间差测距 高速振镜的高成本 矫正算法和矫正人工成本 对于个人DIY而言,第三个因素可以排除,所谓知识就是力量这里就能体现了:-) 对于前2个因素,如果要实现完全一样的精度和性能,那恐怕成本是无法降低的。但是,如果我们对精度、性能要求稍 微降低,那么成本将可以大幅的下降。 首先要明确的是投入的物料成本与能达成的性能之间并非线型比例的关系,当对性能要求下降到一 定水平后,成本将大幅下降。对于第一个因素,可以使用本文将介绍的三角测距方式来进行。而对于 扫锚用振镜,则可以使用普通的电机机构驱动激光器来替代。 本文介绍的低成本3D激光扫描仪实现了如下的成本/性能: 成本:~¥150 测量范围:最远6m 测量精度:(测量距离与实际距离的误差)最远6m出最大80mm误差,近距离(<1m),误差水平在 5mm以内 扫描范围:180度 扫描速度:30 samples/sec (比如以1度角度增量扫描180度,耗时6秒) 对于精
<think> 嗯,用户这次明确询问获取激光雷达坐标数据的具体方法,看起来是个实操性很强的技术需求。结合用户提供的两条引用,第一条是激光雷达原理背景,第二条提到了ROS环境下的C++实现示例,看来用户可能正在搭建机器人或自动驾驶相关系统。 用户的上次提问聚焦在"方法"上,这次继续深挖,说明ta需要可落地的技术方案而非理论科普。从引用[2]看,用户似乎接触过ROS系统,但demo_lidar_data这个示例程序ta可能没完全跑通,或者需要更底层的坐标解析指导。 我需要重点拆解三个层面:硬件接口层(激光雷达原始数据获取)、数据解析层(点云坐标转换)、应用层(ROS等框架下的实现)。特别注意用户提到的是"坐标数据"而非原始信号,意味着ta需要的是已处理的空间三维点(x,y,z)。 硬件接口方面要强调通用性,虽然不同品牌雷达驱动不同,但核心都是通过网络协议或串口获取数据包。数据解析的关键在于坐标系转换,这里必须展开说明雷达坐标系到世界坐标系的转换过程,用户容易卡在这个环节。 ROS实现部分直接给代码片段最实用,但要注意两点:一是区分C++和Python版本(引用[2]是C++,但用户可能也需Python),二是明确说明rviz可视化步骤,很多新手会忽略调试工具。最后补充API文档链接很有必要,用户后续自查时需要。 安全提示不能少,特别是激光雷达的Class级别警告,工业级设备可能对眼睛有害。用户如果是学生研究者可能忽略这个风险。 相关问题设计要延续技术纵深:性能优化针对大数据场景,多传感器融合对应自动驾驶需求,硬件选型则是项目起步阶段的常见困惑。这样覆盖了用户潜在的技术链条。 </think> 以下是获取激光雷达坐标数据的完整方法指南,结合硬件操作与软件开发流程: --- ### **一、基础原理** 激光雷达通过发射激光脉冲并接收反射信号计算距离,结合内部IMU和旋转机构生成三维点云坐标$(x, y, z)$,坐标转换公式: $$ \begin{cases} x = d \cdot \cos\theta \cdot \cos\phi \\ y = d \cdot \cos\theta \cdot \sin\phi \\ z = d \cdot \sin\theta \end{cases} $$ 其中$d$为测量距离,$\theta$为俯仰角,$\phi$为水平方位角[^1]。 --- ### **二、硬件操作步骤** 1. **设备连接** - 通过以太网/USB连接雷达与主机,配置静态IP(如`192.168.1.100`) - 供电需匹配电压(常见12V/24V),峰值功率不超过额定值 2. **启动扫描** - 执行厂商指令(如`lds_start` for Livox雷达) - 验证数据流:`tcpdump -i eth0 port 2368`(Velodyne默认端口) --- ### **三、软件开发流程(以ROS为例)** #### 1. **驱动安装** ```bash sudo apt-get install ros-noetic-velodyne-pointcloud # Velodyne示例 ``` #### 2. **C++数据获取核心代码** ```cpp #include <ros/ros.h> #include <sensor_msgs/PointCloud2.h> void cloudCallback(const sensor_msgs::PointCloud2ConstPtr& input) { // 转换点云数据 pcl::PointCloud<pcl::PointXYZ> raw_cloud; pcl::fromROSMsg(*input, raw_cloud); // 提取坐标 for (const auto& point : raw_cloud.points) { float x = point.x; // 单位:米 float y = point.y; float z = point.z; ROS_INFO("Coordinate: (%.2f, %.2f, %.2f)", x, y, z); } } int main(int argc, char** argv) { ros::init(argc, argv, "lidar_processor"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("/velodyne_points", 1, cloudCallback); ros::spin(); return 0; } ``` #### 3. **Python实现(替代方案)** ```python import rospy from sensor_msgs.msg import PointCloud2 import sensor_msgs.point_cloud2 as pc2 def callback(pointcloud_msg): for point in pc2.read_points(pointcloud_msg, field_names=("x", "y", "z"), skip_nans=True): x, y, z = point[0], point[1], point[2] print(f"World coordinates: ({x:.2f}, {y:.2f}, {z:.2f})") rospy.init_node('lidar_listener') rospy.Subscriber("/scan_3D", PointCloud2, callback) # 根据实际话题名修改 rospy.spin() ``` --- ### **四、关键调试步骤** 1. **坐标系验证** ```bash rosrun tf view_frames # 生成坐标系关系图 ``` ![TF树示例](https://docs.ros.org/en/_images/tf_robot_frames.png) *确保`laser_link`到`base_link`的变换正确[^2]* 2. **实时可视化** ```bash rviz -d $(rospack find velodyne_pointcloud)/velodyne.rviz ``` --- ### **五、常见问题解决** | 问题现象 | 解决方案 | |------------------------|----------------------------| | 无点云数据输出 | 检查防火墙设置,开放UDP 2368端口 | | 坐标值异常(如z轴过大) | 重新标定雷达安装俯仰角 | | 点云稀疏 | 调节雷达扫描频率(配置文件.yaml)| --- ### **六、应用场景数据示例** | 场景 | 典型坐标范围 | 精度要求 | |------------|---------------------|-----------| | 自动驾驶 | x:±50m, y:±20m | ±3cm | | 地形测绘 | z:[-100,1000]m | ±5cm | | 机器人导航 | 360°水平视场角 | ±1° | > ⚠️ **注意**:工业级雷达需防护激光安全(Class 1/Class 4区别),室外使用注意日光干扰 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值