拓冰建站拓冰建站
首页 / 资讯中心 / 正文

无人机PID调参从入门到实战:原理、工具与调试流程详解

玩无人机的朋友几乎每个人都会在某一天被“PID调参”这几个字绊住。飞控装好了电机转了遥控器对频了结果一解锁推油门飞机要么像跳踢踏舞一样抖个不停要么悬停三五秒就开始向一个方向飘甚至猛地一掰滚转就直接翻过去。这种时候老飞手会递给你一句话去调PID。但PID到底是什么调的时候每个参数旋钮该往哪个方向拧拧到什么程度才算对很多人其实是一头雾水的。这篇文章是我自己做飞控调试这几年攒下的一份实战笔记围绕姿态控制里的PID调参展开从控制原理、工具准备、调参顺序到常见的抖动、漂移、电机发热等诡异问题排查都会聊到。不管你是用PIXHAWK这类开源飞控还是自己在STM32、ESP32上写控制代码这套思路基本通用。内容会尽量讲人话能直接抄作业的地方绝不绕弯子。1. 内容整体设计与思路拆解1.1 先把PID是什么说清楚PID是比例Proportional、积分Integral、微分Derivative三个词的首字母。它干的事情特别朴素拿当前状态和目标状态做差然后用这个差值去计算控制量。无人机想保持水平飞控里面的陀螺仪测出来当前横滚角是3度而期望角度是0度那这个“3度偏差”就是输入PID算法根据它算出“要让电机转多快”把飞机拉回水平。可以用一个生活化的例子来理解。你拿着一杯水往杯子里倒目标是倒到刻度线。如果水位离刻度差得远你会开大水流快速接近这就是比例作用如果差得不多就放慢水流防止一下倒过头这是类似微分作用的预判如果倒到接近刻度时总是差那么一点点到不了你会持续小流量补充直到正好达到刻度这就是积分在消除静差。无人机姿态控制本质上就是这套逻辑只是它在1秒内要重复几十次上百次测量、计算、输出、再测量。PID不是一个高深的数学概念它就是一个固定公式加上三个系数问题在于这三个系数跟具体飞机挂钩。机架大小、电机响应速度、螺旋桨尺寸、电池电压、重心位置都会影响同样一组参数下的飞行表现。所以换了一个机架或者换了一组桨原参数就可能完全不适用了。1.2 调参目标不是“稳定”而是“稳准快”的平衡聊调参之前先得明确目标。很多人以为调参就是为了让飞机不抖、不飘其实“不抖”只是及格线。真正的调参目标是在三个指标之间找到平衡响应速度快、超调量小、稳态误差小。如果飞机在受到扰动后迅速回到想要的角度说明响应快如果回去的过程中冲过头、来回摆动几下才稳住说明超调量太大如果始终回不到准确位置停在一个偏了点的角度上说明有静态误差需要积分来消除。理想曲线是受到扰动后平滑、快速、一次到位地回到目标值这就是很多人说的“PID最优曲线”。但现实中这三个指标互相牵制纯粹追求其中一个必然牺牲另外两个。以横滚通道为例你希望打杆时飞机能干脆利落地滚转过去但又不能过头导致姿态过冲。如果你为了求快把比例系数调得很大飞机确实跟手了但外界稍有扰动机身就会高频抖动这就是典型的“快而不稳”。调参就是一个找平衡点的过程。1.3 先别急着拧参数控制器是分层级的PID在无人机里不是只有一个而是多个PID按级联结构叠在一起。以前做PIXHAWK、ArduPilot这类开源飞控的装调测试时这个层级关系是首先要弄清楚的。以姿态控制为例最内层是角速度环也叫内环它负责控制飞机绕各轴旋转的快慢比如横滚角速度外层是角度环它负责控制飞机倾斜的角度输出的是期望角速度给内环再往外还有位置环负责控制飞机在空间里飞向哪里输出的是期望角度。简单说内环控制“转得多快”外环控制“转到哪”位置环控制“飞去哪”。这个结构决定了调参顺序是严格的先内环再外环最后位置环。你如果跳过内环直接去动位置环的参数飞机基本不可能调出好手感。很多新手拿着地面站界面一头扎进位置环参数里乱改结果越改越飘就是这个原因。2. 环境准备与工具选型没有这几样别急着动手2.1 飞控硬件PIX、STM32、ESP32怎么选调参有点类似看病先得有一台能稳定测量身体状况的设备。飞控就是无人机的“身体感受器”传感器数据准不准直接影响后面所有调试判断。目前常见的选择有三条路线。第一条是PIXHAWK、ArduPilot系列开源飞控硬件成熟、文档全、配套地面站完善适合绝大多数玩家和行业用户。如果你搜过“基于开源飞控PIX的无人机装调与测试”大概率也是走的这条路。第二条是用STM32系列单片机自己画板子、自己写控制程序这条路线对硬件和嵌入式要求高但优势是完全可控适合学习底层算法。第三条是ESP32开源无人机方案近几年挺火成本很低、社区资料多适合做桌面级小飞机、迷你穿越机或者拿来做控制算法的验证平台。硬件选择的逻辑其实很简单你是想先把飞机飞起来、把调参搞明白还是想连硬件和控制代码一起研究。前者选PIX或同类成品飞控后者选STM32或ESP32平台。无论选哪条传感器才是关键。陀螺仪和加速度计的安装要牢固减震棉不能压太死飞控安装方向要跟机架指向一致否则后面调的再辛苦也没用因为数据源就是错的。2.2 地面站与调参界面在哪个菜单改什么参数调PID的主要阵地是地面站。PIXHAWK常用的是QGroundControlQGCArduPilot常用的是Mission Planner两个软件界面有些区别但基本逻辑一样连接飞控后进入参数设置页找到对应的PID参数组。以ArduPilot为例调试姿态控制时最常关注的是ROLL、PITCH、YAW这三个轴的角速度环PID参数一般叫RATE_ROLL_P、RATE_ROLL_I、RATE_ROLL_D位置环角度环参数则类似STB_ROLL_P、STB_ROLL_I。QGC里PX4飞控则对应MC_ROLLRATE_P、MC_ROLLRATE_I、MC_ROLLRATE_D等参数。注意不同固件的参数命名不完全一致但思路完全一样先搞清楚当前调的是哪一层环路。调参现场的一个建议是先在参数列表里把当前生效的PID参数全部截图保存。很多人飞完一个架次觉得手感不错结果不小心拨错参数没有保存重新上电后手感全变连不回去了。保存一份基线参数表相当于给调参上了一道保险。2.3 模拟器与仿真环境先“炸”在电脑里在真机上反复试错效率低且有风险。现在的开源飞控基本都支持软件在环仿真SITL可以在电脑上模拟一个完整的无人机模型地面站连接模拟飞控后你可以用遥控器在电脑里飞调参数、看曲线炸就炸了重启就好。另外Gazebo、AirSim这类仿真环境还能配合视觉传感器做进阶开发不过单就调PID角度而言SITL已经足够。MATLAB里的PID Tuner工具也很实用对某些特定模型可以直接根据传递函数给出推荐的PID初值。我在调新机架时习惯先在SITL里把大致参数范围跑一遍确认各个通道的响应曲线大致合理再上真机。但必须提醒一句仿真里的电机模型、桨效率、延迟和真机差距不小仿出来的好参数只能当起点不能直接照搬。真机环境里震动、风扰、重心偏移这些因素仿真很难完全模拟出来。3. 核心细节与基本原理位置式、增量式与噪声处理3.1 位置式PID和增量式PID差别就在输出方式不少朋友搜过“位置式PID 增量式PID 抗噪声”这类关键词这个点确实值得展开。位置式PID计算的是当前时刻的绝对控制量公式里带着误差的积分项输出值直接是给执行机构的绝对大小。增量式PID算的是“相对于上一次输出的增量”公式里用的是前后两次误差的差输出的是增量实际输出等于上一次输出加上这次算出的增量。这两者最大的区别在于两点。一是执行机构不同位置式适合需要直接给出绝对位置的场合比如控制舵机角度增量式适合增量型执行机构比如给电机调速器的PWM增量、步进电机的脉冲数。二是抗噪声表现位置式的积分项会累积历史误差如果传感器有长期漂移或者执行机构有死区可能积分饱和增量式因为只考虑最近几次误差对累计漂移没那么敏感但微分项放大了噪声实际工程里通常都会给微分加一阶低通滤波。写代码时有个很直观的区别。下面给出一个简化的位置式PID示例class PositionPID: def __init__(self, kp, ki, kd, dt): self.kp kp self.ki ki self.kd kd self.dt dt self.integral 0.0 self.prev_error 0.0 def update(self, setpoint, measurement): error setpoint - measurement self.integral error * self.dt derivative (error - self.prev_error) / self.dt self.prev_error error return self.kp * error self.ki * self.integral self.kd * derivative而增量式PID则通常写成这样class IncrementalPID: def __init__(self, kp, ki, kd, dt): self.kp kp self.ki ki self.kd kd self.dt dt self.prev_error 0.0 self.prev_prev_error 0.0 def update(self, setpoint, measurement): error setpoint - measurement delta (self.kp * (error - self.prev_error) self.ki * error * self.dt self.kd * (error - 2*self.prev_error self.prev_prev_error) / self.dt) self.prev_prev_error self.prev_error self.prev_error error return delta无人机的姿态控制器大多采用的是类似位置式PID加积分限幅、微分低通滤波的形式因为飞控直接计算出来就是给电机的PWM值或归一化油门值。增量式则更常见于云台、舵机、机器人底盘这类增量执行机构。3.2 KP、KI、KD三个参数各自坑在哪三个参数每个都有各自的脾气。KP比例决定了控制对误差的敏感程度。KP太小飞机反应迟钝姿态回正慢像在水里飞KP太大任何一个微小扰动都会被放大飞机会高频抖动。实操中发现在悬停姿态下飞机出现快速抖动多半是KP偏大掰杆后回正缓慢多半是KP偏小。KD微分起阻尼作用它根据误差变化趋势进行预判抑制过冲。形象地说KP是往前推的力KD是拉住别冲过头的力。加大KD能压住高频抖动和超调但KD过大会把传感器噪声放大成剧烈的“声音震颤”电机发出类似高频啸叫或“嗡嗡”的酸爽噪音这时需要先降低KD再检查滤波。KI积分负责消除静态误差。当飞机长时间偏向一侧、悬停时缓慢漂移说明需要积分把它慢慢拉回来。但KI过大飞机容易在姿态回正时产生“慢动作过冲”就是那种来回晃荡几次才停下。而且积分项在电机饱和时容易越积越多导致回复时反应过度这就是积分饱和问题需要做积分限幅。之前我在网上见过很多“PID参数口诀”什么“P大抖、D大跳、I大漂”之类虽然有点粗糙但方向上是对的这三个参数一个管灵敏度一个管阻尼一个管长期偏差调的时候心里要始终清楚现在动的是哪个维度。3.3 控制周期与传感器滤波影响调参手感的关键细节PID参数不是孤立起作用的它跟控制频率、传感器滤波息息相关。控制频率决定了PID每秒运行多少次。PIXHAWK系列的姿态控制频率通常为250Hz或500Hz也就是每2到4毫秒跑一次控制循环。如果控制频率设置偏低PID的响应节奏跟不上飞机的姿态变化参数再准也会觉得“肉”。当然控制周期和传感延迟也要匹配。传感器滤波更是一个隐形杀手。飞控里一般会对陀螺仪数据做低通滤波来消除机体高频振动混入的信号。滤波太弱高频噪声进到微分项飞机抖得像筛子滤波太强信号被平滑掉PID看到的是“延迟且钝化”的姿态数据响应也会变慢。很多人调了半天参数没效果最后发现是滤波截止频率设得太保守角度环读取到的数据本身就滞后了。这也解释了为什么同样一组PID参数在白天和晚上、新电池和旧电池下手感完全不同。电池电压影响电机响应速度进而改变整个系统增益所以正式调参最好每次都使用同一种电池状态并且从满电状态开始前后对比才公平。4. 实战调参流程从“能起飞”到“飞得好”4.1 调参前的体检机械、电机、重心一个不能少正式进入调参环节之前先做一遍整机检查。机架所有螺丝重新锁紧尤其是电机座螺丝和飞控固定螺丝螺旋桨没有破损、配平问题电调校准一致重心位置与飞控几何中心基本重合。这一步看起来无关紧要但PID调参的所有结论都建立在机身状态稳定的前提下。机架有一个螺丝松动表现出来的异常和PID失调几乎一样容易让调试误入歧途。电机选型与机架匹配也是关键。电机和桨的搭配要和机架重量、目标起飞重量匹配。如果电机推力余量太小PID无论怎么调都会觉得响应迟滞推力余量过大电机死区又会明显控制量在小油门附近不灵敏。PIX的一键自检功能可以帮你检查电机输出方向和传感器数据建议起飞前跑一遍。4.2 四步法暴力调参先P再D最后I很多人第一次调参喜欢三个参数一起改这是最大的误区。三个参数互相影响一起改之后你根本不知道异常是由哪个参数引起的。我的做法是三步走每次只动一个参数且每次只动一个轴。第一步把I和D设到很小甚至归零先把P调出来。比如调试ROLL角速度内环时先给当前P一个较低初值然后每次增加20%到30%。观察现象。加大P的过程中飞机会先表现为回正力度变大然后到某个值附近出现持续的高频抖动有点像弹簧秤拉过头来回振。这时候记下临界P值然后把P取临界值的大约70%作为工作点。第二步加入D。D的初始值同样给很小逐次增加。合适的D能让飞机响应更干脆也就是超调减少、振荡收敛更快。如果D调得过大飞机会出现刺耳的“尖叫”或细腻而快速的抖动甚至推油门时电机声音明显变化。退回上一个值即可。第三步加入I。先把I设为一个估算值。ArduPilot和PX4一般都有推荐初值可以从推荐值的一半开始。观察悬停时是否向某个方向缓慢漂移无法回正。如果漂移缓慢增大I直到飞机能稳定保持在目标姿态附近。I的值不宜追求极致差不多能消除静差即可。每一轮参数修改后至少要飞一个完整的悬停加小幅机动架次记录曲线再改下一轮。整个过程大概需要3到5个电池起落急不来。4.3 自动调参与人工细调怎么配合现在主流开源飞控都有一键自动调参功能比如ArduPilot的AUTOTUNE和PX4的AUTOTUNE模式。自动调参的基本思路是飞控在飞行中主动给某个轴加上小幅扰动然后根据机体的响应计算合适的PID参数整个过程不需要人工干预。自动调参在绝大多数情况下都能给出不错的初值尤其适合没有经验的玩家。但它有几个局限一是在风大、GPS信号差的地方自动调参结果不可靠二是自动调参偏向于输出“相对保守”的参数不会帮你压榨出手感上限三是如果机械振动或传感器噪声本来就很大自动调参容易把D项设得偏高。我的习惯是先用自动调参跑出一个安全基线然后在此基础上人工细调把每个轴的手感逐个确认。这样既节省时间又避免了“自动调参完事大吉”的坑。4.4 试飞记录与日志数据回放调参不能只靠手感“感觉飞机顺滑了”这个描述不太可靠因为人的感觉有太多干扰因素。真正靠谱的做法是看飞行日志里的曲线。QGC和Mission Planner都能记录详细的飞行数据包括期望角速度、实际角速度、PWM输出等。调试时把日志导出来重点看每一次人为打杆后的响应曲线。如果实际角速度曲线能快速跟随期望值且没有明显过冲和振荡说明这一轴的调参合格。如果实际值像“心电图”一样锯齿状抖动或者跟踪期望值总是慢半拍那就对应着前面的问题按现象逐项排查。很多老手能通过看飞机声音判断阻尼状态但在早期阶段日志数据远比直觉可靠。5. 常见问题与排查技巧实录5.1 高频抖动、低频晃荡、神秘共振怎么分辨飞控异常表现最容易被误判。排查时必须先把“机械振动”和“控制参数不当”区分开。机架或桨叶振动引起的抖动有固定频率无论你切不切自稳模式都存在甚至推油门改变转速时会在某个油门点特别明显。这时先检查桨平衡、电机轴承、机架螺丝不要动PID。如果切换成自稳模式后抖动消失或者抖动频率跟打杆有关才考虑PID问题。高频抖动肉眼能看见机臂细微抖动声音发紧优先怀疑P过大或D过大。处理方法先记录当前参数然后单独减小D看是否改善再单独减小P。低频晃荡整个飞机像喝醉了一样左右摇摆优先怀疑D不够、P偏小导致增益不足或者外环角度环P过大引起低频振荡。还有一个容易误判的情况机身多个模态耦合看起来像PID振荡实际上是飞控减震棉太硬、GPS支架晃动等结构因素。这种耦合问题通常伴随特定转速或特定动作触发而不是全油门范围都抖。遇到这种情况先处理机械结构别死磕参数。5.2 悬停漂移、掉高、电机异常发热悬停时缓慢漂移、怎么回中都回不到定点多半是角度环静态误差或GPS定点模式下位置环参数不合适。可以先在自稳模式下观察如果自稳悬停不漂说明姿态控制没问题问题在位置环或光流、GPS等外部传感器。如果自稳也漂就需要调高内环或角度环的I值。掉高问题比较复杂可能是油门曲线配置不当也可能是垂直速度环PID不合适甚至电机推力不足。先把油门曲线与悬停油门校准好再检查垂直速度环。如果电机异常发热除了检查电调、电机选型外PID方面最可疑的是I值过大或P值过大导致控制量频繁波动电机在做无用功发热。5.3 PID前馈怎么用它不是替代品而是加速器搜索热词里“pid前馈怎么使用”出现频率挺高确实值得单独说。前馈和PID反馈是两回事PID根据误差产生控制量是出了问题才反应前馈是直接根据目标值的变化量提前给出一个预估控制量相当于“还没出误差我就先动了”。在无人机上常见的是角速度前馈典型参数如ArduPilot里的RATE_FF_ENABLE或PX4里的MC_ROLLRATE_FF。它的作用是打杆或收到上层姿态指令时提前给出一部分输出加快系统响应。前馈调得好飞控会明显更跟手前馈调得过大飞机在急停或快速换向时会过冲甚至震荡。前馈必须在反馈PID已经调好的基础上使用。很多人基础PID都没调顺就想靠前馈救场结果越搞越乱。正确做法是先调好反馈再慢慢加前馈观察快速打杆时的超调。风大或载荷变动频繁的场景前馈尤其有用因为它不需要等误差出现就能补偿扰动。5.4 问题排查速查表调试多了我发现很多问题都可以按固定套路处理。整理一个速查表现象可能原因检查顺序处理建议悬停高频抖动声音发紧P过大或D过大固定电机、桨、机架螺丝查日志看抖振频率先降D后降P每次减10%-20%打杆回正过冲来回晃荡D不足阻尼太小确认D有值且未被滤波过度逐步增加D观察超调是否收敛悬停缓慢漂移回不正I不足或有静差优先切自稳模式对比逐步增加I并确认积分限幅合理油门某一位置共振机械共振或桨平衡问题静态推油门复现检查桨平衡和机臂刚度别动PID电机起飞后发烫I过大或P过大或滤波不当检查电机温度和控制量波动降低I或P检查滤波器设置自动调参后仍不跟手反馈参数保守或前馈未开对比日志中期望与实际的延迟先小幅加P再加前馈定点模式乱飘自稳正常位置环参数不合适检查GPS、光流数据稳定性调位置环P和D但先确认传感器正常5.5 级联PID与模糊PID更复杂的控制策略什么时候用有的朋友已经调完单级PID觉得性能不够开始搜“级联PID控制”“模糊PID”。先说级联PID它的核心思想是内环和外环各自有独立的PID控制器外环输出作为内环目标值。无人机姿态控制里普遍就是这种结构所以在PX4这类飞控上调参时时刻要清楚自己在调内环还是外环参数。如果你在自己设计控制器级联PID能让各环互不干扰但副作用是参数数量翻倍调试复杂度更高。模糊PID则是用模糊规则动态调整KP、KI、KD典型应用场景是模型变化剧烈、外界扰动不确定比如带载变化大的农业无人机或物流无人机。但模糊PID的工程落地需要定义好模糊规则表调试周期长对个人玩家来说性价比不高。正常航拍、穿越、基础作业场景经典级联PID加前馈已经非常够用。6. 放眼更远集群、视觉与PID调参的边界6.1 无人机集群为什么“统一参数”行不通相关热词里“无人机集群”出现频率不低。集群飞行的难点之一就是多架飞机的PID参数不能简单复制。即使是同一批出厂的飞机电机特性、机架装配差异、传感器噪声底噪都有细微区别。这个区别在单机飞行时感知不明显但在编队里会表现为位置保持精度差异导致整队曲线难看甚至机间碰撞。所以集群项目里单机自动调参反而更重要。先让每架飞机单独完成自动调参再根据各机日志微调最后才统一设定编队控制参数。一套参数打天下的思路在集群项目里最坑人。6.2 姿态PID和视觉感知、路径规划的边界无人机视觉感知、路径规划、目标检测这些热门方向解决的是“往哪飞”的问题而PID姿态控制解决的是“飞稳”的问题两者是栈式的上下层关系。你用再厉害的目标检测算法算出需要向某个方向偏转多少度最后还是要经过姿态控制通道把飞机掰过去。前端的智能算法出错飞机可能飞错方向后端的姿态控制调不好飞机可能连正确的方向都飞不稳。所以我一直觉得不管以后无人机往什么方向发展“先把内环姿态控制调好”永远是基本功。一个团队如果飞控内环都抖成筛子上层算法再花哨也很难落地。6.3 最后分享一个调参小习惯最后说一个我自己的习惯也算给这篇文章收个尾。每次飞行调试时我会同时打开日志记录和语音播报每调完一组参数就用语音把当前参数值录进备注。飞行结束后再结合日志曲线决定保留还是回退。坚持几个架次后你会发现自己的判断力明显提升不再靠“感觉差不多”来调参而是能对着曲线说出“这个超调是因为D不够而不是P太小”这样的准确结论。PID调参这门手艺说难确实难因为涉及的变量很多说简单也简单因为它背后的逻辑就三条误差、阻尼、消静差。只要你愿意一次次试飞、看曲线、改一个参数、再看曲线你的飞机一定会在某个瞬间变得特别顺手。那个时刻你就真正入门了。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门