4. SICK激光雷达数据采集与ROS/ROS2接入
在机器人定位与安全协同感知系统中,激光雷达是获取环境几何信息最核心的传感器之一。SICK 的 LMS、LRS、TiM、MRS、NAV 等系列激光雷达广泛用于 AGV/AMR 的导航、避障与安全防护。要把这些雷达的数据真正用起来,第一步就是通过 ROS 或 ROS2 驱动把原始扫描数据接入系统,并正确配置网络、角度范围、分辨率与滤波参数。本节围绕 sick_scan 与 sick_scan_xd 两个主流驱动,讲清楚从设备到点云/扫描话题的完整链路。
一、驱动选型:sick_scan 与 sick_scan_xd 的定位差异
sick_scan 是较早的 ROS1 驱动,主要面向 LMS1xx、LMS5xx、TiM 等经典型号,基于 sick_scan 包提供 sensor_msgs/LaserScan 与 sensor_msgs/PointCloud2 输出。它的优点是结构简单、依赖少,适合 ROS1 环境下的单线或多线雷达快速接入。缺点是维护节奏较慢,对新型号(如 MRS1000、LRS4000、nanoScan3)支持有限,且不原生支持 ROS2。
sick_scan_xd 是 SICK 官方主推的跨平台驱动,同时支持 ROS1、ROS2 和独立运行模式,覆盖 LMS、LRS、TiM、MRS、NAV、nanoScan3 等更广的型号。它内部通过统一的 SOPAS 协议层与设备通信,输出 LaserScan、PointCloud2 以及部分型号的 Imu、Odometry 话题。对于新项目,尤其是 ROS2 Humble/Iron 环境,应优先选择 sick_scan_xd。若已有 ROS1 遗留系统且型号较老,可继续使用 sick_scan。
二、网络与 IP 配置:让主机与雷达在同一网段
SICK 激光雷达通常通过以太网通信,默认 IP 因型号而异。例如 LMS5xx 常见默认 192.168.0.1,TiM 系列常见 192.168.0.1 或 192.168.1.1,MRS1000 常见 192.168.0.1。主机需要配置同网段静态 IP,例如 192.168.0.100/24,并确保能 ping 通雷达。
# 查看网卡名称
ip link show
# 临时配置主机 IP(示例)
sudo ip addr add 192.168.0.100/24 dev eth0
sudo ip link set eth0 up
# 验证连通性
ping 192.168.0.1
如果雷达 IP 与主机不同网段,需要先用 SICK SOPAS ET 工程工具或 Web 界面修改雷达 IP。修改后务必记录,并在驱动 launch 文件中同步更新 hostname 参数。注意:部分安全型雷达(如 nanoScan3)有独立的安全配置通道,修改网络参数可能影响安全功能,需在安全手册允许范围内操作。
三、驱动安装与启动:从源码到话题
以 ROS2 Humble 为例,sick_scan_xd 的典型安装方式是从 GitHub 克隆到工作空间编译:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
git clone https://github.com/SICKAG/sick_scan_xd.git
cd ~/ros2_ws
colcon build --packages-select sick_scan_xd
source install/setup.bash
启动时通过 launch 文件指定型号与 IP。例如启动 LMS5xx:
ros2 launch sick_scan_xd sick_lms_5xx.launch.py hostname:=192.168.0.1
启动后可用 ros2 topic list 查看话题,典型输出包括 /scan、/cloud、/imu 等。用 ros2 topic hz /scan 可观察扫描频率,用 ros2 topic echo /scan --once 可查看一帧数据结构,确认 angle_min、angle_max、angle_increment、range_min、range_max 是否符合预期。
四、角度范围、分辨率与滤波参数配置
驱动 launch 文件或 YAML 参数文件中,以下参数直接决定数据质量与后续定位/安全算法的输入特性:
hostname:雷达 IP 地址,必须与设备实际一致。port:SOPAS 通信端口,常见2112或2111。frame_id:点云/扫描的坐标系名称,需与 TF 树一致,如laser或base_laser。angle_min/angle_max:扫描起始与终止角度,单位弧度。例如-2.356到2.356对应 -135° 到 +135°。angle_increment:角度分辨率,由雷达型号与配置决定,如 0.25°、0.5°、1°。range_min/range_max:有效测距范围,超出范围的点会被标记为无效。intensity:是否输出反射强度。filter:滤波参数,如中值滤波、均值滤波、距离阈值滤波。
以 LMS5xx 为例,若希望只使用前方 180° 范围、角度分辨率 0.5°、最大距离 30 m,可在参数中设置:
angle_min: -1.5708
angle_max: 1.5708
angle_increment: 0.0087266
range_min: 0.5
range_max: 30.0
其中 0.0087266 rad ≈ 0.5°。注意:angle_increment 通常由雷达硬件配置决定,驱动侧一般只做读取和裁剪,不应随意修改为与硬件不符的值,否则会导致点云角度错位。
五、滤波参数的实际作用与调参思路
原始激光数据中常包含三类噪声:一是玻璃、镜面造成的虚假远点;二是雨雾、粉尘造成的随机近点;三是地面反射造成的低角度噪声。驱动层常见的滤波手段包括:
- 距离滤波:设置
range_min与range_max,直接丢弃过近或过远点。 - 角度裁剪:通过
angle_min/angle_max只保留感兴趣扇区,减少计算量。 - 中值滤波:对相邻若干点取中值,抑制孤立跳变点。
- 强度滤波:根据反射强度阈值剔除低置信度点。
调参时应遵循“先保真、后降噪”的原则:先确认原始数据角度与距离正确,再逐步加入滤波。若滤波过强,可能导致细小障碍物(如细杆、线缆)被误删,影响安全避障。建议在 RViz2 中同时显示原始点云与滤波后点云,对比观察。
六、常见问题与排查要点
实际接入时,最常见的问题不是驱动本身,而是网络与参数不匹配。若 ros2 topic list 看不到 /scan,先检查 hostname 是否写错、防火墙是否拦截、雷达是否已上电并完成启动。若能看到话题但数据为空,检查 angle_min/angle_max 是否超出雷达实际扫描范围,或 range_max 是否设置过小。若点云在 RViz2 中方向反了,检查 frame_id 与 TF 变换,确认雷达安装方向与坐标系定义一致。
总结来说,SICK 激光雷达接入 ROS/ROS2 的核心是:选对驱动(新项目优先 sick_scan_xd)、配通网络、设准角度与距离参数、合理滤波,并用话题频率与 RViz2 点云验证数据质量。只有原始数据正确,后续的定位与安全协同感知才有可靠基础。