3. 传感器选型与数据读取:激光雷达、深度相机、超声波传感器特性对比,ROS驱动配置
做自主避障,传感器就是无人机的「眼睛」。眼睛选错了,后面算法再牛也白搭。
我这些年踩过的坑,有一半都出在传感器选型上。今天咱们就把激光雷达、深度相机、超声波这三种主流传感器掰开揉碎聊清楚。顺便把ROS驱动怎么配也一并搞定。
3.1 三种传感器的核心特性对比
先给个总览表格,方便你快速对比。后面我再逐个细讲。
| 特性 | 激光雷达(LiDAR) | 深度相机(RGB-D) | 超声波传感器 |
|---|---|---|---|
| 测距原理 | TOF / 三角法 | 结构光 / 双目 / TOF | 声波反射 |
| 有效距离 | 0.1m ~ 100m+ | 0.3m ~ 10m | 0.02m ~ 5m |
| 精度 | ±1cm ~ ±3cm | ±1cm ~ ±5cm | ±1cm ~ ±3cm(近距离) |
| 视角 | 360°(单线)/ 多线 | 水平60°~90°,垂直45°~70° | 15°~30°(锥形) |
| 抗环境光干扰 | 强(室外可用) | 弱(强光下易失效) | 强(不受光照影响) |
| 数据维度 | 2D点云 / 3D点云 | RGB图像 + 深度图 | 单点距离 |
| 典型功耗 | 2W ~ 15W | 1.5W ~ 5W | 0.1W ~ 0.5W |
| 典型成本 | ¥500 ~ ¥50000+ | ¥300 ~ ¥3000 | ¥10 ~ ¥100 |
核心结论:没有完美的传感器。激光雷达精度高但贵,深度相机信息丰富但怕强光,超声波便宜但视角窄。实际项目中,我通常建议「激光雷达 + 超声波」或「深度相机 + 超声波」的组合方案。
3.2 激光雷达(LiDAR)—— 精度之王
激光雷达是我个人最偏爱的传感器。为什么?因为它稳定、可靠、数据干净。
我在一个物流仓库的项目里用过单线激光雷达做避障。仓库里灰尘大、光线暗,深度相机基本废了,但激光雷达一点问题没有。说白了,激光雷达就是「硬汉」级别的传感器。
3.2.1 常见型号与选型建议
- 单线激光雷达:如 RPLIDAR A1/A2、Sick TIM系列。适合2D平面避障,室内场景首选。
- 多线激光雷达:如 Velodyne VLP-16、Livox Mid-40。适合3D空间感知,室外复杂环境必备。
- 固态激光雷达:如 Ouster OS系列。体积小、寿命长,但价格偏高。
我的经验:如果预算有限且只在室内飞,RPLIDAR A2 是性价比之王。室外的话,至少上 Livox Mid-40,别省这个钱。
3.2.2 ROS驱动配置
以 RPLIDAR A2 为例,驱动配置非常简单:
# 1. 安装驱动
sudo apt install ros-noetic-rplidar-ros
# 2. 启动驱动(连接USB后)
roslaunch rplidar_ros rplidar.launch
# 3. 查看数据
rostopic echo /scan
启动后,/scan 话题会发布 sensor_msgs/LaserScan 消息。里面包含距离、角度、强度等信息。
注意:激光雷达的USB线缆质量很重要。我曾经因为一根劣质USB线,导致数据丢包严重,排查了整整两天。建议用带屏蔽层的线,长度不超过2米。
3.3 深度相机(RGB-D)—— 信息最丰富
深度相机能同时提供彩色图像和深度信息。说白了,它既能看到「是什么」,又能知道「有多远」。
但我要泼一盆冷水:深度相机在室外强光下基本就是废的。我有个项目在夏天正午测试,Intel RealSense D435 的深度数据全是噪点,根本没法用。所以,如果你要做室外飞行,深度相机只能作为辅助传感器。
3.3.1 常见型号与选型建议
- Intel RealSense D435/D455:双目+主动红外,室内外都能用(但室外受限)。ROS支持最好。
- Microsoft Kinect v2/Azure Kinect:TOF原理,室内效果极佳。但体积大、功耗高,不适合小型无人机。
- Orbbec Astra系列:国产替代,性价比高。ROS驱动也完善。
3.3.2 ROS驱动配置
以 Intel RealSense D435 为例:
# 1. 安装驱动
sudo apt install ros-noetic-realsense2-camera
# 2. 启动相机
roslaunch realsense2_camera rs_camera.launch
# 3. 查看彩色图和深度图
rqt_image_view /camera/color/image_raw
rqt_image_view /camera/depth/image_rect_raw
驱动会发布多个话题:/camera/color/image_raw(彩色图)、/camera/depth/image_rect_raw(深度图)、/camera/color/camera_info(相机内参)。
小技巧:启动时加上 filters:=pointcloud 参数,可以直接得到点云数据:
roslaunch realsense2_camera rs_camera.launch filters:=pointcloud
这样就不用自己写点云生成代码了。
3.4 超声波传感器—— 便宜但好用
超声波传感器经常被忽视。很多人觉得它精度低、视角窄,没什么用。但我不这么看。
超声波有一个激光雷达和深度相机都比不了的优点:不受光照和透明物体影响。我在一个玻璃幕墙建筑附近的飞行项目中,激光雷达打到玻璃上直接穿透了,深度相机也反光失效。最后是靠超声波传感器才保住了避障功能。
3.4.1 常见型号与选型建议
- HC-SR04:最经典的型号,¥5一个。精度一般,但够用。
- US-100:升级版,带温度补偿,精度更高。
- MaxBotix MB系列:工业级,IP67防护,室外首选。
3.4.2 ROS驱动配置
超声波传感器通常通过I2C或串口连接。以 HC-SR04 为例,通过 Arduino 桥接:
# 1. 安装rosserial
sudo apt install ros-noetic-rosserial-arduino
# 2. Arduino端代码(核心部分)
#include <ros.h>
#include <std_msgs/Float32.h>
ros::NodeHandle nh;
std_msgs::Float32 dist_msg;
ros::Publisher pub("ultrasonic_distance", &dist_msg);
void loop() {
// 触发测距
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 读取回波时间
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // 声速340m/s
dist_msg.data = distance;
pub.publish(&dist_msg);
delay(50);
}
ROS端启动:
rosrun rosserial_python serial_node.py /dev/ttyUSB0
避坑指南:我曾经在无人机上装了4个超声波传感器,结果它们互相干扰。原因是多个传感器同时发射声波,产生了串扰。解决办法是分时触发,每个传感器错开10ms以上。
3.5 传感器融合策略
单一传感器总有短板。我建议的典型组合方案:
- 室内飞行:单线激光雷达(主) + 超声波(辅助,用于检测透明障碍物)
- 室外飞行:多线激光雷达(主) + 深度相机(辅助,用于识别物体类型) + 超声波(辅助,用于近距补盲)
- 低成本方案:深度相机(主) + 超声波(辅助)
核心原则:传感器之间要有「冗余」和「互补」。冗余是指同一个信息有多个来源,互补是指不同传感器覆盖不同的短板。你想想看,如果所有传感器都在强光下失效,那无人机不就瞎了吗?
3.6 本章知识体系总览
下面这张图总结了三种传感器的核心特性、选型要点和ROS驱动配置流程。建议你保存下来,做项目时对照着看。
嗯,以上就是传感器选型与数据读取的核心内容。记住一句话:没有最好的传感器,只有最合适的组合。做项目时多想想你的实际场景,别盲目追求高参数。
公众号:蓝海资料掘金营,微信deep3321