1. 先别急着拧参数,把ArduSub的调参思路理清楚
ArduSub调参这件事,我见过太多人上来就打开参数列表,照着网上的教程一顿改,结果越调越飘,最后连定深都不敢开。说实话,ArduSub这套基于ArduPilot的固件,在地面站上看确实长得和四旋翼的Mission Planner差不多,但它底层的控制逻辑、传感器构型、动力特性完全是另一套东西。如果你没有先把ArduSub的控制链路和调参顺序搞清楚,改了也是瞎改,运气好碰到一组能用的参数,换条船、换个水流环境立刻翻车。
所以这篇指南我不会直接扔给你一组"神参数",而是把从姿态到深度、从PID到滤波器的完整调参路径捋一遍。你跟着这个思路走,即使你的ROV和我用的结构完全不同,也能自己推出一套合适的参数。
1.1 ArduSub控制链路到底长什么样
ArduSub的控制回路和绝大多数ArduPilot系固件一样,分内外两层。外环是角度环,也叫姿态环,它负责"把机器人拉回到目标姿态",输出的是一个期望角速度;内环是角速度环,它根据期望角速度和实际角速度的差值,输出具体的油门、舵量指令给电机和推进器。
我举个例子帮你理解。你把ROV放在水里,用遥控器打了一个横滚角度,外环发现"哎,现在实际横滚角和目标横滚角差了15度",它就会计算出一个期望的横滚角速度,比如每秒20度。内环再看"实际角速度和期望角速度差多少",然后决定给左右推进器多少推力差。外环管角度,内环管角速度,这个两层结构是ArduSub稳定性的基石。
调参的基本顺序因此非常明确:先调内环(角速度环),再调外环(角度环)。内环调不稳,外环怎么调都是白搭。这个顺序和你在四旋翼上调PID的习惯是一样的,但水下环境有两个显著区别,导致很多空中飞控经验直接失效:一是水流的随机扰动比空气大得多,外环误差信号会夹杂大量噪声;二是推进器的响应滞后比电机大,螺旋桨在空气里几乎是瞬态响应,在水下推进器从0到满油门需要约100到200毫秒的建立时间。这个滞后如果不在滤波器设计时考虑进去,PID很容易产生自激振荡。
1.2 水下环境为什么让PID这么难调
空气里飞无人机,最大的扰动是风,但风是相对均匀的流场。水下ROV面对的是完全不同的局面:近水面有波浪、有缆绳牵引力、有推进器之间互相干扰的尾流、有深水区温度分层导致的对流,最要命的是,ROV自身往往带有一定程度的正浮力或负浮力。这意味着即使你完全不打杆,ROV也会缓慢上浮或下沉,姿态也会因为重心和浮心不完全重合而出现倾斜。
这个"恒定的静差"对PID的积分项提出了很高要求。在水下,I项如果太小,ROV会一直朝一个方向缓慢漂移;I项如果太大,又会出现低频率的往复晃动,看起来就像一条在水里"喘气"的鱼。还有一个常被忽略的问题:螺旋桨和推进器在水下工作时,会产生一个反扭矩。如果你用的是单大桨推进器配置,反扭矩会让ROV在推油门时明显滚转,这个扰动是随油门开度变化而变化的,纯粹的PID很难完全抑制,需要在结构上做配平,或者在调参时留出稳定裕度。
明白了这些差异,你就能理解为什么ArduSub调参不能照搬四旋翼的套路。接下来我先讲动手前的准备,这部分做扎实了,后面调PID的成功率能提高一半。
2. 调参前的准备,能省掉80%的折腾
很多调参翻车案例,问题根本不出在PID系数上,而是出在传感器数据不准、EKF(扩展卡尔曼滤波器)告警、固件版本混乱这类基础问题上。你想想,如果ArduSub的姿态估计本身就偏了2度,你在调角度环的时候,它输出的角速度指令自然就不准,你怎么调P、I、D都找不到一个"正确"的感觉。所以调参前的准备不是走过场,而是整个调参流程里性价比最高的一步。
2.1 固件、地面站和日志系统先摆平
我建议你从ArduSub官方网站下载配套的Mission Planner地面站,注意别用标准版Mission Planner直接刷水下固件,虽然也能连,但ArduSub官网的定制版本在水下数据接口、参数默认值、日志解析上都做了优化,能省很多不必要的麻烦。固件版本方面,我建议优先选用稳定版,而不是最新的HUD预览版。ArduSub的版本迭代节奏不算快,稳定版往往经过了一整轮RC测试,推进器配置、深度传感器兼容性都有保障。
日志系统是你调参最重要的工具,务必在正式开始之前确认开启。在Mission Planner的Full Parameter List里检查LOG_DISARMED是否设为1,这样即使电机没有解锁,你也能在陆地上测试姿态传感器输出并记录日志。另外确认LOG_BITMASK里包含PID相关项,默认的ArduSub日志设置通常覆盖了ATUN(姿态控制输出)、IMU(惯导数据)、PSC(位置控制)等关键组,但如果你改了参数,最好把Log Options里的"PID"信息项也打开,这样后期分析震荡原因时可以直接看到每个通道的P项和D项输出曲线。
调参环境的选择也同样重要。我第一次在泳池里调ROV时,因为泳池水很清,感觉视野很好,但忽略了隔壁泳道有人游泳产生的轻微水流,结果怎么调都有一点点横滚漂移,后来换到静水区才正常。尽量选择水面平静、没有明显水流和杂物的水域,最好水深2到3米,这样定深调整时既能观察到效果,又不会因为水太深导致信号和水压问题。
2.2 传感器校准和EKF健康检查
传感器校准这一关过不了,后面一切免谈。ArduSub和四旋翼一样,在Mission Planner里有专门的加速度计、罗盘、水平仪校准界面,但你需要注意水下机器人和无人机在校准上的差异。
加速度计校准时,如果机身本身有些浮力材料或者结构不对称,放在水平面上可能会轻微倾斜,这会导致零点偏差。建议找一块平整的板子,把ROV固定好再校准。罗盘校准则需要特别注意电机和推进器产生的磁场干扰。水下机器人的推进器通常是无刷电机,电流很大,电机距离罗盘的距离如果小于30厘米,高速运转时的磁场干扰会明显影响航向数据。如果你用的是外置罗盘,尽量把它安装在远离推进器和电源线的位置;如果用的是飞控内置罗盘,调参前可以做一个简单的磁场干扰测试:解锁电机,逐步加大油门,观察Mission Planner里航向角是否发生偏移,如果偏移超过3到5度,说明电磁兼容有问题,需要重新考虑罗盘安装位置或者加磁屏蔽。
校准完成后,在Mission Planner的Status界面查看EKF的GPS值、海拔、姿态方差等指标。对于ROV来说,GPS在浅水或室内常用不到,但如果你在水面搜救或浮航模式,GPS数据异常会直接污染EKF的估计。如果看到EKF variance数值持续飙红,优先检查罗盘的外场校准质量和气压计是否受潮。气压计是定深的关键传感器,如果防水舱密封不好,气压计附近潮气过重,读数会产生缓慢漂移,这种漂移在日志里表现为深度值缓慢增大或减小,非常干扰你对深度环参数的判断。
3. 姿态PID实操:从横滚俯仰到偏航
准备工作做完了,终于到了可以动手改参数的部分。ArduSub的PID参数命名沿用了ArduPilot体系,姿态相关的参数主要分三组:ATC_RAT_RLL(横滚角速度环)、ATC_RAT_PIT(俯仰角速度环)、ATC_RAT_YAW(偏航角速度环),以及对应的角度环参数ATC_ANG_RLL_P、ATC_ANG_PIT_P、ATC_ANG_YAW_P。大家常说的"调PID",其实大部分时间是在调这三个轴的内环角速度环。
3.1 横滚和俯仰的"快调套路"
我调横滚和俯仰有一套固定的流程,不一定适用于所有ROV,但效率很高,可以帮你快速逼近最优值。先用默认参数下水,只做姿态阶跃测试——从遥控器给一个固定角度指令(比如横滚10度),观察ROV的响应:是反应迟钝、到位后继续超调,还是轻微抖动。依据响应类型,按下面的步骤操作。
第一步,调整P值。比如横滚轴ATC_RAT_RLL_P,默认值我见过在0.1到0.3之间,从默认值开始每隔0.05加一档。加P直到ROV出现持续的高频抖动(频率大约2到5Hz),再把P值回退20%。这就是比较合理的P值。为什么回退20%?因为水下推进器响应本身就比空中电机慢,你必须留出足够的稳定裕度来应对水流扰动,回退20%是一个经验值,实测下来比回退10%更稳妥。
第二步,调整I值。I项的作用是消除稳态误差,在ArduSub里表现为对抗浮力不平衡和水流造成的持续偏置。从默认值开始逐渐增加,每次增加后,让ROV保持一个固定姿态5到10秒,如果它能够稳定停在目标姿态附近,不再缓慢偏移,就说明I值已经能覆盖主要的稳态误差。但别加太快,I值过大时ROV会出现一种低频的"呼吸感"——姿态缓慢地向一个方向漂移,然后又被拉回来,周期大约5到8秒。遇到这种表现,果断把I值减半。
第三步,调整D值。D项在水下机器人的作用主要是抑制超调,但因为推进器响应慢,D值太大会把推进器噪声放大,让机身出现细碎的抖动。我做横滚和俯仰D值时,习惯在完成P和I调整后,让ROV做一个10度阶跃,观察尾部是否有一两次微小振荡。有的话,D值每0.01一档往上加,直到阶跃后没有回摆。D值一旦调到过大,抖动会立刻变成尖啸声节奏的机身振动,这时候别犹豫,直接降回上一档。
横滚和俯仰两侧的参数理论上是独立的,但大多数ROV结构对称,调完横滚轴可以直接把同样的参数复制给俯仰轴。如果你的ROV有前倾斜推进器布局或者重心明显偏移,那横滚和俯仰必须分开调,实际测试时优先把主要运动轴调好。
3.2 偏航通道的特殊处理
偏航轴在ArduSub里是最容易出问题但也最少被认真调的一个通道。很多ROV的偏航控制只看航向是否准,却忽略了转向过程是否平滑。水下转向有一个特点:水动力阻尼很大,角速度很难建立起来。如果P值不够,ROV转向时会非常"黏"——指令打了20度航向偏差,它能花5秒才转过来,而且在转动末端会因为流体惯性停不住,出现过头再回摆的现象。
解决偏航黏滞的方法是先加大ATC_RAT_YAW_P,增大角速度响应。同时需要注意,水下ROV的偏航角速度通常会限制在较低范围,查看ATTITUDE参数里ATTITUDE_ACCEL_FILTER或者ATC_SLEW_YAW这类速率限制参数,如果限幅太严,P值再大也白搭。偏航的D值不需要太大,因为水下阻尼已经天然抑制了角速度振荡,过大的D反而会让转向感觉僵硬。如果偏航轴出现高频抖动,首先检查螺旋桨是否有配平差异,必要时降低P值而不是盲目加D。
还有一个容易被忽略的因素:ROV的偏航和横滚会耦合。当ROV带正浮力或负浮力时,轻微倾斜会产生一个偏航力矩,表现为"航向锁定不住,总是缓慢朝一个方向偏转"。遇到这种情况,你光调偏航PID没用,需要回到重心和浮心配平,或者在深度控制调好后再回来观察航向漂移是否消失。
3.3 滤波器参数,抖动的最后防线
当你把PID调到一个看起来不错的区间,但发现轻微抖动的阶段,问题就不在增益了,而在传感器信号本身。ArduSub的姿态估计依赖加速度计和陀螺仪的数据融合,如果陀螺仪信号里混入了机械振动的高频噪声,内环角速度环就会被这些噪声驱动,产生肉眼可见的小幅抖动,日志里的表现是角速度输出有密集的高频振荡。
ArduPilot体系里有一组滤波器参数用于限制陀螺仪信号带宽,在ArduSub中主要是INS_GYRO_FILTER(陀螺仪低通滤波截止频率)。默认值通常是20Hz左右,如果机体振动大,可以降低到15Hz甚至10Hz。但要注意,滤波器截止频率越低,相位延迟越大,内环的响应就越迟钝。所以滤波器和PID增益是跷跷板:你降低滤波截止频率,就需要适当提高PID增益来补偿相位延迟导致的响应迟钝;你提高截止频率,PID增益就要收敛一些,否则噪声会直接进入控制输出。
我通常会做这样一组对比测试:PID参数先不动,只把INS_GYRO_FILTER从20Hz换到15Hz,观察日志里角速度环控制输出值的噪声底是否明显下降。如果下降了很多,说明原设置下确实有大量高频干扰,我会继续降,直到噪声底不再显著变化为止。降完滤波器,再稍微回补一点P值,让响应恢复灵敏度。整个过程需要耐心,但这是让ROV真正"稳下来"的关键一步。
4. 深度控制:水下稳定性的灵魂
姿态调好了,ROV在空中飞模拟器里那种"跟手"的感觉有了,但真正下水干活,最影响体验的是定深。一个能在3米水深处稳稳悬停的ROV,和一个只能靠手动推油门维持深度的ROV,实际使用体验完全是两个东西。ArduSub的深度控制又是一个独立于姿态控制的多层级控制回路,它由外环位置环(PSC_Z_P、PSC_Z_I、PSC_Z_D)和内环速度环(PSC_Z_VEL_P、PSC_Z_VEL_I)组成,跟姿态环相比,它的惯性更大、滞后更明显,调参方式也有很大区别。
4.1 定深模式的工作原理
ArduSub的深度传感器通常是水压传感器(深度计),每10厘米水深对应约1kPa的压力变化。飞控通过读取压力值换算出当前深度,并把这个深度作为位置环的反馈信号。外环位置环比较目标深度和实际深度的差,计算出期望的垂直速度;内环速度环再根据期望速度和实际垂直速度的差,输出垂直推进器(或者横滚俯仰通道的油门混合)的推力。
整个过程你可以理解成一个"两段式刹车":位置环先决定"要以多快的速度接近目标深度",速度环再执行"当前速度到底要加到多少或者减到多少"。这种解耦设计的好处是,你不会因为离目标深度还有5米就一直全速下潜,导致到了目标深度后因为惯性冲过头。ArduSub默认的深度控制参数已经包含了比较完整的全水深、浅水、中水速度设定,但不同ROV的浮力储备和推进器推力差异巨大,默认参数只能用,谈不上稳。
深度控制调参前有个前提必须做到:机械配平。如果你的ROV本身有200克正浮力,深度环的I项就算调到再大,也会在深度保持时产生一个持续的向上推力来抵消浮力,这会让垂直推进器始终处在高负载状态,温度升高、电流增大,姿态控制也会被这个持续的垂直推力干扰。所以调深度前,先把ROV调成中性浮力或略微负浮力(建议负浮力50到100克),这样深度环只需要应对水流扰动,而不是去对抗一个恒定的外力。
4.2 深度环参数与浮力配平
深度环的调参步骤和姿态环类似,我有几个侧重点要特别提醒。首先是PSC_Z_P(深度位置环比例增益),它决定深度误差对期望速度的映射关系。增大P值能让ROV更快地响应深度偏差,但过大会导致深度在目标值附近来回穿越,表现为"在水中上下呼吸"。我的经验是把P值从默认的2.0左右开始,每0.5一档往上加,记录每次穿越的幅度。找到穿越幅度开始明显增大的档位后,回退一档。
其次是PSC_Z_VEL_P(垂直速度环比例增益),这个参数直接决定推进器对速度误差的响应强度。由于水下垂直方向的阻尼相对较小,如果这个值偏大,ROV在定深起始阶段会有明显的急停感,甚至能看到机身轻微反弹。偏小则会出现"软绵绵"的下沉过程,深度到达后还要游荡一两秒。正确的手感是:接近目标深度时,下潜速度线性减为零,没有明显的过冲或回摆。
最后一个关键是PSC_Z_I(深度积分增益)。水下配平再好,也难免有密度变化或细微漏气导致浮力变化,积分项负责把这个静态误差吃掉。但和水下姿态的I项一样,深度I项过大时会出现周期性深度漂移和被拉回的现象,我一般把PSC_Z_I控制在能让深度在20秒内完全收敛即可,不追求更小的稳态误差,换取更稳定不是更好。
调深度环节还有一个实用技巧:检查DEPTH_DMP(深度阻尼系数)。这个参数用于模拟水对垂直运动的阻尼,默认值经过简单的流体估算,但不同结构的ROV差异很大。如果你测试中发现,垂直推进器停止后ROV还能继续滑行一段距离,说明实际阻尼比参数假设的小,可以适当增加DEPTH_DMP,让深度控制器更保守一些。
5. 实战问题排查与调参避坑
调参过程中最消耗时间的往往不是调参本身,而是排查那些"看起来像参数问题、实际不是"的杂症。我把这些年碰到过的典型问题整理成一个速查表,你照着对应症状排查,能省下大量下水测试次数。
5.1 高频抖动
现象:ROV悬停时,机身出现频率较快的左右或上下抖动,有时伴随电机声音异常尖厉。排查优先级从高到低:先看桨叶是否破损或动平衡不良,再看电机电调是否有堵转或轴承磨损,然后确认滤波器和P值是否匹配。如果桨叶没问题,把日志里IMU的AccX/AccZ曲线拉出来,如果在抖动频率处有明显的周期性峰值,说明机械振动耦合到了飞控,需要加强减震或降低滤波器截止频率。如果日志里角速度信号噪声不大,而控制输出有高频振荡,那就是PID增益过高,直接按前面说的回退P值。
5.2 定深漂移
现象:ROV开启定深后,深度值缓慢变大或变小,且深度环输出一直有持续的单向修正量。第一步检查浮力配平,看看ROV在水中是否自然下沉或上浮,如果自然漂移速度超过每秒2厘米,说明深度环在用一个很大的恒定输出去对抗浮力。第二步检查水压传感器是否受潮或有气泡附着,气泡附着在压力口会产生周期性压力波动,导致深度读数起伏。第三是确认log里PSC的期望速度和实际速度是否长时间存在一个固定偏差,如果有,尝试加大PSC_Z_I。
5.3 航向偏转
现象:全方向推进时航向尚可,但定深悬停时航向会缓慢朝一个方向旋转。大概率是机身结构不对称或者推进器扭矩不平衡导致的偏航力矩。如果你确认姿态控制已经调顺,开关定深后航向才开始漂移,多半是垂直推进器启动后产生的侧向力矩大于偏航控制的纠正能力。排查时先把垂直推力输出曲线打开,看看漂移是否和垂直推进器输出同步变化,同步的话,加大ATC_RAT_YAW_P并检查偏航通道的限幅参数是否过小。
5.4 日志分析速查表
新手排查时最懵的就是Mission Planner里那一堆曲线图,我提供一个最简分析路径:打开日志后先看ATTITUDE(姿态)里的DesRoll、Roll和RollRate,如果DesRoll和目标一致,但Roll始终差几度,说明角度环P值不够;如果Roll和RollRate都有高频毛刺,优先怀疑滤波器;再看PID控制器输出,如果输出曲线反复冲到上下限,说明增益过大或前后馈缺配平。深度方面看CTUN的BarAlt和PSC期望深度,两者之间的差值就是深度控制误差,误差平坦但有静差就调I,误差振荡就调P和D。
我个人的调参体会是:ArduSub调参没有"一次到位"的银弹,更像是一个逐步逼近的过程。每一次下水只改一组参数,记好日志,分析一轮再改下一轮。遇到无法解释的异常现象,先回到机械、传感器、浮力这些基础检查一遍,别急着怀疑PID。很多看起来是控制问题的情况,最后都出在传感器安装或推进器磨损上。把这篇指南里的顺序走完,你的ROV应该能获得一个相当稳定的游动表现,像鱼一样稳稳挂在水里,该动时干脆利落,该停时纹丝不动。