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+ |
选型的时候,我建议你关注三个指标:
- 测距范围:室内用6-10米就够了,室外至少30米起步。
- 线数:只是建图导航,单线足够。要做障碍物识别,至少16线。
- 帧率:一般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里:
- 点击左下角的“Add”按钮
- 选择“LaserScan”
- 在“Topic”里填
/scan - 把“Global Options”里的“Fixed Frame”改成
laser_frame
这时候你应该能看到一个扇形的点云图。转一转雷达,点云会跟着动。嗯,这就是你的机器人“看到”的世界。
小技巧:如果你觉得点云太密或者太稀疏,可以在RViz2里调整“Decay Time”参数。设为0.1秒,点云会保留一小段时间,看起来更连贯。
我刚开始做机器人时,第一次在RViz2里看到激光雷达的点云,那种感觉真的很奇妙。一个物理世界,瞬间变成了数字信号,清清楚楚地展现在屏幕上。你想想看,这就是机器人的“眼睛”。
3.5 本章知识体系
下面这张图,是我自己画的。它把本章的核心逻辑串起来了:
这张图把本章内容分成了三大块:工作原理、常见型号、ROS2驱动配置。你从中间开始,往三个方向走,就能把激光雷达这件事搞明白。
好了,这一章就到这里。记住,激光雷达是机器人的“眼睛”,而ROS2就是让这双眼睛“睁开”的工具。多动手试试,比看十遍书都管用。
可可精品资料库