ArduPilot飞控参数表:AHRS姿态链路与AFS失效保护调参指南

发布时间:2026/10/29 6:32:40
ArduPilot飞控参数表:AHRS姿态链路与AFS失效保护调参指南

简介:「Mission Planner 飞行模式中文参数调参必备」是一份面向飞控开发与调参入门者的中文参数速查文档,聚焦 ArduPilot 各飞行模式的参数含义,解决英文参数名与中文语义难以对应、调参时无从下手的问题,适合装机调试与故障排查时随手查阅。压缩包共 1 个 docx 文件,约 66KB,按 ACRO、ADSB、AFS、AHRS 等模式分组编排,逐条列出参数名、取值范围与中文释疑,便于按关键字检索。内容涵盖 ACRO 姿态锁定与满舵俯仰、横滚角速度上限,AFS 高级失效保护的 AMSL 高度限制、GPS 误差裕量、通讯与 GPS 丢失次数阈值、飞行终止动作及心跳引脚,以及 AHRS 的 EKF 类型、GPS 参与姿态估计的增益与最小卫星数、主板安装朝向,并提示 OBC 用户与 D2 安全盒取值保持一致。已有 4112 人学习下载,据此可逐项核对参数取值,理清各模式的启用条件与失效保护逻辑,减少翻查英文文档和反复试错的成本。

1. 一张中文参数表,能省掉半夜三点那通电话

「ALT_HOLD_RTL 填 10000,到底是一百米还是一万米?」这个问题在飞控开发群里隔一段时间就会冒出来一次。新接手一架整机,Mission Planner 一连,参数树几百行英文缩写,飞行模式从 ACRO 到 AUTO 一排下拉框,谁都不敢先动。这份 docx 做的是很朴素的一件事:把 ACRO、AFS、AHRS、ALT、ARMING、ARSPD、BATT、BRD、CAM、CHUTE、COMPASS 这些参数组的名称、默认值、取值范围和中文解释逐条对照出来,其中 AFS 高级失效保护和 AHRS 姿态航向链路写得最细。它适合两类人:刚接手整机、需要快速搞清某个参数到底管什么的人;以及已经在调参、想确认取值范围和危险值边界在哪的人。

2. 参数表怎么读:前缀分组、单位陷阱和位掩码三件事

拿到一份全是「参数名 + 默认值 + 范围 + 中文说明」的表格,最忌讳的是从头往下顺序读。几百行读下来,记住的只有零散几个名字,真到要改的时候还是不知道先动哪个。这张表的组织逻辑其实很清楚:参数名前缀就是模块边界,顺着「传感器 → 姿态解算 → 控制 → 保护 → 外设」这条数据流去读,每一组都能挂到链路的某个环节上。先把这个骨架立起来,再看单位换算和位掩码这两类容易翻车的地方,最后把表格变成一份能跟飞控对着 diff 的基线文件,这张表才算真正用起来。

2.1 前缀就是模块边界,顺着数据流读就不会乱

ArduPilot 的参数命名是「模块前缀 + 功能 + 子项」三段式,前缀基本决定了这个参数在链路里的位置。ARSPD、COMPASS、BATT 属于传感器层,AHRS 属于解算层,ALT、ACRO、AUTOTUNE 属于控制层,AFS、CHUTE、ARMING 属于保护层,BRD、CAM、ADSB 属于外设层。按这个顺序读,你会发现问题是有依赖关系的:罗盘朝向没设对,后面 AHRS 的姿态怎么调都是歪的;空速计没标定,ARSPD_FBW_MIN/MAX 填得再漂亮,自动油门也会抽。

前缀管的是什么代表参数改动风险
ACRO特技模式手感ACRO_LOCKING、ACRO_PITCH_RATE低
AHRS姿态航向解算AHRS_ORIENTATION、AHRS_TRIM_X高
COMPASS罗盘与磁干扰COMPASS_EXTERNAL、COMPASS_MOT_X高
ALT高度控制ALT_HOLD_RTL、ALT_MIX、ALT_OFFSET中
ARSPD空速测量ARSPD_RATIO、ARSPD_TUBE_ORDER高
AFS高级失效保护AFS_ENABLE、AFS_TERM_ACTION极高
ARMING解锁前检查ARMING_CHECK、ARMING_REQUIRE中
BATT电池监测BATT_VOLT_PIN、BATT_AMP_PERVOLT中
CHUTE伞舱触发CHUTE_ALT_MIN、CHUTE_SERVO_ON极高
BRD板级外设映射BRD_PWM_COUNT、BRD_SER1_RTSCTS中

风险等级这一列是我自己加的,加它的原因很实际:飞行器在地面通电、螺旋桨拆掉的情况下,改 ACRO_PITCH_RATE 和改 AFS_TERM_ACTION 的后果完全不在一个量级。前者最多手感变怪,后者是真的会让飞机在所有舵面打满、油门归零。表格里没有这一列,但你在自己那份副本里补上是值得的。

2.2 单位陷阱:厘米、米、毫米汞柱和弧度混在一张表里

这份表最容易让人栽跟头的地方不是参数名看不懂,而是单位不统一。同一个高度概念,ALT_HOLD_RTL 用厘米、AFS_AMSL_LIMIT 用米,而传统气压高度表习惯用英尺,文档里专门点了一句「注意这个值以米计,而气压高度限制通常以英尺来计」。这句话如果扫过去没留意,后面排故能排一整天。

参数单位换算要点
ALT_HOLD_RTL厘米10000 = 100 米;负数表示维持当前高度
ALT_HOLD_FBWCM厘米FBWB / CRUISE 模式的最低高度门限
ALT_OFFSET米自动模式下叠加到目标高度的全球偏移
AFS_AMSL_LIMIT米0 表示禁用气压高度限制
AFS_QNH_PRESSURE毫米汞柱标准大气压 760;0 表示禁用
AHRS_TRIM_X / Y / Z弧度范围 ±0.1745,约等于 ±10 度
COMPASS_DEC弧度范围 ±3.142
CAM_DURATION0.1 秒填 10 是 1 秒,填 50 是 5 秒
ARSPD_FBW_MIN / MAX米/秒22 表示 22 m/s,不是 km/h
COMPASS_MOT_X / Y偏移量/每安培乘以当前油门值后叠加到罗盘轴

弧度这一项要多说一句。AHRS_TRIM_X/Y 的范围写着 -0.1745 到 +0.1745,很多人第一反应是「这什么单位」,其实它就是 ±10 度换算过来的(1 度 ≈ 0.01745 弧度)。而且方向定义是明确的:X 正值对应飞行器右倾,Y 正值对应抬头。这两个参数是用来补机架和飞控板之间的安装角差异的,不是拿来做配平微调的,用错地方比不用更麻烦。

2.3 位掩码参数:ARMING_CHECK 72 到底代表什么

ARMING_CHECK 是这张表里少数几个「一个数字代表一堆开关」的参数。文档给的编码是:1 全部选项、2 气压计、4 罗盘、8 GPS、16 惯导、32 参数、64 遥控发射机、128 主板电压、256 电池等级,各项求和得到目标值。举例也给了:想要 GPS 锁定和遥控同时有效才允许解锁,填 72(64 + 8)。

这里有个特别容易记混的点:值 1 是「全部检查」的专用码,不是「位 1」。所以 3 不等于「气压计 + 全部」,它是 1 + 2 的算术和,含义是未定义的。我一般会写个小函数把数字拆回去核对,比心算靠谱。

# 把 ARMING_CHECK 的整数值拆成人能看懂的检查项 # 注意:值 1 是“全部检查”的专用码,不是位 1 CHECK_BITS = { 2: "气压计", 4: "罗盘", 8: "GPS", 16: "惯导", 32: "参数", 64: "遥控发射机", 128: "主板电压", 256: "电池等级", } def decode_arming_check(v: int): v = int(v) if v == 0: return ["不做任何检查(任意时刻都能解锁,危险)"] if v == 1: return ["全部检查"] names = [n for bit, n in CHECK_BITS.items() if v & bit] rest = v & ~(sum(CHECK_BITS) | 1) # 检查有没有写错的位 if rest: names.append(f"未知位 0x{rest:x}") return names or ["非法取值"] for v in (0, 1, 8, 72, 200, 1000): print(v, "->", decode_arming_check(v))

代码逻辑是逐位与运算:v & bit判断某一位是否为 1,非零就说明该检查项被开启。rest那一行做的是反查,把所有合法位和「1」从原值里剔除,剩下的就是非法位,用来抓「把 1 当位用」这类算术错误。参数方面,CHECK_BITS要和飞控固件的枚举保持一致,不同固件版本可能追加新项,改之前先去全部参数树里核对一遍提示文字,别照着旧表硬套。

同样的位掩码思路也适用于 BRD_PWM_COUNT,只不过那个更简单,取值范围是 0 / 2 / 4 / 6,表示可启用的辅助 PWM 数量,而且部分老硬件上只有 0 和 2 有效。这类「离散枚举」参数,改之前先确认硬件支持哪些档位。

2.4 把 docx 变成能和飞控 diff 的基线文件

表格是给人看的,飞控认的是参数文件。真正开始动手之前,第一步应该是把飞机当前的全部参数导出来存好,作为基线。我一般用 MAVProxy 连着飞控直接落盘,比在图形界面里点保存更省事。

# 连上飞控,把当前全部参数落盘成一份基线,文件名带日期 # param save 会写成“参数名 值”的纯文本,一行一个 mavproxy.py --master=/dev/ttyUSB0 --baud=57600 \ --cmd="param save ./baseline_$(date +%Y%m%d).parm; exit"

--master指定串口和波特率,数传链路就换成对应的串口设备或 UDP 地址;param save是 MAVProxy 的参数导出命令,后面跟路径。文件名里带日期,是为了几天后出问题时能准确回退到「上一次能飞的那份」。这一步做完,你会得到一个纯文本文件,扔进 git 里管理,改动就有了记录。

有了基线,改动才有意义。下面这段脚本对比两份参数文件,只打印真正变了的行:

# param_diff.py:对比两份 .parm 基线,只输出发生变化的参数 import sys def load(path): out = {} with open(path, encoding="utf-8") as f: for line in f: line = line.strip() if not line or line.startswith("#"): continue name, _, value = line.partition(" ") # 按第一个空格切成 名字 / 值 out[name.strip()] = value.strip() return out old = load(sys.argv[1]) new = load(sys.argv[2]) for name in sorted(set(old) & set(new)): if old[name] != new[name]: print(f"{name:26s} {old[name]:>14s} -> {new[name]}")

partition(" ")只按第一个空格切,所以后面带空格的值不会被切碎。set(old) & set(new)取交集,是为了跳过只存在于一侧的参数(比如换固件后新增或删除的项),需要单独统计的话把交集改成并集再判断是否存在即可。参数就是两个文件路径,按python param_diff.py 旧.parm 新.parm调用。常见做法是把每次试飞前的参数都导一份,出问题时对比「飞行前」和「上一次正常」,比翻聊天记录快得多。

3. 姿态与航向链路:AHRS_ORIENTATION 之后的六个参数怎么排顺序

姿态链路上最容易出的问题不是参数值本身错,而是顺序错。有人一上来就调 AHRS_TRIM 修倾斜,结果发现是飞控板装反了;有人外接罗盘装好后航向偏 90 度,回头去改 AHRS_ORIENTATION,越改越乱。这条链路有明确的依赖顺序:先定死飞控板相对机体的安装朝向,再修机架与板子之间的微小角度差,然后决定 GPS 要不要参与姿态估计、参与多深,最后才是罗盘这一路——包括外接罗盘的独立朝向和电机磁干扰补偿。顺序错了,前面调的都会被后面覆盖掉。

3.1 AHRS_ORIENTATION 的 37 个枚举不是按角度递增排的

文档里 AHRS_ORIENTATION 给了 0 到 37 共 38 个取值(0 到 37),本意是让安装角度和板子默认朝向可以相差 45 度或 90 度。但它的编码方式不是「一路 yaw 加 45 度」,而是分段的:0 到 7 是纯偏航旋转,每档 45 度;8 到 15 是「横滚 180 度」打底再叠偏航;16 到 23 换成横滚 90 / 270;24 到 27 是俯仰 90 / 270;28 以后是各种复合姿态,比如 28 是横滚 90 加俯仰 90,36 是横滚 90 加俯仰 180 再加偏航 90。

这意味着「我知道自己转了 135 度,所以填 3」这种推法是危险的,因为从第 8 个值开始,数字和角度就没有直观对应关系了。实际操作里我一般不在参数树里手敲数字,而是在地面站的安装朝向下拉框里选,选完再回参数树核对一眼数值。如果只能手改,就老老实实查表,别凭记忆。

更关键的是文档里那句「这个参数将在下一次重启时生效,重启前必须将设备放置水平」。这不是客套话。这个参数改变的是 IMU 读数的旋转变换,重启时飞控会重新建立加速度计基准。如果重启瞬间飞机是斜着放的,零点就带进去了,表现为悬停时飞机一直往一个方向飘,而你在地面怎么调微调都调不回来。常见做法是:飞机水平放在桌面,写参数,断电,保持水平重新上电,静置十来秒等 EKF 收敛,再看 HUD 上的姿态角是不是接近 0。

3.2 AHRS_TRIM_X/Y:用弧度补安装误差,别拿遥控微调顶

AHRS_TRIM_X 和 AHRS_TRIM_Y 补偿的是机架和飞控板之间的横滚角、俯仰角差异,范围 ±0.1745 弧度(约 ±10 度),正值分别对应右倾和抬头。它和遥控器上的微调是两回事:遥控微调改的是你发出的指令,AHRS_TRIM 改的是飞控对「水平」的定义。用错了地方,切到自稳模式时飞机会突然朝一边偏,因为飞控认为的水平和你眼里的水平不是一个。

判断要不要动这两个参数的方法很朴素:飞机放平,看 HUD 上的横滚和俯仰角。如果静止状态下稳定显示 2 到 3 度,先别急着改参数,检查一下起落架是不是不平、机翼有没有上反角带来的视觉误差。真要改,按「度数 × 0.01745」换算成弧度填进去,一次别超过 1 度,改完重启再看。我见过有人直接用遥控微调把飞机「配平」到能飞,结果一进自动模式就翻——因为自动模式用的是飞控自己的姿态基准,不吃遥控微调那一套。

3.3 GPS 参与姿态估计的三道闸门

GPS 在这条链路里参与姿态估计,靠的是三个参数配合,任何一个设错都会让效果打折。

参数默认值作用注意点
AHRS_GPS_USE10 为盲预测,1 为 GPS 参与导航正常飞行必须非零
AHRS_GPS_GAIN1.0GPS 数据用于姿态估计的参与度,0 到 1固定翼不要设 0,否则失控
AHRS_GPS_MINSATS6用 GPS 速度修正姿态所需的最小卫星数6 差不多是不可靠临界点

文档里「固定翼飞机请勿设置为 0,否则将导致失控」这句话是加粗级别的警告。原理上是:固定翼没有多旋翼那种靠姿态角自稳的能力,GPS 速度信息是判断机头实际指向的重要参考,把这个权重归零等于让飞控失去一个关键约束。而 AHRS_GPS_MINSATS 设 6 的逻辑是,卫星数不到 6 颗时 GPS 速度数据本身就不够可靠,拿来修正加速度计反而引入噪声。很多人为了「让 GPS 快点生效」把这个值降到 4,结果起飞阶段姿态抖得厉害。

还有一个稍微绕一点的是 AHRS_COMP_BETA,默认 0.1,作用是控制融合空速/航向和 GPS 数据来估计地速的交叉频率,时间常数等于 0.1/beta。beta 取 0.1 时时间常数就是 1 秒;beta 调小到 0.05,时间常数变 2 秒,意味着用更少的 GPS 数据、更多依赖空速。这个参数一般不动,只有在空速计特别可靠、GPS 环境特别差的平台上才考虑微调。

3.4 外接罗盘:COMPASS_ORIENT 和 AHRS_ORIENTATION 是两套坐标

这是我最想强调的一处。文档写得很清楚:「如果使用了外罗盘,COMPASS_ORIENT 选项独立于 AHRS_ORIENTATION 选项。」换句话说,飞控板怎么装由 AHRS_ORIENTATION 描述,外接罗盘怎么装由 COMPASS_ORIENT 单独描述,两者互不覆盖。很多人把外罗盘装到机翼上、朝向转了 90 度,却只改了 AHRS_ORIENTATION,结果航向永远差 90 度,怎么校准都校不回来。

相关的一组参数是这些:COMPASS_EXTERNAL 在部分平台上要手工设为 1(内部 0 / 外部 1),某些平台是自动识别的;COMPASS_AUTODEC 启用后用 GPS 坐标自动算磁偏角;COMPASS_DEC 是手工填的磁偏角,单位弧度;COMPASS_LEARN 启用后自动获取罗盘偏移;COMPASS_DEV_ID、COMPASS_DEV_ID2、COMPASS_DEV_ID3 是设备 ID,文档明确写了「自动检测,请勿手动修改」。最后这条是真的别碰,手动改 ID 会导致飞控认不到罗盘,症状是「罗盘消失」,你以为是硬件坏了。

一个实操顺序:先确认罗盘被识别(三个 DEV_ID 里有值且不是 0),再设 EXTERNAL,再设 ORIENT,然后做一次完整的罗盘校准,最后才开 COMPASS_LEARN。顺序反了,校出来的偏移是带朝向误差的,后面还得重来。

3.5 COMPASS_MOT_X/Y 的实测标定流程

COMPASS_MOT_X 和 COMPASS_MOT_Y 补偿的是电机电流对罗盘的干扰,单位是「每安培的偏移量」,本质上是「系数 × 当前油门值」加到对应轴的读数上。取值范围 -1000 到 1000,默认 0。

标定流程我在几个平台上都跑过一遍,大致是这样:拆桨(这一步不能省),飞机固定好,上电等 EKF 收敛,然后用地面站的电机测试功能或者直接发指令,让油门在 0%、25%、50%、75%、100% 各停十几秒,同步记录罗盘的 X/Y 原始值和电流值。原始磁场数据可以从 RAW_IMU 消息里拿:

# 采集罗盘原始三轴磁场,用来做油门-磁场干扰的线性拟合 from pymavlink import mavutil m = mavutil.mavlink_connection('/dev/ttyUSB0', baud=57600) m.wait_heartbeat() while True: msg = m.recv_match(type='RAW_IMU', blocking=True, timeout=2) if msg is None: break # xmag / ymag / zmag 是罗盘三轴原始读数,单位随固件而定 print(f"{msg.xmag:8d} {msg.ymag:8d} {msg.zmag:8d}")

mavutil.mavlink_connection的第一个参数是链路,串口写设备路径,UDP 写udpin:0.0.0.0:14550之类的地址;wait_heartbeat()阻塞等心跳,确保链路通了再往下走。recv_match里的type='RAW_IMU'是关键,罗盘原始值挂在这条消息上,不是SCALED_IMU。超时设 2 秒是为了避免链路断了以后脚本卡死。

拿到数据后做的是线性拟合:以电流(或油门百分比)为横轴,磁场 X/Y 为纵轴,斜率就是 COMPASS_MOT_X/Y 要填的值。如果拟合出来斜率很大,先别急着填参数,检查罗盘是不是离电调太近、线束有没有拧成麻花——硬件布局的问题用参数补,永远是事倍功半。

4. 失效保护与标定:AFS 总闸、42 这个值,还有空速电池的管脚账

AFS 这一组参数是整份文档里信息密度最高的部分,也是最容易被误用的部分。它的定位是「高级失效保护」,处理的是通讯中断、GPS 丢失、气压计失灵、超出地理围栏这类极端情况,触发后的动作可以很温和(继续飞完当前任务),也可以很激烈(原地坠机)。而 ARSPD、BATT、ARMING 这几组看着平淡,实际上是每次上电都会走一遍的检查项,管脚号填错、倍率填错,读数就是错的,而飞控不会报错,只会安静地用错误数据继续飞。

4.1 AFS_ENABLE 是总闸,子开关单独打开不生效

文档对 AFS_ENABLE 的描述只有一句:「这个选项启用高级失效保护系统。若设为 0(禁用)所有高级失效保护功能无效。」这句话决定了整组参数的调试顺序:先把总闸打开,再逐个打开子项,否则你改了 AFS_GEOFENCE、AFS_RC、AFS_DUAL_LOSS,看起来都配好了,实际上一个都不生效,而参数树上这些值又确确实实写着 1,排查起来非常迷惑。

子项的分工大致是这样:AFS_GEOFENCE 管地理围栏,AFS_RC 和 AFS_RC_FAIL_TIME 管遥控信号失效,AFS_DUAL_LOSS 管双重失效判定,AFS_MAX_COM_LOSS 和 AFS_MAX_GPS_LOSS 限制通讯失联和 GPS 丢失的累计次数(0 表示不限次数),AFS_RC_MAN_ONLY 决定是否只允许在手动模式下恢复。这几个参数合起来描述的是「什么样的失效组合,触发什么级别的响应」。

一次写到位比一个一个试更安全,因为最怕的是「半开」状态——总闸开了,某些子项还关着,你以为有保护其实没有。我一般用一段脚本批量写入,写完再回读核对:

# 一次把 AFS 组的保护项配齐,避免出现“半开”状态 # 注意 AFS_QNH_PRESSURE 单位是毫米汞柱,标准大气压约 760 mavproxy.py --master=/dev/ttyUSB0 --baud=57600 --cmd=" param set AFS_ENABLE 1 param set AFS_DUAL_LOSS 1 param set AFS_GEOFENCE 1 param set AFS_RC 1 param set AFS_RC_FAIL_TIME 1 param set AFS_MAX_COM_LOSS 5 param set AFS_MAX_GPS_LOSS 5 param set AFS_AMSL_LIMIT 400 param set AFS_AMSL_ERR_GPS 30 param set AFS_QNH_PRESSURE 760 param set AFS_TERM_ACTION 0 exit"

param set是 MAVProxy 写参数的语法,参数名和值之间用空格隔开,多条命令用分号或换行分开。这里AFS_TERM_ACTION特意设成 0(无额外动作),是在台架验证阶段的做法——先确认保护逻辑触发正确,再决定要不要上激烈动作。AFS_AMSL_LIMIT 400表示海拔 400 米的高度限制,AFS_AMSL_ERR_GPS 30是从限制值里减掉的 30 米裕量。这两个值必须结合当地海拔和空域要求

本文还有配套的精品资源,点击获取