第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里驱动激光雷达,通常有两种方式:

  1. 使用官方驱动包:比如 velodyne_driverrplidar_rossick_scan 等。这些包已经封装好了底层通信,我们只需要配置参数即可。
  2. 自己写驱动节点:如果用的是非标雷达,或者需要定制化处理,那就得自己写。核心就是通过串口或网口读取雷达数据,解析成 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 设置正确,通常是 mapodom,否则点云会乱飘。

你想想看,如果点云在rviz里显示出来是一团乱麻,那多半是坐标系没设对。我见过不少新手,雷达装歪了也不知道,建出来的地图全是斜的。

2.5 本章知识体系

下面这张图,是我自己总结的激光雷达入门知识结构。从硬件原理到ROS实操,一条线串下来,希望能帮你理清思路。

激光雷达知识体系 工作原理 数据格式 ROS驱动 TOF法 三角测距 PointCloud2 LaserScan 官方驱动 自写驱动 可视化与调试(rviz) 线数 / 角分辨率 测量半径 / 频率 坐标系 / 权限

好了,这一章的内容就到这里。激光雷达是机器人感知的“眼睛”,把它的原理和ROS驱动搞明白,后面的建图和避障才能玩得转。记住,多动手在rviz里看看点云,比死记硬背参数强一百倍。


公众号:蓝海资料掘金营,微信deep3321