☰
基于STM32的无人机智能避障与路径规划系统设计
2026/9/29 19:50:24 网站建设 项目流程

大家聊到无人机避障,通常第一反应不是"能不能做",而是"用STM32,做出来的东西到底稳不稳"。我的答案是:稳不稳,取决于你对MCU算力的把握,以及算法和硬件之间怎么平衡。这套基于STM32的无人机智能避障与路径规划系统,核心目的就是解决"飞行器在高动态环境下,如何快速感知障碍物并生成一条安全可飞的路线",它不是一个玩具DEMO,而是一套从传感器选型、信号采集、姿态解算到避障决策、路径重规划的完整闭环设计。

我最初接触这个课题时,是从南邮电子系统设计的方向出发,最后把它做成了一个可落地的工程原型。整个过程给我最大的感触是:STM32做避障,不丢人,关键是算法要"够用且轻量"。这个项目适合正在做电子设计竞赛、毕业设计,或者想从零开始接触无人机飞控底层开发的工程师,你会从里面看到GPIO怎么拨、PWM怎么发、超声波的时序怎么卡、路径规划怎么在资源受限的MCU上跑出实时性。下面我把整个系统的设计思路、硬件选型、算法实现和调试经历完整拆开讲。

1. 系统整体设计与思路拆解

1.1 为什么无人机避障选择STM32方案

在无人机飞控领域,ST的STM32系列已经堪称"事实标准"。无论是大疆部分早期产品的内部架构,还是大量开源飞控项目(如CleanFlight、BetaFlight、PX4的某些移植分支),底层主控都能看到STM32的影子。这个选择不是偶然,而是由几个硬性指标决定的。

首先是浮点运算能力。STM32F4系列以上带有FPU(浮点运算单元),这一点在做姿态解算时非常重要。无人机在空中每时每刻都在进行姿态更新,姿态解算的核心是四元数更新和滤波融合,这里涉及大量的三角函数、矩阵运算和归一化操作。如果没有硬件浮点单元,纯软件模拟浮点运算,主频即便跑上168MHz,刷新率一旦提到500Hz以上,MCU的算力也会被榨干。

其次是丰富的外设接口。一套避障系统不只是飞控MCU自己在跑,它要挂载的姿态传感器(MPU6050或ICM20602)、避障传感器(超声波、光流、激光测距)、遥控接收机、电调,这些设备各有各的接口协议:I2C、SPI、USART、PWM输入捕获、PWM输出比较。STM32外设的丰富程度刚好能把这些"全部吃下",不需要额外扩展IO芯片,简化了整个硬件设计的复杂度。

最后是生态和调试工具链。Keil MDK + STM32CubeMX这套组合,大大降低了底层驱动开发的门槛。你用CubeMX可以快速完成GPIO、定时器、DMA、I2C、SPI的初始化配置,不需要像以前那样对着寄存器手册一行一行写。对于系统设计型项目,这种"快速出原型、后期精确调参"的开发节奏非常友好。

1.2 系统架构与模块划分

这套系统的整体架构,我按照"感知-决策-执行"三层来划分。

感知层由固定在机身多个方向的避障传感器组成,负责实时采集无人机与周围障碍物的距离信息。我采用的传感器组合是:前方和下方各一路超声波传感器,用于近距离高精度测距;底部再增加一路光流传感器,用于无GPS环境下的水平速度测量和辅助悬停定位。这个组合的成本较低,数据更新率也能满足避障要求。

决策层是核心,跑在STM32F407主控上。它接收传感器的数据,经过滤波和坐标系变换之后,与当前的飞行姿态进行融合。然后避障算法模块基于当前的速度矢量和障碍物分布,判断是否存在碰撞风险;如果存在,则调用路径重规划模块,生成一条临时避障路线,并输出给姿态控制环。

执行层就是电调和电机。STM32通过定时器输出四路PWM信号,控制电调驱动电机旋转。这部分要注意的是PWM更新频率和电机响应速度的匹配,避障路径规划得再好,如果电机响应跟不上,飞控的动态性能就会被拉垮。

整个系统的数据流向一句话总结:传感器原始数据 -> 预处理滤波 -> 状态估计 -> 碰撞检测 -> 避障路径生成 -> 姿态指令 -> PWM输出 -> 电机响应 -> 无人机实际位移 -> 再影响传感器数据。闭环就是这么形成的。

2. 关键硬件选型与传感器配置

2.1 飞控主控与IMU选择

主控我最终选了STM32F407VET6,主频168MHz,内置1MB Flash和192KB RAM,完全足够承载避障算法和飞控算法同时运行。有人可能问,为什么不用STM32F103?F103价格更低、资料更多,但算力确实捉襟见肘。避障算法如果要跑A*或者Dijkstra的栅格版本,在高分辨率地图下,F103的CPU占用率会经常逼近极限,导致姿态控制中断响应变慢。飞行控制最怕的就是控制延迟不稳定,一旦中断响应被阻塞,飞机姿态就可能瞬间失控。

IMU用的是MPU6050,这款六轴传感器虽然发布很多年了,但其性能和成熟度无可挑剔。I2C接口连接STM32,通过DMA方式读取数据,减少CPU的中断负担。MPU6050内部的DMP(数字运动处理器)还可以直接输出四元数,但这个项目里我并没有启用DMP,而是选择自己用Mahony互补滤波算法解算姿态。原因有两点:一是DMP的姿态输出频率不够高,固定为100Hz左右,而自解算可以轻松做到500Hz甚至1kHz;二是避障系统需要精确的角速度数据来判断飞机的旋转趋势,DMP的输出在动态响应上慢半拍。

加速度计和陀螺仪的安装位置也有讲究。安装在机架正中心、尽量靠近飞机的几何重心,可以减少机体振动对传感器数据的干扰。我在安装IMU时还垫了一层减震泡棉,实测下来能显著减少高频振动对加速度计数据的污染。

2.2 避障传感器选型与布局

避障传感器是这套系统的"眼睛",选什么类型直接决定了系统的感知能力上限。我对比了超声波、激光雷达和视觉传感器三种方案。

超声波传感器(HC-SR04)成本最低,测距原理简单,精度在2cm到400cm范围内表现不错。它的最大问题是方向性差、波束角大,导致测得的距离值有时不是正前方障碍物的距离,而是斜前方散射回来的回波。但由于它价格便宜、接口简单,我最终在前后左右四个方向各布置了一路,组成环形探测阵列。超声波的数据更新率在20Hz左右,对低速避障场景来说已经够用。

激光雷达(如TFmini单点激光)精度高、方向性好,更新率可达100Hz以上,但单价是超声波的十倍以上。如果预算充足,建议在正前方加装一路激光测距,用于高速飞行时的远距离探测。我在这个项目里的处理方式是:正前方同时挂超声波和激光测距,超声波负责近距离(0.1-1米)的精确测距,激光负责远距离(0.3-5米)的提前预警。两路数据输入避障算法后,取"安全保守值"作为决策依据。

光流传感器选的是基于Pixart PAW3902方案的模块,通过SPI接口输出位移值。它本质上是一个小型的图像传感器,通过连续帧的纹理追踪来计算水平位移。在没有GPS的室内定位场景下,光流是水平位置估计的核心来源。

布局方面要注意传感器之间的相互干扰。四路超声波如果同时触发,彼此的回波可能串扰。所以我在软件里做了"分时触发"机制:先触发前方,等它返回结果后再触发后方,然后是左方和右方。这样把四路超声波的平均更新率降低到5Hz左右,但这在室内低速飞行场景下属于可接受的折中。激光传感器因为方向性好,不影响,可以一直工作。

2.3 电源与电机系统匹配

这一块容易踩坑,很多人第一次做无人机经常忽略电源系统的稳定性。STM32和传感器需要5V和3.3V供电,而电机电调直接吃电池电压(我用的3S锂电池,满电12.6V)。如果电调BEC输出的5V质量差,或者纹波大,高速电机运转时会产生强烈的电磁干扰,轻则传感器数据跳动,重则MCU直接复位。

我的做法是分别供电:电调BEC单独给接收机供电,STM32主控单独用一路稳压模块(如LM2596或MP1584降压模块)从电池取电。两路电源在物理上分开,只在电池端共地。这么做能极大提升系统稳定性。另外,STM32的ADC采集电池电压时,采样引脚前要加一个分压电阻和滤波电容,否则电机启动瞬间电压跌落会被ADC误判为低电压,触发系统的低电保护逻辑。

电机我选的是2204-2300KV配1045桨,这个组合在3S电池下能提供约400-500g的单电机推力,四轴总推力超过1.6kg,而整机重量控制在850g左右,推重比接近2:1。这个余量保证了避障机动时有足够的动力储备,不会因为避障时突然拉高或侧移导致动力饱和。

3. 避障算法与路径规划落地

3.1 障碍物感知与数据融合

传感器拿到的原始数据不能直接用,必须先经过预处理。超声波传感器的原始数据跳动很大,尤其在室内有装饰物、家具边缘的情况下。我在代码里做了一个滑动窗口中值滤波:每次取最近5次测距结果,排序后取中位数作为有效值。这个操作能很好地过滤掉随机尖峰和偶发的错误回波。

中值滤波之后,数据还要进行一次"合理性检验"。比如一帧数据在极短时间内从一个数值跳变到另一个完全不合常理的数值(比如0.2米突然变成3.5米),这大概率是超声波在打向斜面后回波丢失导致的,此时算法应丢弃这个点,采用上一次的有效历史值。

多传感器的数据融合我采用的是简单的"优先级加权":在近距离(小于1米)范围内,超声波权重更高,因为它的近距离盲区小;在远距离(大于1米)范围内,激光测距仪的权重更高,因为它的波束更窄、方向更准确。融合后的障碍物距离值会进入避障决策模块。

IMU的数据融合同样重要。加速度计在静态时姿态估计准确,但动态飞行时,机体的线性加速度会污染重力加速度的提取;陀螺仪的短时精度好,但存在积分漂移。我采用Mahony互补滤波算法,将加速度计和陀螺仪的数据融合,把高频噪声交给加速度计数据修正,把长期漂移通过比例积分项消除。这个滤波算法在STM32上,500Hz更新率下CPU占用率只有不到5%,非常轻量。

3.2 路径规划算法对比与选型

路径规划算法是避障系统的"大脑"。我在这套系统上实际尝试并测试过三种经典算法,各有优劣。

人工势场法的思路最简单:把目标点视为"引力源",把障碍物视为"斥力源",飞机在势场中沿合力方向运动。这个算法的实时性极高,计算量很小,适合STM32上跑。但它的致命问题是容易陷入局部极小值点,比如U形障碍物会把飞机困在底部出不来。

A算法在栅格地图上搜索路径,全局最优性强,但内存开销和计算量随着地图分辨率上升而急剧增大。我在STM32F407上跑一个80x80的二维栅格地图,A每次搜索的最坏耗时在50ms左右,这会导致避障响应有可感知的延迟。

RRT(快速扩展随机树)算法的思想是在空间中随机采样,逐步构建一棵向着目标点生长的树,最终找到一条可行路径。它的优势是计算量可控,在高维空间中比较高效,而且天然适合处理非完整约束。但RRT生成的路径不够平滑,需要配合路径平滑算法使用。

最终我在项目中采用了"人工势场法 + A混合"的架构:正常飞行时使用人工势场法进行局部实时避障,一旦检测到飞机陷入局部极小(连续1秒速度方向振荡且位置几乎不动),则启动A算法在局部栅格地图上规划出一条全局绕行路径,引导飞机脱离困境。这样兼顾了实时性和全局性,这也是不少商业飞控在避障模块采用的策略。

3.3 STM32上的关键实现细节

算法在STM32上的实现有几个关键细节值得单独拿出来讲。

第一,定时器资源规划。STM32F407有多个高级定时器和通用定时器,我的分配方式是:TIM1产生四路PWM驱动电调,TIM2作为姿态控制的1kHz时基,TIM3作为避障算法的50ms周期调度器,TIM4负责超声波测距的输入捕获。每个定时器的中断优先级配置非常关键,控制环的中断优先级必须高于避障算法的优先级,这样才能保证姿态稳定优先于避障决策。

第二,超声波测距的实现。HC-SR04的触发信号是高电平至少10us的脉冲,我通过GPIO输出实现。回波信号是一个宽度与距离成正比的高电平脉冲,用输入捕获模式测量脉冲宽度。计算公式是:距离(cm) = 回波时间(us) / 58。为什么除58?因为声速约340m/s,往返一次,距离 = 时间 × 声速 / 2,换算成厘米并带入340m/s后就是时间(us)除以58。这个细节很多新手容易搞错,直接导致测距结果偏差一倍。

第三,避障决策的状态机设计。避障逻辑不能写成一锅粥的条件嵌套,我用了一个有限状态机:正常飞行、潜在冲突检测、紧急避障、绕障飞行、路径恢复这五个状态。状态之间通过明确的触发条件转移,比如当融合后的前向距离小于安全阈值且水平速度大于0.5m/s时,状态从"正常飞行"跳转到"紧急避障"。这个状态机让整个决策过程逻辑清晰,也方便调试时快速定位问题。

// 避障主逻辑状态机示例(简化版) typedef enum { OBSTACLE_STATE_NORMAL, OBSTACLE_STATE_POTENTIAL, OBSTACLE_STATE_AVOIDING, OBSTACLE_STATE_RECOVERY } obstacle_state_t; void obstacle_task_run(float front_dist, float speed, float* cmd_yaw, float* cmd_pitch) { switch (obstacle_state) { case OBSTACLE_STATE_NORMAL: if (front_dist < SAFE_DISTANCE_MAX && speed > SPEED_THRESHOLD) { obstacle_state = OBSTACLE_STATE_POTENTIAL; } break; case OBSTACLE_STATE_POTENTIAL: if (front_dist < SAFE_DISTANCE_MIN) { obstacle_state = OBSTACLE_STATE_AVOIDING; // 紧急刹车:输出航向偏转+减速指令 *cmd_yaw += YAW_AVOID_ANGLE; *cmd_pitch -= BRAKE_PITCH_VALUE; } break; case OBSTACLE_STATE_AVOIDING: // 持续偏转的同时检测侧向是否安全 if (front_dist > SAFE_DISTANCE_MAX) { obstacle_state = OBSTACLE_STATE_RECOVERY; } break; case OBSTACLE_STATE_RECOVERY: // 缓慢回正到原航向 *cmd_yaw -= YAW_RECOVERY_STEP; if (fabs(*cmd_yaw) < YAW_DEADBAND) { *cmd_yaw = 0; obstacle_state = OBSTACLE_STATE_NORMAL; } break; } }

第四,控制环路的稳定。避障算法输出的是位置级别的指令,需要经过位置控制环和姿态控制环才能转化为电机的PWM量。我的控制结构是串级PID:外环是位置控制(输出期望横滚角和俯仰角),内环是姿态控制(输出期望角速度和电机PWM修正量)。在STM32上,外环频率跑100Hz,内环频率跑1kHz。串级PID的参数需要先调内环再调外环,否则即便避障指令很准,飞机跟着指令飞的过程也会出现严重的振荡甚至发散。

4. 系统联调、测试与常见问题排查

4.1 真机联调流程

真机调试是整个项目中风险最高、最有意思的部分。我的建议是真的别急着上桨,分步骤来。

第一步是"桌面静态测试",不上桨、不装电池,只给飞控供电。用遥控器观察接收机信号是否正常解析,用上位机查看IMU数据是否随姿态变化而变化,用示波器或逻辑分析仪确认PWM波形的周期和脉宽是否在正常范围。这一步主要验证底层驱动和控制通路是否打通。

第二步是"无桨动力测试",装上电池但拆下螺旋桨。推油门测试电机是否顺畅转动,电调能否正确响应PWM变化,电源系统在各电机同时转动时的纹波是否在安全范围内。同时也顺便检查一下电机转向是否配置正确,相邻两个电机应该反方向旋转,这样才能抵消反扭矩。

第三步是"系留飞行测试",用绳子把无人机轻轻系在地面固定物上,限制作小幅度飞行。这一步特别重要,我第一次上电真机时就是因为PID参数没调好,飞机一起飞就猛烈侧翻,直接被绳子拉住没摔坏,这是新手保命的一步。

第四步才是"自由飞行测试",在室内空旷场地进行避障测试。注意要在飞机下方铺设保护网或泡沫垫,防止意外坠落损坏设备。

4.2 常见问题排查记录

我在这套系统调试过程中遇到过不少问题,挑几个典型的说一下。

电机启动不同步,起飞瞬间机身剧烈旋转。这个问题多半是电调校准不一致导致的。电调在接收PWM信号时对最小油门值的判断有偏差,有的电机先启动,有的后启动。解决方法是做一次电调行程校准:将油门通道打到最高,上电,等待电调发出确认音,然后油门拉到最低,再次确认。所有电调必须同时完成校准,顺序不能乱。

超声波传感器数据频繁跳变到最大值。排查下来发现不是因为真的没有障碍物,而是超声波探头在无人机电机高频运转时受到了电磁干扰。解决思路有两条:一是给传感器供电加滤波电容,把电源上的毛刺滤掉;二是把超声波的回波检测引脚加一个简单的RC低通滤波,抑制高频噪声。注意不要过度滤波,否则回波信号的上升沿会变缓,导致测距精度下降。

避障系统误触发,明明前方没有障碍物,飞机却突然减速或转向。检查发现是超声波传感器的波束碰到了机架自身。探头安装角度如果朝向机臂内侧,桨叶旋转产生的气流和机臂反射的回波都会被当作障碍物。重新调整探头的安装角度,向外倾斜约15度,让波束避开机架结构后,误触发现象消失。

卡尔曼滤波参数不收敛,姿态解算发散。这个问题的根源是我把卡尔曼滤波的过程噪声和测量噪声参数随意初始化了。滤波器的协方差矩阵初始值不能乱给,需要结合传感器的实际噪声统计来估计。我实测了一批加速度计和陀螺仪的静态数据,算出方差,再把这些方差填入测量噪声矩阵。如果你不想陷入卡尔曼参数调优的深坑,用Mahony互补滤波会省心很多。

4.3 几条实战心得

最后分享几条我自己练出来的心得。

第一,所有传感器的数据都先打印出来看一眼。我在工程里写了一个简洁的数据输出调试命令,通过串口以1Hz的频率输出前方测距值、当前状态机状态和期望指令,这样只靠一个串口助手就能在野外快速定位问题,不用带电脑连IDE开仿真。

第二,安全逻辑永远优先于避障逻辑。当系统检测到电池电压过低、遥控信号丢失、姿态角异常等情况时,必须遵循"优先稳住飞行器"的原则。我的实现是:遥控信号丢失后立即切入自稳悬停模式,持续悬停3秒;如果信号没有恢复,则执行逐步下降指令,以低速率缓降到地面。这个逻辑比"继续执行避障"安全得多,因为遥控信号丢失时你根本不知道外部环境发生了什么变化。

第三,调参时一次只改变一个参数。我见过不少人调PID时同时动几个参数,结果飞机发散之后根本不知道是哪个参数引起的。正确做法是每次只调一个,记录响应曲线,再进入下一步。我习惯把内环P、内环D、外环P、外环D、避障安全距离、避障偏转角这六个参数单独拆开,调试完一个再动下一个。这种"单变量实验"的思路虽然慢,但问题一旦出现就能快速定位到具体环节。

第四点也是我最想强调的,基于STM32的无人机避障系统,最难的不是算法本身,而是算法与硬件平台之间的"适配"。同样的A*算法,在PC上跑和STM32上跑,性能预期完全不同。做这类设计时,一定要先想清楚硬件边界,再决定算法复杂度和调度方式。用STM32去做避障,践行的是一个非常朴素的工程理念:在有限的资源里,用合理的架构和严谨的逻辑,解决现实中真实存在的问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询