3、激光雷达话题排查:检查/scan话题频率、检查激光数据完整性、常见激光雷达驱动问题
做SLAM这么多年,我见过太多建图异常的情况。十次里有八次,问题都出在激光雷达数据上。说白了,雷达就是机器人的眼睛——眼睛花了,地图肯定建不好。
这一节,咱们就专门聊聊怎么排查激光雷达的话题。我会从三个角度入手:话题频率对不对、数据完不完整、驱动有没有坑。嗯,都是实战中踩过的坑,我一个个说给你听。
3.1 检查/scan话题频率
先问个问题:你的雷达该跑多少Hz?
常见的单线雷达,比如RPLIDAR A1/A2,一般是5-10Hz。思岚的S系列、镭神N10,通常是10Hz。多线雷达像Velodyne VLP-16,一般是10Hz或20Hz。如果你用的是一个不熟悉的雷达,第一步就是去查它的数据手册。
怎么查实际频率?很简单,用命令行:
# 查看/scan话题的频率
rostopic hz /scan
# 持续观察,按Ctrl+C停止
这个命令会输出类似这样的信息:
subscribed to [/scan]
average rate: 9.998
min: 0.099s max: 0.101s std dev: 0.00062s
看到10Hz左右,说明频率正常。如果出现下面这些情况,就要警惕了:
- 频率远低于标称值:比如标称10Hz,实际只有2-3Hz。这通常意味着CPU负载过高,或者驱动有问题。
- 频率忽高忽低:比如一会儿10Hz,一会儿5Hz。这往往是系统调度问题,或者USB带宽不足。
- 频率为0:话题根本没在发。这时候先检查驱动节点有没有启动。
我个人的习惯:每次启动建图前,我都会先跑一下rostopic hz /scan。如果频率不对,我不会开始建图。为什么?因为频率不稳,建出来的地图大概率是歪的。
还有一个更直观的方法——用rqt_plot看时间戳间隔:
rqt_plot /scan/header/stamp
如果时间戳间隔均匀,说明雷达工作正常。如果出现明显的断层或抖动,那就要往下查了。
3.2 检查激光数据完整性
频率没问题,不代表数据就靠谱。我遇到过好几次,频率是10Hz,但雷达扫出来的点全是NaN,或者只有半圈有数据。
怎么检查数据完整性?我一般用三步:
- 看话题内容:
rostopic echo /scan,看看ranges数组里有没有异常值。 - 看可视化:在RViz里添加
LaserScan显示,看看点云是不是完整的一圈。 - 看数据量:
rostopic info /scan,看看消息大小是否正常。
这里有个常见的坑:雷达的盲区。很多雷达在近距离(比如0.15米以内)会输出NaN或inf。这其实是正常的,但如果你用这些数据做建图,就会出问题。所以,建图前一定要设置好range_min和range_max。
我曾经在一个项目里,雷达数据看起来完整,但建图总是有奇怪的噪点。查了两天,最后发现是雷达的镜面上沾了一小块灰尘。擦干净之后,一切正常。所以,物理检查也很重要——别光看代码,也看看雷达本身。
还有一个技巧:检查scan_time和time_increment这两个字段。它们反映了雷达的扫描周期和每束激光的时间间隔。如果这两个值异常,说明驱动可能配置错了。
# 查看scan_time
rostopic echo /scan | grep scan_time
3.3 常见激光雷达驱动问题
驱动问题,说白了就是雷达和电脑之间的通信出了问题。我把它分成三类:串口权限、IP配置、帧率异常。
3.3.1 串口权限问题
这是最最常见的问题,尤其是用USB串口的雷达。你插上雷达,运行驱动,结果报错:Permission denied。
原因很简单:Linux系统默认不允许普通用户访问串口设备。解决方法有两种:
- 临时解决:
sudo chmod 666 /dev/ttyUSB0(每次重启后都要重新执行) - 永久解决:把用户加入dialout组:
sudo usermod -a -G dialout $USER(然后注销重新登录)
我个人建议:写一个udev规则文件,让系统自动给雷达设备分配固定权限和固定设备名。比如:
# /etc/udev/rules.d/99-lidar.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0666", SYMLINK+="lidar"
这样,雷达就会固定映射到/dev/lidar,权限也自动设置好了。
3.3.2 IP配置问题
网络雷达(比如Velodyne、Ouster)用的是以太网通信。这类问题通常出在IP地址配置上。
雷达一般有固定的默认IP,比如192.168.1.201。你的电脑必须和它在同一个网段,才能收到数据。我见过有人把电脑IP设成192.168.2.100,雷达是192.168.1.201,结果折腾了半天连不上。
检查方法:
# 查看电脑IP
ifconfig
# 尝试ping雷达
ping 192.168.1.201
如果ping不通,先检查网线、交换机,再检查IP配置。还有一个容易被忽略的点:防火墙。有些系统默认开启了防火墙,会拦截雷达的UDP数据包。
我记得有一次,在客户现场调试,雷达就是收不到数据。所有配置都检查了,没问题。最后发现是客户用的工业交换机开启了IGMP Snooping,把雷达的多播数据包过滤掉了。关掉这个功能,数据就来了。
3.3.3 帧率异常
帧率异常,就是前面说的频率不对。但这里我要补充一点:帧率异常不一定是驱动的问题,也可能是硬件的问题。
比如,雷达的电机转速不稳,会导致帧率波动。这种情况在廉价雷达上很常见。你可以听声音——如果雷达转动的声音忽快忽慢,那基本就是硬件问题了。
还有一种情况:USB带宽不足。如果你在同一个USB控制器上接了多个设备(比如雷达+摄像头),带宽可能不够用。这时候雷达的数据包会丢失,表现为帧率下降或数据不完整。
解决方法:把雷达插到独立的USB控制器上,或者用PCIe扩展卡。
| 问题类型 | 典型现象 | 排查步骤 | 解决方案 |
|---|---|---|---|
| 串口权限 | Permission denied | 检查/dev/ttyUSB*权限 | 加入dialout组或写udev规则 |
| IP配置 | ping不通,收不到数据 | 检查IP、子网掩码、防火墙 | 配置同网段IP,关闭防火墙 |
| 帧率异常 | 频率波动或偏低 | rostopic hz,听电机声音 | 检查USB带宽,更换硬件 |
| 数据不完整 | 点云有空洞或NaN | rostopic echo,RViz可视化 | 清洁雷达,设置range_min/max |
嗯,关于激光雷达话题排查,核心就是这三板斧:频率、完整性、驱动。你只要把这三点都检查一遍,90%的建图异常都能找到原因。
一个小技巧:我习惯把排查步骤写成脚本,一键执行。比如:
#!/bin/bash
echo "=== 检查/scan话题 ==="
rostopic info /scan
echo "=== 检查频率 ==="
timeout 5 rostopic hz /scan
echo "=== 检查数据完整性 ==="
rostopic echo /scan -n 1 | grep -E "ranges|range_min|range_max"
这样每次调试都能快速定位问题。
可可精品资料库