4、超声波避障实战:超声波传感器在无人机上的安装、数据读取、距离计算与简单避障逻辑

超声波避障是无人机低成本、近距离感知方案中最成熟的技术路径之一。与视觉或激光雷达相比,超声波传感器以毫秒级响应、厘米级精度和极低的算力需求,在室内定点悬停、低空贴地飞行、狭窄通道穿越等场景中依然不可替代。本章从传感器选型与安装布局出发,逐步讲解数据读取时序、距离解算方法,并最终落地到一套可运行的阈值避障逻辑。通过本章实战,你将掌握从硬件接线到飞控决策的完整闭环能力。

超声波避障链路:安装 → 读取 → 解算 → 决策 ① 安装布局 前/后/左右/下 避开螺旋桨气流 发射/接收面朝外 减震隔离安装 ② 数据读取 I2C / UART / GPIO 触发时序 10μs 回波脉宽测量 超时判断 38ms ③ 距离计算 d = t × v / 2 v = 331.4 + 0.6×T 温度补偿 中值滤波 ④ 避障决策 阈值比较 优先级仲裁 速度/方向修正 安全恢复 关键数据流: • 触发信号(10μs TTL 高电平)→ 传感器发射 40kHz 超声波脉冲 • 回波信号 → 脉宽捕获(微秒级)→ 距离解算 → 飞控决策(Pixhawk/ArduPilot) ⚠ 工程风险点: • 螺旋桨气流扰动 → 安装位置需避开桨盘正下方 • 多传感器串扰 → 分时触发或使用不同载波频率

4.1 超声波传感器选型与安装布局

无人机超声波避障的传感器选型需综合考虑量程、波束角、重量和接口类型。目前主流方案包括 HC-SR04(低成本、5V 供电、量程 2cm-400cm)、US-100(带温度补偿、UART/GPIO 双模式)、以及工业级 MaxBotix 系列(抗噪能力强、模拟/串口输出)。对于 250mm 轴距以下的小型无人机,建议选用重量小于 5g、量程 20cm-200cm 的传感器,避免过大的波束角(>60°)导致地面反射误判。

安装布局是决定避障可靠性的第一道关卡。以四旋翼为例,推荐在机架前后左右四个方向各安装一枚传感器,安装角度向下倾斜 10°-15°,使波束中心线指向飞行方向前方 1.5m-2m 处的地面交汇点。这样做有两个好处:一是避免螺旋桨下洗气流直接冲击传感器振膜,二是让传感器在倾斜姿态下仍能探测到前方障碍物而非地面。底部传感器应安装在机架中心板下方,使用 3D 打印支架或橡胶减震柱隔离高频振动,防止电机振动导致回波信号抖动。

安装禁忌:切勿将超声波传感器安装在螺旋桨旋转平面正下方 5cm 范围内,否则桨叶切割空气产生的湍流会形成虚假回波,导致距离读数跳变。同时,传感器发射面必须保持清洁,避免灰尘或水滴附着,否则会显著衰减声波能量。

4.2 数据读取时序与距离解算

以最常见的 HC-SR04 为例,其数据读取遵循严格的时序协议。飞控或单片机首先向 Trig 引脚发送一个 10μs 的 TTL 高电平脉冲,传感器内部随即发射 8 个 40kHz 的超声波脉冲,并将 Echo 引脚拉高。Echo 高电平的持续时间即为声波从发射到接收的往返时间。距离计算公式为:

// 距离计算(单位:cm)
float duration = pulseIn(echoPin, HIGH);  // 获取回波脉宽(μs)
float distance = duration * 0.034 / 2;     // 声速 340m/s = 0.034cm/μs
// 若启用温度补偿:
float speed = 331.4 + 0.6 * temperature;   // 温度单位:℃
float distance_comp = duration * speed / 10000 / 2;  // 转换为 cm

在实际工程中,直接使用 pulseIn() 会阻塞主循环,导致飞控响应延迟。推荐使用外部中断捕获 Echo 上升沿和下降沿,记录微秒级时间戳。同时,必须设置超时保护:当测量距离超过传感器最大量程(如 400cm)时,Echo 引脚会在约 23ms 后自动拉低,此时应判定为“无回波”,返回一个预设的最大距离值(如 500cm),而不是 0cm——0cm 会被避障逻辑误判为“贴脸障碍物”,触发急停。

参数项HC-SR04US-100MaxBotix MB1240
工作电压5V DC3.3-5V DC3.3-5V DC
量程2-400cm2-450cm1-700cm
波束角约 15°约 15°约 10°
接口GPIO(Trig/Echo)UART / GPIOUART / I2C / 模拟
温度补偿无内置内置
重量约 10g约 8g约 4g
抗噪能力弱中强

4.3 简单避障逻辑设计与实现

避障逻辑的核心是“阈值比较 + 优先级仲裁”。首先设定三个关键距离阈值:安全距离(如 120cm)、警告距离(如 60cm)、危险距离(如 30cm)。当所有方向的距离均大于安全距离时,无人机保持当前飞行指令不变;当某一方向进入警告距离时,飞控降低该方向速度分量,并轻微反向修正;当进入危险距离时,立即执行刹车或反向避让动作。

对于四方向避障,需要定义优先级策略。例如,当前方和右方同时出现障碍物时,应优先响应距离更近的方向;若距离相同,则按照“前方 > 后方 > 左方 > 右方”的优先级顺序执行避让。避让动作可以是平移(水平速度修正)或旋转(偏航角修正),具体取决于飞行模式。在 Pixhawk 飞控中,可以通过 MAVLink 的 SET_POSITION_TARGET_LOCAL_NED 消息实时注入速度修正量。

// 伪代码:四方向避障决策
float front = getDistance(FRONT_SENSOR);
float back  = getDistance(BACK_SENSOR);
float left  = getDistance(LEFT_SENSOR);
float right = getDistance(RIGHT_SENSOR);

if (front < DANGER_DIST) {
    velocity_north = -MAX_BRAKE;  // 急刹车
} else if (front < WARN_DIST) {
    velocity_north = -WARN_BRAKE; // 减速
}

if (left < DANGER_DIST && right < DANGER_DIST) {
    // 两侧同时危险,优先悬停
    velocity_east = 0;
} else if (left < right) {
    velocity_east = +AVOID_SPEED;  // 向右避让
} else {
    velocity_east = -AVOID_SPEED;  // 向左避让
}
滤波技巧:超声波数据易受环境噪声干扰,建议采用滑动窗口中值滤波(窗口大小 5-7 个样本),而非均值滤波。中值滤波能有效剔除尖峰毛刺,同时保留真实的距离突变信息。在飞控中,每 50ms 读取一次传感器,连续采集 5 次后取中值作为有效距离。

4.4 实战案例:室内走廊自主避障飞行

某教学无人机项目需要在宽 1.2m、长 8m 的室内走廊中实现自主巡航,要求飞行速度 0.5m/s,距地面高度 0.8m。初始方案仅在前方安装一枚超声波传感器,试飞时发现无人机在走廊转弯处会撞上侧墙。分析原因:前方传感器只能探测正前方障碍物,无法感知侧向墙体逼近。

改进方案:在机架前后左右各安装一枚 US-100 传感器,并将避障逻辑升级为“前方减速 + 侧向平移”策略。关键参数设定如下:安全距离 80cm(走廊宽度的一半),警告距离 50cm,危险距离 25cm。侧向传感器安装角度为水平 0°,波束中心线对准机架正侧方。经过 3 次迭代调试,最终实现无人机在走廊中 S 形前进,全程无碰撞。

调试过程中发现两个关键问题:一是当无人机以 0.5m/s 速度前进时,前方传感器在 25cm 危险距离触发急停,但无人机惯性滑行距离约 15cm,存在碰撞风险。解决方法是提前将危险距离阈值增大至 40cm,并配合飞控的刹车加速度限制。二是侧向传感器在靠近墙壁时,由于波束角较宽(15°),会同时接收到墙面和地面的反射回波,导致距离读数偏小。解决方法是增加一个高度判断:当无人机高度低于 50cm 时,忽略侧向传感器读数,仅依赖前方避障。

案例复盘:超声波避障的可靠性不仅取决于传感器本身,更取决于安装角度、阈值标定和滤波策略的综合匹配。建议在每次飞行前进行静态标定:将无人机放置在已知距离的障碍物前,对比传感器读数与实际距离,记录偏差值并写入飞控参数。同时,务必在日志中记录每个传感器的原始脉宽数据,便于事后分析异常回波来源。

4.5 常见误区与工程总结

误区一:认为超声波传感器可以完全替代视觉避障。超声波在探测细线、黑色吸音材料、斜面玻璃等目标时存在天然盲区,且无法区分障碍物类型。正确做法是将超声波作为近距离(<2m)补充感知,与视觉或激光雷达形成冗余。

误区二:忽略温度对声速的影响。在 0℃ 到 40℃ 范围内,声速变化约 12%,对应 1m 距离会产生约 4cm 的误差。对于高精度避障场景,必须使用带温度补偿的传感器(如 US-100)或外接温度传感器进行软件补偿。

误区三:所有传感器同时触发导致串扰。当多个超声波传感器同时发射时,彼此的声波会相互干扰,产生虚假回波。解决方法是采用分时触发机制,每个传感器间隔 10ms 以上依次触发,或者使用不同频率的传感器(如 40kHz 与 25kHz 交替)。