4、传感器与感知:超声波、激光雷达、红外传感器原理、传感器数据处理与融合基础

各位同学,欢迎来到第四章。前面几章我们聊了路径规划的理论框架,但说实话,算法再漂亮,传感器数据一塌糊涂,机器人照样撞墙。我当年刚入行时,就吃过这个亏——自以为A*算法写得天衣无缝,结果超声波一上,数据全是毛刺,机器人原地转圈。嗯,从那以后我明白了一个道理:感知是规划的基石,传感器是机器人的眼睛

这一章,我们聚焦三种最常见的传感器:超声波、激光雷达、红外。我会结合项目经验,把原理、数据处理、融合方法讲透。你想想看,搞懂这些,你就能让机器人「看得见」路。

4.1 超声波传感器:便宜但别小看它

超声波传感器,说白了就是蝙蝠的回声定位。发射40kHz左右的声波,碰到障碍物反射回来,根据时间差算距离。公式很简单:

距离 = (声速 × 时间差) / 2

声速在空气中约340m/s,受温度影响。我在项目中遇到过,冬天室外温度零下,测距直接偏了5cm。所以,实际工程中一定要加温度补偿

4.1.1 典型参数与选型

参数 典型值 说明
测量范围 2cm - 4m 近端有盲区,远端衰减
精度 ±1cm @ 1m内 远距离精度下降
波束角 15° - 60° 角度越大,横向分辨率越差
更新频率 20 - 50Hz 受声波传播时间限制

我个人习惯,室内机器人用HC-SR04就够了,成本几块钱。但注意,波束角大是双刃剑——能覆盖宽区域,但容易把旁边的墙误判为正前方的障碍。

4.1.2 数据处理:去噪与滤波

超声波数据噪声很大。为什么?因为多径反射、串扰、温度波动。我建议用以下三步处理:

  1. 中值滤波:连续采5个点,取中间值。能干掉突发噪声。
  2. 限幅滤波:相邻两次差值超过阈值(比如10cm),直接丢弃。防止跳变。
  3. 滑动平均:取最近N个有效值的平均。N=3~5比较合适。

核心经验:超声波不适合做精细建图,但做避障足够了。我在扫地机器人项目里,就用3个超声波覆盖前方120°,配合红外做近场检测,效果很稳。

4.2 激光雷达:SLAM的黄金搭档

激光雷达(LiDAR)是现在SLAM的主流选择。它发射激光束,测量飞行时间(ToF)或相位差,得到精确的距离。相比超声波,它精度高、波束窄、速度快。

为什么会这样?因为激光波长比声波短得多,方向性好。我常用的RPLIDAR A1,测距范围12m,精度±1cm,采样频率8000Hz。你想想看,每秒8000个点,建图能不精细吗?

4.2.1 数据格式与坐标系

激光雷达输出的通常是极坐标数据:角度θ和距离r。转换成笛卡尔坐标:

x = r * cos(θ)
y = r * sin(θ)

注意,坐标系原点在雷达中心。如果你把雷达装在机器人前方,做路径规划时一定要做坐标变换。我曾经因为忘了这个,规划出来的路径直接穿墙——嗯,那次调试到凌晨两点。

4.2.2 点云预处理

原始点云不能直接用。我一般做以下处理:

  • 离群点剔除:统计每个点邻域内的点数,少于阈值的视为噪声。
  • 地面滤除:对于3D雷达,提取地面以下点并移除。2D雷达则直接忽略低于雷达安装高度的数据。
  • 降采样:用体素滤波器,把点云网格化,每个网格保留一个点。减少计算量。

避坑指南:我曾经在玻璃墙环境中吃过亏——激光直接穿透玻璃,雷达以为前方没障碍,机器人一头撞上去。后来我加了超声波做互补,才解决这个问题。

4.3 红外传感器:近场感知的利器

红外传感器,原理是发射红外光,根据反射光强度判断距离。常见的有Sharp GP2Y0A系列,测距范围10cm-80cm。它便宜、响应快,但受环境光影响大。

我个人习惯,把红外用在近场避障悬崖检测。比如,机器人靠近墙壁10cm以内,超声波盲区了,红外正好补上。

4.3.1 非线性校准

红外的输出是模拟电压,与距离呈非线性关系。Sharp的典型曲线是反比例函数。我建议做查表校准:

// 伪代码:红外校准表
float ir_lut[10] = {0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.2, 3.3, 3.4};
float dist_lut[10] = {80, 50, 30, 20, 15, 12, 10, 8, 6, 5};

float get_distance(float voltage) {
    // 线性插值查表
    for (int i = 0; i < 9; i++) {
        if (voltage >= ir_lut[i] && voltage < ir_lut[i+1]) {
            float ratio = (voltage - ir_lut[i]) / (ir_lut[i+1] - ir_lut[i]);
            return dist_lut[i] + ratio * (dist_lut[i+1] - dist_lut[i]);
        }
    }
    return -1; // 无效值
}

注意:红外传感器在强光下会饱和。我在户外测试时,大太阳底下红外直接失效。所以,室外机器人一定要加遮光罩,或者用激光雷达替代。

4.4 传感器融合:1+1 > 2

单一传感器总有短板。超声波精度差,激光雷达怕玻璃,红外怕强光。怎么办?融合!

我常用的融合策略是加权平均 + 置信度评估。每个传感器根据当前环境动态分配权重。比如:

  • 近距离(< 30cm):红外权重高(精度好),超声波权重低(盲区)。
  • 中距离(30cm - 3m):激光雷达权重最高,超声波辅助。
  • 远距离(> 3m):激光雷达唯一可靠,其他传感器直接忽略。

4.4.1 简单融合示例

// 传感器融合伪代码
float fuse_distance(float ultrasonic, float lidar, float infrared) {
    float weight_u = 0.2, weight_l = 0.7, weight_i = 0.1;
    
    // 根据距离调整权重
    if (infrared < 30 && infrared > 0) {
        weight_i = 0.6;  // 近场红外优先
        weight_u = 0.3;
        weight_l = 0.1;
    }
    
    float fused = weight_u * ultrasonic + weight_l * lidar + weight_i * infrared;
    return fused;
}

你想想看,这样融合后,机器人在玻璃墙前,激光雷达失效了,但超声波和红外还能工作。整体鲁棒性大幅提升。

4.4.2 进阶:卡尔曼滤波融合

如果要做更精确的融合,我推荐卡尔曼滤波。它根据传感器噪声协方差,动态估计最优值。不过,卡尔曼滤波对计算资源有要求,嵌入式上要小心实现。这部分我们后面章节会详细讲。

我的经验:在资源受限的MCU上,别用太复杂的融合算法。加权平均 + 限幅滤波,往往比花哨的算法更可靠。记住,嵌入式第一原则:简单、稳定、可预测

4.5 本章小结

这一章,我们聊了三种传感器的原理、数据处理和融合方法。核心要点:

  • 超声波:便宜但噪声大,适合避障,不适合建图。
  • 激光雷达:精度高,SLAM首选,但怕玻璃和镜面。
  • 红外:近场利器,需要校准,怕强光。
  • 融合:取长补短,动态权重是工程中最实用的方法。

下一章,我们会把这些传感器数据用起来,开始讲栅格地图构建与更新。到时候,你会看到传感器数据如何变成机器人能理解的环境模型。嗯,敬请期待。

公众号:蓝海资料掘金营,微信deep3321