4、超声波避障实战:超声波传感器在无人机上的安装、数据读取、距离计算与简单避障逻辑
超声波避障是无人机低成本、近距离感知方案中最成熟的技术路径之一。与视觉或激光雷达相比,超声波传感器以毫秒级响应、厘米级精度和极低的算力需求,在室内定点悬停、低空贴地飞行、狭窄通道穿越等场景中依然不可替代。本章从传感器选型与安装布局出发,逐步讲解数据读取时序、距离解算方法,并最终落地到一套可运行的阈值避障逻辑。通过本章实战,你将掌握从硬件接线到飞控决策的完整闭环能力。
4.1 超声波传感器选型与安装布局
无人机超声波避障的传感器选型需综合考虑量程、波束角、重量和接口类型。目前主流方案包括 HC-SR04(低成本、5V 供电、量程 2cm-400cm)、US-100(带温度补偿、UART/GPIO 双模式)、以及工业级 MaxBotix 系列(抗噪能力强、模拟/串口输出)。对于 250mm 轴距以下的小型无人机,建议选用重量小于 5g、量程 20cm-200cm 的传感器,避免过大的波束角(>60°)导致地面反射误判。
安装布局是决定避障可靠性的第一道关卡。以四旋翼为例,推荐在机架前后左右四个方向各安装一枚传感器,安装角度向下倾斜 10°-15°,使波束中心线指向飞行方向前方 1.5m-2m 处的地面交汇点。这样做有两个好处:一是避免螺旋桨下洗气流直接冲击传感器振膜,二是让传感器在倾斜姿态下仍能探测到前方障碍物而非地面。底部传感器应安装在机架中心板下方,使用 3D 打印支架或橡胶减震柱隔离高频振动,防止电机振动导致回波信号抖动。
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-SR04 | US-100 | MaxBotix MB1240 |
|---|---|---|---|
| 工作电压 | 5V DC | 3.3-5V DC | 3.3-5V DC |
| 量程 | 2-400cm | 2-450cm | 1-700cm |
| 波束角 | 约 15° | 约 15° | 约 10° |
| 接口 | GPIO(Trig/Echo) | UART / GPIO | UART / 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; // 向左避让
}
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 交替)。