3、激光雷达基础:工作原理、常见型号与ROS2驱动配置

大家好,我是你们的讲师。今天我们来聊聊激光雷达——这个在机器人感知里最靠谱的传感器之一。

说实话,我入行那会儿,激光雷达还是个奢侈品。一个16线的雷达能顶一辆小轿车。现在不一样了,几百块钱就能买到不错的单线雷达。但不管价格怎么变,它的核心原理和用法,其实没怎么变过。

3.1 激光雷达是怎么工作的?

激光雷达,英文叫LiDAR(Light Detection And Ranging)。说白了,就是“用激光来测距”。

它的原理其实很简单:发射一束激光,打到物体上,反射回来,接收器捕捉到。然后根据光速和飞行时间,算出距离。嗯,就这么直接。

我经常跟学生打比方:你站在山崖前大喊一声,听到回声,就知道对面有多远。激光雷达就是那个“喊话”的人,只不过它喊的是激光,而且每秒能喊几万次甚至几十万次。

核心公式:

距离 = (光速 × 飞行时间) / 2

除以2是因为光走了个来回。

但光有距离还不够。机器人要知道的不是“前面3米有东西”,而是“在哪个方向、哪个高度有东西”。所以激光雷达会旋转,或者用多束激光,来覆盖一个扇面或一个球面。

这就是我们常说的“线数”。单线雷达只能扫一个平面,16线、32线、64线就能扫出三维点云。

我个人习惯把激光雷达分成两类:

  • 机械旋转式:里面有个电机带着激光头转。最常见,技术成熟,但寿命受限于电机。
  • 固态式:没有旋转部件,靠光学相控阵或微振镜来改变激光方向。体积小,寿命长,但视场角有限。

我在项目中遇到过一件事:一个客户非要拿固态雷达做360度全覆盖,结果怎么调都差那么一点。后来我跟他解释,固态雷达天生就是“直视”的,想全覆盖就得装好几个。他这才恍然大悟。

3.2 常见型号与选型建议

市面上的激光雷达型号很多,我挑几个最常见的说说。

型号 线数 测距范围 典型应用 参考价格
RPLIDAR A1/A2 单线 6-12米 扫地机器人、建图 ¥300-800
YDLIDAR X4 单线 8-10米 教育机器人、小车 ¥200-400
Velodyne VLP-16 16线 100米 自动驾驶、AGV ¥20000+
Livox Mid-40 固态 90米 无人机、机器人 ¥5000+
Hesai PandarXT-16 16线 80米 自动驾驶、安防 ¥15000+

选型的时候,我建议你关注三个指标:

  1. 测距范围:室内用6-10米就够了,室外至少30米起步。
  2. 线数:只是建图导航,单线足够。要做障碍物识别,至少16线。
  3. 帧率:一般10-20Hz。移动速度快的机器人,帧率要高一些。

我的经验:初学者别一上来就买贵的。先拿个RPLIDAR A2跑通ROS2驱动,把数据可视化搞明白,再考虑升级。省钱又省心。

3.3 ROS2驱动配置

好,理论说完了,咱们来点实际的。怎么让激光雷达在ROS2里跑起来?

以最常见的RPLIDAR为例。你想想看,ROS2里驱动一个传感器,无非就是三步:装驱动、写launch文件、看数据。

3.3.1 安装驱动

ROS2官方推荐的驱动包叫 slam_toolbox 和 rplidar_ros。安装很简单:

# 安装rplidar驱动
sudo apt install ros-humble-rplidar-ros

# 或者从源码编译
cd ~/ros2_ws/src
git clone https://github.com/Slamtec/rplidar_ros.git
cd ..
colcon build --packages-select rplidar_ros
source install/setup.bash

嗯,这里要注意:不同版本的ROS2,包名可能不一样。Humble版本就用上面的命令。如果你用的是Foxy或Galactic,记得把 humble 换成对应的版本名。

3.3.2 编写launch文件

我个人习惯把launch文件写得干净一点。下面这个是我常用的模板:

# rplidar_launch.py
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='rplidar_ros',
            executable='rplidar_composition',
            name='rplidar_node',
            parameters=[{
                'serial_port': '/dev/ttyUSB0',
                'serial_baudrate': 115200,
                'frame_id': 'laser_frame',
                'angle_compensate': True,
                'scan_mode': 'Standard'
            }],
            output='screen'
        )
    ])

这里有几个参数我解释一下:

  • serial_port:雷达插在哪个USB口。一般就是 /dev/ttyUSB0 或 /dev/ttyAMA0。
  • frame_id:坐标系名字。后面做TF变换时会用到。
  • scan_mode:扫描模式。Standard是标准模式,有些雷达还有Boost模式,帧率更高但精度略低。

避坑指南:我曾经遇到过一个问题——雷达插上后,ROS2一直报错说打不开串口。查了半天,原来是权限问题。解决办法:

sudo chmod 666 /dev/ttyUSB0

或者把用户加到dialout组里:

sudo usermod -a -G dialout $USER

然后重启一下就好了。

3.3.3 启动与验证

启动雷达:

ros2 launch rplidar_ros rplidar_launch.py

如果一切正常,你会看到终端里不断刷出扫描数据。这时候可以开另一个终端,看看话题有没有发布:

ros2 topic list
# 应该能看到 /scan 话题

ros2 topic echo /scan
# 会显示一长串距离数据

3.4 数据可视化

光看数字没意思,咱们把数据画出来。

ROS2里最常用的可视化工具是 RViz2。启动它:

ros2 run rviz2 rviz2

然后在RViz2里:

  1. 点击左下角的“Add”按钮
  2. 选择“LaserScan”
  3. 在“Topic”里填 /scan
  4. 把“Global Options”里的“Fixed Frame”改成 laser_frame

这时候你应该能看到一个扇形的点云图。转一转雷达,点云会跟着动。嗯,这就是你的机器人“看到”的世界。

小技巧:如果你觉得点云太密或者太稀疏,可以在RViz2里调整“Decay Time”参数。设为0.1秒,点云会保留一小段时间,看起来更连贯。

我刚开始做机器人时,第一次在RViz2里看到激光雷达的点云,那种感觉真的很奇妙。一个物理世界,瞬间变成了数字信号,清清楚楚地展现在屏幕上。你想想看,这就是机器人的“眼睛”。

3.5 本章知识体系

下面这张图,是我自己画的。它把本章的核心逻辑串起来了:

激光雷达知识体系 激光雷达 工作原理 TOF测距原理 机械旋转 vs 固态 单线 vs 多线 常见型号 RPLIDAR / YDLIDAR Velodyne / Livox 选型三要素 ROS2驱动配置 安装驱动包 编写launch文件 RViz2可视化 目标:让机器人“看见”世界

这张图把本章内容分成了三大块:工作原理、常见型号、ROS2驱动配置。你从中间开始,往三个方向走,就能把激光雷达这件事搞明白。

好了,这一章就到这里。记住,激光雷达是机器人的“眼睛”,而ROS2就是让这双眼睛“睁开”的工具。多动手试试,比看十遍书都管用。

可可精品资料库