ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ArduPilot开方控制器拆解:从数学原理到调参实践

ArduPilot开方控制器拆解:从数学原理到调参实践 玩APM飞控的调参多数人第一反应是去碰PID。这个思路不算错但前阵子我在日志里盯RATE_RP_TAR曲线时才发现真正影响“手感”的往往不是角速率环那几个增益而是角度误差转化到角速度期望的那一步——在ArduPilot源代码里这一步叫sqrt_controller也就是开方控制器。这个名字在ArduPilot英文社区讨论里出现频率很高但中文资料很少把它单独讲透。简单说它不是一个独立运行的控制器而是一个非线性的误差映射函数负责把“角度误差”或“位置误差”换算成“角速度期望”或“速度期望”。它决定了飞行器在多大误差下敢全速纠正在接近目标时又提前多少开始刹车。姿态、位置、偏航、L1制导、TECS高度控制里面都有它的影子只是名字不一定都被标成sqrt_controller。这篇文章我从数学推导、源码调用路径、相关参数和实测调参几个角度把它拆开。不保证你看完就能省掉所有试错但至少下次调姿态、调航点时你会知道屏幕上那个“期望角速度”是怎么来的。1. 为什么角度误差不能直接乘一个P增益了事在聊开方控制器之前先弄清楚它在姿态回路里到底站在哪个位置。ArduPilot的四轴或固定翼姿态控制是典型串级结构外环是角度环输入是期望姿态角和当前姿态角输出是期望角速度内环是角速率环输入是期望角速度和当前陀螺仪角速度输出是电机油门或舵面指令。传统的做法里角度环就是个比例控制器期望角速度 角度误差 × 角度环P增益。误差小期望角速度小误差大期望角速度大。看似合理但实际飞起来有两个典型问题。第一是线性比例在大误差时会让内环背不住。假设角度环P增益是4.5想象一下飞行器被一阵风拍倾斜了50度线性P直接给出225度每秒的期望角速度。这个值可能远远超过机体能承受的最大角速度比如180度每秒。于是内环一上来就饱和电机油门直接顶满机体疯狂往回调。等角度误差减小到某个值以后内环才从饱和里退出来但这时候角速度已经很大刹车距离不够结果就是过冲甚至是来回摆。第二是线性比例在小误差时又显得不够果断。角度误差只剩两三度时线性P给出的角速度期望很小纠偏动作软绵绵。外界的扰动稍微持续机体就一直保持着一个很小的偏差飞起来就“呆”特别是航点模式下接近目标点时总有一种磨磨蹭蹭才到位的感觉。开方控制器的思路就是换一种映射方式大误差时不是简单线性放大而是用开方曲线压低期望角速度让内环不至于被迫饱和同时小误差时仍然保留足够的比例增益让纠偏动作干脆。更重要的是这条曲线隐含了“刹车距离”的概念——它提前计算了“以当前角速度冲到零误差需要多远”并把修正过程限制在可停住的范围内。这正是时间最优控制里“先全力加速、再提前减速”的连续化版本。这个思路不只在姿态控制里有价值位置控制里同样如此。四轴漂出去几十米时线性P可能给出一个超出机体能力的速度期望开方控制器则会把速度期望压在速度上限内并在接近目标时主动开始减速。所以你在ArduPilot的位置外环里看到的pos_to_vel_xy函数调用的也是同一套sqrt_controller逻辑。2. 开方控制器的数学原理它是怎么推导出来的sqrt_controller的核心不是一个复杂的现代控制理论结论而是从最简单的运动学公式推出来的。假设你在控制一个一维运动对象当前位置和目标之间有误差e你允许的最大速度是v_max允许的最大加速度是a_max。如果对象当前以速度v运动想在误差e处刚好停下来那它必须满足一个条件——刹车距离不能大于当前误差。匀减速运动里从速度v刹到0需要走的距离是v²/(2a)。于是“安全速度”就是v_safe sqrt(2 × a_max × |e|)这个v_safe就是开方控制器在大误差区域给的输出。它的物理含义很直观如果误差是30米最大加速度是0.5米每秒平方那安全速度就是sqrt(2×0.5×30)≈5.48米每秒。超过这个速度到了目标点就刹不住不超过理论上可以一路急加速再急减速刚好停在目标点。但直接把这个公式用到全误差范围内会有个问题在误差接近零的时候sqrt函数是竖直切线导数趋近无穷大。也就是说误差从0.1度变成0.01度期望角速度的变化会非常剧烈放大小误差的噪声甚至导致高频抖动。所以ArduPilot在实现里保留了一个线性区误差很小时按比例输出误差大时才切到开方曲线。线性区和开方区的分界点由两个限制参数共同决定最大速度v_max和最大加速度a_max。分界点e_lin的理论值就是速度上限对应的刹车距离e_lin v_max² / (2 × a_max)在这个分界点处开方公式给出的安全速度恰好等于v_max。所以完整的映射逻辑是若 |e| e_lin 输出 v_max × sign(e) 这里开方值已经超过v_max直接限幅到v_max 若 |e| e_lin 输出 v_max × e / e_lin 线性区在分界点处和v_max衔接这里有一个很多刚接触APM的人容易理解偏的地方开方控制器并不总是输出一个“开方后的曲线值”。在大误差区域由于v_safe超过v_max实际输出被削顶到v_max真正展现出“开方曲线减速过程”的是误差从e_lin往零收敛的那一段。换句话说控制器的角色是大误差时限制最大速度输出进入减速窗口后按开方曲线逐步降低速度期望让对象自然“滑”到目标。拿姿态环举个例子。假设ATC_RATE_RP_MAX是180度每秒ATC_ACCEL_RP_MAX是1100度每秒平方那么分界点e_lin 180²/(2×1100)≈14.7度。当姿态误差是30度时sqrt(2×1100×30)≈257度每秒已经超过180度每秒输出被限幅为180度每秒当误差回落到10度时sqrt(2×1100×10)≈148度每秒输出就是148度每秒当误差到5度时sqrt(2×1100×5)≈105度每秒但5度已经落在线性区实际输出是180×5/14.7≈61度每秒明显比纯开方曲线更温和正好用来抑制小误差段的抖动。我把这个映射关系整理成一个表格方便对应理解角度误差纯开方输出最终限幅后输出说明30度257度/秒180度/秒大误差受最大角速度限制20度210度/秒180度/秒仍超限继续满角速度14.7度约180度/秒180度/秒分界点开始进入线性区10度148度/秒148度/秒开方区尾部开始主动减速5度105度/秒61度/秒线性区按比例输出2度66度/秒24.5度/秒线性区小误差温和纠偏这张表的物理意义可以这样理解机体被大风吹偏到30度时控制器不会立刻要求一个不可能达到的角速度而是直接打到最大角速度180度每秒往回拉拉回到14.7度以后才开始减速到5度时已经降到一个适中水平避免冲到目标点附近还在高速旋转从而显著减少过冲。位置环也是一样的逻辑。假设WPNAV_SPEED是5米每秒WPNAV_ACCEL是2米每秒平方那么位置误差分界点是25/(4)6.25米。飞机距离目标20米时期望速度被限幅在5米每秒距离小于6.25米后开始按线性/开方组合降速。这样飞机在快到航点时不会带着5米每秒的速度一头撞过去而是提前一个“可刹车距离”开始减速落地或者过点都更平滑。3. 在ArduPilot源码里它到底被谁调用、在哪条回路上服役ArduPilot源码里sqrt_controller并不是一个只在某个角落出现的小函数。它被姿态控制器、位置控制器、自动调参和部分导航逻辑反复调用只是每个调用点的参数含义略有不同。弄清楚调用路径看日志时才能判断一个异常到底是外环映射问题还是内环增益问题。姿态控制主路径大致是这样。ArduPilot的姿态控制器在attitude_controller_run_quat里计算出当前姿态误差四元数转换成三轴角度误差向量后交给ang_vel_target_from_angle_error。这个函数内部对滚转、俯仰、偏航分别调用sqrt_controller把角度误差转成角速度期望。滚转和俯仰轴使用的rate_limit是ATC_RATE_RP_MAXaccel_max是ATC_ACCEL_RP_MAX偏航轴用的是ATC_RATE_YAW_MAX和ATC_ACCEL_Y_MAX。所以这道“从角度到角速度”的映射并不是用户拿一个P增益拍脑袋定的而是由这两个最大限制参数联合推出的。位置控制主路径也类似。四轴的航点、悬停、定高模式最终都会走到AC_PosControl系列函数。水平位置环的pos_to_vel_xy把当前位置误差和目标位置误差做差调用sqrt_controller得到期望地速垂直位置环的pos_to_vel_z把高度误差转成期望爬升率。位置环里的rate_limit对应WPNAV_SPEED或者航点模式下的限速accel_max对应WPNAV_ACCEL。这个过程可以理解为把“还剩多少米”翻译成“应该飞多快”。偏航控制同样用了这个逻辑但实现上稍微特殊一点。偏航角度误差超过180度后会按短路径折回比如当前朝向30度、目标朝向350度误差会算成-40度而不是320度。ArduPilot在计算偏航角速度期望时先处理这种“环绕”问题再交给类似的非线性映射。这也是为什么偏航转向时很少出现“绕远路转到目标角度”的原因之一。自动调参里也有开方控制器的身影。AutoTune在确认姿态环激励时会先根据当前角度误差计算一个合理的角速度激励幅度避免在误差已经比较大时再叠加一个大扰动。它复用的就是同一套sqrt_controller逻辑只是参数临时从调参对象里取。L1制导回路没有直接调用同名函数但数学形式上也是同源的。固定翼在追踪航线时L1控制器根据侧偏距和地速给出横向加速度期望本质上同样是“大偏差全力修正、接近航线后平滑切入”的思路。你会在AP_L1_Control的源码里看到类似“横向加速度与侧偏距的平方根关系”的注释这就是同一个思想在不同导航层的体现。TECS高度控制也用到这个思路。固定翼的高度响应慢如果高度误差几十米时还按线性比例给爬升率很容易出现过冲。TECS在计算出期望爬升率时同样按高度误差的大小做非线性处理误差大时限制爬升率上限误差小时线性收尾。虽然实现细节比sqrt_controller函数复杂但设计哲学是一样的。4. 调参时这些参数是怎么配合开方控制器一起起作用的很多人一提到调APM姿态第一反应就是动ATC_RATE_RP_P、ATC_RATE_RP_D。而实际上角度环最前端的反应速度由ATC_RATE_RP_MAX和ATC_ACCEL_RP_MAX这两个参数通过sqrt_controller就大致确定了。它们不像PID增益那样有直观的“大小对应快慢”而是先共同决定分界点e_lin再决定整个误差映射曲线的形状。从前面公式可以看出e_lin v_max² / (2 × a_max)这意味着v_max和a_max对分界点的影响是非对称的。v_max增大e_lin按平方关系增大线性区被拓宽飞行器在小误差时有更大的角速度期望但代价是更高的角速度如果机身刚度和相机云台扛不住大机动时就会暴露问题。a_max增大e_lin减小开方区提前介入大误差时速度限幅更早实纠偏更“狠”但内环需要承受更大的加速度变化电机响应压力也会增加。我用一组典型参数做示例。如果ATC_RATE_RP_MAX保持180度每秒不变把ATC_ACCEL_RP_MAX从1100提高到2200度每秒平方分界点就从14.7度缩小到约7.4度。结果是误差在7.4度以内就开始线性收尾整体修正更果断姿态回中更快但小误差区域的有效增益变大更容易放大传感器噪声。反过来如果a_max降到550分界点会扩大到约29.5度小误差区域变得很“软”机体回中时容易拖泥带水。下面是这组参数关系的速查表ATC_RATE_RP_MAXATC_ACCEL_RP_MAX分界点e_lin手感倾向180度/秒550度/秒²约29.5度软、稳、大误差不猛180度/秒1100度/秒²约14.7度默认风格、均衡180度/秒2200度/秒²约7.4度快、硬、小误差敏感240度/秒1100度/秒²约26.2度线性区宽、机动幅度大位置控制的参数对应关系也一样。WPNAV_SPEED越高相当于“最大速度”v_max越大分界点也越大飞行器在较远距离就开始受限速影响WPNAV_ACCEL越大分界点越小接近目标时减速更晚、更“冲”但可能造成航点过冲。所以如果你觉得飞机在到航点时总是冲过头优先看的不是WPNAV_SPEED而是WPNAV_ACCEL如果觉得飞机离航点很近了还在慢慢挪、不到位优先看的才是WPNAV_SPEED是不是设得太低导致分界点过小。值得注意的是开方控制器只负责把“误差”映射成“期望角速度/速度”。这个期望值生成之后能不能被内环真正跟踪上取决于后面的速率PID。如果ATC_RATE_RP_P太低即使外环给了足够大的期望角速度内环也跟踪不到位表现出来就是机体反应慢半拍这时候你去调ATC_ACCEL_RP_MAX基本没用应该先解决内环跟踪能力。反过来如果内环增益已经很高一有角速度就把油门拉满再把外环开方曲线调得很激进就容易出现修正过头。所以调参顺序上我建议先固定合理的rate_max和accel_max再调内环PID最后根据实际手感微调这两个限制参数。还有一处容易忽略ATC_ANG_RLL_P、ATC_ANG_PIT_P这些角度环P增益在旧的线性控制器里决定“角度误差→角速度”的斜率但在新的sqrt_controller实现里起主导作用的是上面讲的限制参数。很多老教程还停留在“调大角度P让飞机反应更快”的思路这在旧版本固件里成立在4.x之后就要重新理解了。你真正能用来影响角度响应快慢的参数变成了速率上限和加速度上限的组合这两个参数调好了角度环自己就能在一个比较宽的误差范围内给出合理的期望角速度。5. 实际飞行中哪些现象是开方控制器导致的、哪些不是先说过冲问题。很多人遇到飞机大机动后过冲第一反应是减小角度环P或者减小速率环P。但如果你看过日志RATE_RP_TAR在修正初期直接顶在180度每秒并且维持了相当长一段时间那问题很可能不是增益太高而是减速窗口太小导致内环来不及刹住。这种情况下把ATC_ACCEL_RP_MAX调大一些让分界点更早进入线性区反而能减轻过冲。这是一个有点反直觉的结论不是降低最大角速度而是提高最大角加速度。再说饱和问题。开方控制器在大误差时主动把期望角速度限幅到最大值因此在日志里看到RATE_RP_TAR是一条平顶的方块波不一定是坏事反而是控制器在按预期执行“先全力修正”的策略。很多新手把这种平顶误判成异常震荡然后去降低速率环D结果越调越糟。判断是不是真震荡要看RATE_RP_OUT是否有同频率的正反交替脉冲以及姿态角是否出现来回摆动。如果RATE_RP_TAR平顶后平稳回落姿态角单调回中那这个平顶就是正常现象不用动参数。风扰方面也值得说。开方控制器对持续风扰没有额外的抵抗能力因为它本质上还是一个“误差驱动”的外环映射。如果无人机一直在某个方向被风吹偏角度误差会持续存在开方控制器只会一直给出一个恒定的期望角速度去对抗但不会像积分项那样逐步把误差消除。这时你需要的是角度环积分或者速率环积分。ArduPilot的ATC_ANG_RLL_I和ATC_RATE_RP_I就是干这个的适当增大它们可以抑制稳态偏差但这和开方控制器没有直接关系。如果你在强风环境里飞别指望靠调ATC_RATE_RP_MAX来解决漂移问题。还有一个常见误区是把开方控制器当成“万能平滑器”。有些飞手为了让机动手感更柔和直接把ATC_ACCEL_RP_MAX调得很低以为这样就能让姿态变化更顺。但这样一来分界点e_lin变得很大线性区覆盖了大部分误差范围等效于回到一个低增益的线性P控制器。结果大误差时修正速度不够小误差时又因为斜率低而迟钝飞机整体反应绵软反而更容易越漂越远。真正的柔和感应该来源于合理的速率环滤波和D项设置而不是靠削形态环的“锐度”。我在实测中还发现一个容易踩的坑固定翼模式下的开方控制器行为和四轴不完全一样。固定翼的舵面效率随空速变化很大低速时同样的角度误差需要更大的舵量但是sqrt_controller输出的只是期望角速度舵面最终输出由速率内环决定。如果空速变化范围大同一套参数可能在高速时修正过猛、低速时修正无力。ArduPilot固定翼里通常要结合空速对增益做缩放这个逻辑和sqrt_controller本身没有直接关系但调参时很容易混淆——你以为是开方曲线不合适其实是对空速的补偿没做好。最后提一下自动调参的结果。AutoTune跑完以后它会根据飞行响应给出新的ATC_RATE_RP_P、ATC_RATE_RP_D同时也会建议一组ATC_ACCEL_RP_MAX的调整。如果你的自动调参结果在后续手飞里出现奇怪的“点头”动作别急着全盘接受先看自动调参建议的accel参数是否被拉得过大。因为自动调参的激励信号本身也是用sqrt_controller逻辑生成的当机体响应慢时它会倾向于提高加速度限制来争取更大的响应但这个值不一定适合实际航线飞行。6. 调试里值得养成的几个习惯和工具用法看日志时我会固定把几个关键通道拉出来一起看ATT.Roll、RATE.RATE_RP_TAR、RATE.RATE_RP_OUT、以及电机输出曲线。ATT.Roll显示姿态角有没有过冲RATE_RP_TAR显示开方控制器给内环的目标角速度RATE_RP_OUT显示内环实际跟出来的角速度。三者叠加看能快速区分问题出在外环映射还是内环跟踪还是输出限幅。Mission Planner里的绘图功能足够完成这件事。打开绘图页面把这几条曲线选中做一次快速加减速机动再去回放。你首先看RATE_RP_TAR是不是在误差大时迅速顶到上限、在误差接近分界点时平滑下降再看RATE_RP_OUT是否紧贴着RATE_RP_TAR走。如果OUT明显跟不上TAR说明内环增益或者电机响应不够如果TAR本身形状怪说明外环的rate_max/accel_max设置不合理。调参的时候我习惯先固定两个限制参数。以常见的450级四轴为例初始设置ATC_RATE_RP_MAX在180ATC_ACCEL_RP_MAX在1100然后飞一次大机动看姿态回中过程。如果回中干脆、略有轻微过冲但很快稳定说明这个分界点基本合适。如果回中很肉、感觉像“黏住”了试着把ATC_ACCEL_RP_MAX往1600到2000方向调让分界点缩小外环更果断。如果出现明显来回摆动先别动accel而是确认速率环D项和滤波是否正常再考虑把rate_max往下压让整个修正过程更舒缓。位置模式的航点过冲可以类似分析。飞机在航点模式里到点速度明显太快先看WPNAV_ACCEL。默认值在很多机型上是偏小的导致分界点很大速度在该减的时候还没减够。把WPNAV_ACCEL提到当前值的一倍左右分界点缩小一半过冲会有明显改善。如果到点很稳但整个航线段都飞得很慢那多半是WPNAV_SPEED设得太低限速咬住了整个飞行过程和开方控制器无关。还有一个经验是改完ATC_ACCEL_RP_MAX这类参数后一定要重新跑一次自动调参或者至少做一次大机动测试。因为开方控制器的分界点变化会直接影响内环看到的输入频谱速率环增益即使不变表现也会不一样。我在一次调机里把ATC_ACCEL_RP_MAX从1100改成1800后速率环D项明显偏大了原先的D增益会造成激烈摆动随后我把D降了大约20%才恢复正常。这说明外环映射参数会影响内环的最优增益两者不能割裂看待。最后说一个我这几年的使用体会。ArduPilot这套开方控制器不是学院派硬凑出来的公式它本质上是在“给内环找一个合理的期望输入”。你把它理解成“在误差大时别让内环背太多活、接近目标时提前交出控制权”的调度器而不是一个PID替代品很多调参的思路就顺了。下次再看到姿态日志里RATE_RP_TAR的曲线你可以试着用手里的航点距离和速度限制算一算当前分界点你会发现自己能大致预测飞机会在哪一段开始减速。这种从公式到飞行感觉的对照是我觉得调APM最值得积累的经验。
返回列表