第2章 传感器基础(上):激光雷达原理、点云数据格式、在ROS中驱动与可视化激光雷达
大家好,我是你们的老朋友。今天咱们来聊聊机器人感知系统里最核心的传感器之一——激光雷达。说实话,我入行那会儿,激光雷达还是个金贵玩意儿,动辄几万块一台。现在好多了,从十几线的到128线的,从机械式到固态式,选择越来越丰富。但不管硬件怎么变,底层的原理和数据处理逻辑,始终是绕不开的基本功。
2.1 激光雷达的工作原理
激光雷达,英文叫LiDAR,全称是Light Detection And Ranging。说白了,它就是通过发射激光束,然后测量激光从发射到反射回来所用的时间,来算出目标距离的。这跟蝙蝠用超声波定位是一个道理,只不过咱们用的是光。
为什么会选择激光而不是超声波?因为激光的波长短,方向性好,精度高。我曾在项目里对比过超声波和激光雷达在室内走廊的建图效果,超声波受多径效应影响,墙角处经常出现鬼影,而激光雷达的数据就干净得多。
激光雷达的核心测量原理有两种:
- TOF(飞行时间法):直接测量激光脉冲的往返时间。精度高,抗干扰能力强,是目前主流方案。
- 三角测距法:利用激光发射点和接收摄像头之间的基线,通过三角几何计算距离。成本低,但远距离精度下降明显。早期扫地机器人常用这种。
核心参数速查表
| 参数 | 说明 | 我的建议 |
|---|---|---|
| 线数 | 激光雷达内部激光发射器的数量 | 室内导航16线够用,室外复杂环境建议32线以上 |
| 测量半径 | 最远能测多远 | 别只看标称值,实际受目标反射率影响很大 |
| 角分辨率 | 相邻两束激光之间的角度间隔 | 角分辨率越小,点云越密,建图越精细 |
| 扫描频率 | 每秒完成多少次完整扫描 | 移动机器人建议10Hz以上,高速场景需要20Hz |
2.2 点云数据格式
激光雷达采集到的原始数据,最终会变成一堆三维空间中的点。每个点通常包含X、Y、Z坐标,以及反射强度(Intensity)。这一堆点,就是所谓的“点云”。
在ROS里,点云数据最常用的消息类型是 sensor_msgs::PointCloud2。嗯,这里要注意,早期版本还有 sensor_msgs::PointCloud,但那个已经过时了,大家直接用 PointCloud2 就好。
PointCloud2 的消息结构长这样:
std_msgs/Header header # 时间戳和坐标系
uint32 height # 如果是无序点云,height=1
uint32 width # 点的数量
sensor_msgs/PointField[] fields # 每个字段的描述(x, y, z, intensity等)
bool is_bigendian # 字节序
uint32 point_step # 单个点的字节数
uint32 row_step # 一行的字节数
uint8[] data # 原始二进制数据
bool is_dense # 是否包含无效点(NaN)
我个人习惯在处理点云时,先用 pcl::fromROSMsg 把ROS消息转成PCL的点云对象。PCL(Point Cloud Library)是点云处理的瑞士军刀,滤波、分割、配准,应有尽有。
避坑指南
我曾经在项目里直接操作 PointCloud2 的原始二进制数据,结果因为字节对齐问题,解析出来的坐标全是错的。后来老老实实用PCL的转换函数,再也没出过问题。所以,能用库就别自己造轮子。
2.3 在ROS中驱动激光雷达
ROS里驱动激光雷达,通常有两种方式:
- 使用官方驱动包:比如
velodyne_driver、rplidar_ros、sick_scan等。这些包已经封装好了底层通信,我们只需要配置参数即可。 - 自己写驱动节点:如果用的是非标雷达,或者需要定制化处理,那就得自己写。核心就是通过串口或网口读取雷达数据,解析成
PointCloud2消息发布出去。
以最常见的思岚RPLIDAR A1为例,启动驱动只需要一行命令:
roslaunch rplidar_ros rplidar.launch
启动后,你会看到 /scan 话题上发布了 sensor_msgs::LaserScan 消息。注意,这是单线雷达常用的消息类型,不是点云。如果你需要点云,可以用 laser_geometry 包里的 laser_scan_to_point_cloud 节点进行转换。
重要提醒
驱动雷达时,一定要检查串口权限。Linux下默认用户可能没有访问串口的权限,需要将用户添加到 dialout 组:sudo usermod -a -G dialout $USER。我当年第一次用RPLIDAR时,折腾了半天才发现是权限问题,真是血泪教训。
2.4 可视化激光雷达数据
数据来了,怎么看?ROS里最常用的可视化工具是 rviz。启动rviz后,添加一个 PointCloud2 显示插件,选择对应的topic,就能看到点云了。
可视化时,有几个小技巧:
- 调整点的大小:点太小看不清,太大又遮挡细节。我一般设成0.02~0.05米。
- 按强度着色:反射强度可以反映物体的材质。比如,路面的强度通常比树木低,可以用来区分地面和障碍物。
- 设置固定坐标系:确保
Fixed Frame设置正确,通常是map或odom,否则点云会乱飘。
你想想看,如果点云在rviz里显示出来是一团乱麻,那多半是坐标系没设对。我见过不少新手,雷达装歪了也不知道,建出来的地图全是斜的。
2.5 本章知识体系
下面这张图,是我自己总结的激光雷达入门知识结构。从硬件原理到ROS实操,一条线串下来,希望能帮你理清思路。
好了,这一章的内容就到这里。激光雷达是机器人感知的“眼睛”,把它的原理和ROS驱动搞明白,后面的建图和避障才能玩得转。记住,多动手在rviz里看看点云,比死记硬背参数强一百倍。
公众号:蓝海资料掘金营,微信deep3321