4. 环境感知基础:传感器数据特点与障碍物检测建模
环境感知,说白了就是机器人的「眼睛」和「耳朵」。没有它,路径规划就是闭着眼睛走路。我做了这么多年机器人,见过太多因为传感器选型不当导致项目翻车的案例。今天咱们就聊聊激光雷达、摄像头、IMU 这三类核心传感器,以及怎么用它们做障碍物检测与建模。
4.1 激光雷达:点云世界的「尺子」
激光雷达(LiDAR)是我个人最偏爱的传感器。它直接测量距离,精度高,不受光照影响。你想想看,在漆黑的仓库里,摄像头啥也看不见,但激光雷达照样能画出周围环境的轮廓。
4.1.1 数据特点
- 稀疏性:16线激光雷达每秒约30万个点,而摄像头是百万级像素。点云天生稀疏。
- 无序性:点云没有像素那样的网格结构。同一个物体,换个角度扫描,点的排列顺序就变了。
- 距离精度高:一般误差在2-5cm,高端雷达能做到毫米级。
- 角度分辨率有限:水平0.1°~0.4°,垂直取决于线数。16线雷达垂直方向只有16条线,远处物体很容易漏检。
重要:激光雷达对反射率敏感。黑色物体(如轮胎)会吸收激光,导致测距失败。我在项目中遇到过一辆黑色轿车停在面前,雷达愣是没扫到——后来加了摄像头做互补才解决。
4.1.2 障碍物检测方法
点云障碍物检测,我习惯分三步走:
- 地面滤除:用RANSAC或平面拟合,把地面点去掉。不然地面点会干扰障碍物聚类。
- 欧几里得聚类:对剩余点云做最近邻聚类。距离近的点归为一类,就是一个障碍物。
- 包围盒建模:对每个聚类计算最小外接矩形或长方体,得到位置、尺寸、朝向。
// 伪代码:点云聚类
def cluster_obstacles(point_cloud):
# 1. 地面滤除
ground = fit_plane(point_cloud)
non_ground = point_cloud - ground
# 2. 欧几里得聚类
clusters = euclidean_clustering(non_ground,
radius=0.5, # 聚类半径
min_points=10)
# 3. 生成包围盒
boxes = []
for cluster in clusters:
box = compute_bounding_box(cluster)
boxes.append(box)
return boxes
经验之谈:聚类半径要根据传感器分辨率动态调整。远处点稀疏,半径要设大一点;近处点密集,半径设小。我曾经用固定半径吃了大亏——远处两个行人被误判成一个障碍物。
4.2 摄像头:语义理解的「眼睛」
摄像头提供的是稠密纹理信息。它能告诉你「那是个行人」,而激光雷达只能告诉你「那里有个凸起」。但摄像头也有硬伤——怕暗、怕逆光、怕雨雾。
4.2.1 数据特点
| 特性 | 说明 |
|---|---|
| 分辨率高 | 1080p就是200万像素,细节丰富 |
| 无直接深度 | 单目无法直接测距,需要双目或结构光 |
| 受光照影响大 | 夜间、逆光、阴影下性能急剧下降 |
| 视角有限 | 一般60°~120°,存在盲区 |
4.2.2 障碍物检测方法
现在主流做法是用深度学习做目标检测。YOLO系列、Faster R-CNN 都是常用方案。我个人偏爱 YOLOv8——速度快,精度够用,部署方便。
# 使用YOLOv8做障碍物检测
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
results = model('road.jpg')
for box in results[0].boxes:
x1, y1, x2, y2 = box.xyxy[0]
cls = int(box.cls[0])
conf = float(box.conf[0])
print(f"检测到 {model.names[cls]}, 置信度: {conf:.2f}")
注意:深度学习模型有「域偏移」问题。在A城市训练好的模型,到B城市可能掉精度。我建议每个新场景至少采集500张图片做微调,不然模型会「水土不服」。
4.3 IMU:运动状态的「内耳」
IMU(惯性测量单元)测量加速度和角速度。它不依赖外部信号,完全自主。但它的致命缺点是——漂移。
4.3.1 数据特点
- 高频:100-1000Hz,远高于激光雷达(10-20Hz)和摄像头(30-60Hz)
- 短时精度高:几秒内的相对运动估计非常准
- 长时漂移:积分一次得到速度,积分两次得到位置——误差随时间平方增长
- 噪声大:尤其是低成本MEMS IMU,零偏稳定性差
4.3.2 在障碍物检测中的角色
IMU一般不直接检测障碍物。它的作用是:
- 运动补偿:激光雷达扫描时,机器人可能在运动。用IMU数据对点云做畸变校正。
- 帧间关联:两帧点云之间,用IMU做初始位姿估计,加速匹配。
- 状态预测:在卡尔曼滤波中,IMU提供预测步骤,填补传感器间隙。
核心思路:IMU + 激光雷达 + 摄像头 = 多传感器融合。IMU负责高频运动估计,激光雷达提供精确距离,摄像头补充语义信息。三者取长补短,才能构建稳定可靠的环境感知系统。
4.4 障碍物建模:从检测到可用表示
检测到障碍物之后,怎么表示它?我常用的有三种方式:
4.4.1 栅格地图
把环境划分成网格,每个格子标记为占用/空闲/未知。简单直观,适合2D平面导航。
# 栅格地图更新
grid_map[x][y] = 0.8 # 占用概率
grid_map[x][y] = 0.2 # 空闲概率
4.4.2 特征地图
用几何基元(线段、圆弧、多边形)表示障碍物。存储量小,适合结构化环境。
4.4.3 语义地图
给每个障碍物打标签:「行人」「车辆」「路障」。这是目前最前沿的方式,但计算量大。
我的建议:实际项目中,先用栅格地图做快速避障,再用语义地图做高层规划。别一上来就搞语义——很多项目死在「过度设计」上。
4.5 本章知识体系
下面这张图总结了传感器数据特点、检测方法、建模方式之间的关系:
4.6 避坑指南
最后分享几个我踩过的坑:
- 传感器时间同步:激光雷达和摄像头的时间戳必须对齐。差50ms,高速运动下误差就超过1米。我建议用硬件触发同步,别依赖软件。
- 标定精度:激光雷达和摄像头的外参标定,误差超过1cm就会导致投影错位。我习惯用棋盘格+点云联合标定,每季度重新标一次。
- 数据回放测试:别只在实车上调试。录一段bag数据,在办公室里反复回放,能发现很多现场发现不了的问题。
曾经有一次,我在雨夜测试,激光雷达被雨滴反射产生大量噪点,障碍物检测直接崩溃。后来加了「雨滴滤波」——根据点云强度和距离的统计特征,滤除雨滴噪点。这个坑让我明白:传感器数据预处理比算法本身更重要。
好了,环境感知基础就聊到这儿。记住一句话:没有完美的传感器,只有合理的融合策略。下一节咱们会把这些感知数据用起来,做真正的路径规划。
可可精品资料库