
简介「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毫米汞柱标准大气压 7600 表示禁用AHRS_TRIM_X / Y / Z弧度范围 ±0.1745约等于 ±10 度COMPASS_DEC弧度范围 ±3.142CAM_DURATION0.1 秒填 10 是 1 秒填 50 是 5 秒ARSPD_FBW_MIN / MAX米/秒22 表示 22 m/s不是 km/hCOMPASS_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 锁定和遥控同时有效才允许解锁填 7264 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 --baud57600 \ --cmdparam 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, encodingutf-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 / 27024 到 27 是俯仰 90 / 27028 以后是各种复合姿态比如 28 是横滚 90 加俯仰 9036 是横滚 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, baud57600) m.wait_heartbeat() while True: msg m.recv_match(typeRAW_IMU, blockingTrue, timeout2) 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里的typeRAW_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 --baud57600 --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 exitparam set是 MAVProxy 写参数的语法参数名和值之间用空格隔开多条命令用分号或换行分开。这里AFS_TERM_ACTION特意设成 0无额外动作是在台架验证阶段的做法——先确认保护逻辑触发正确再决定要不要上激烈动作。AFS_AMSL_LIMIT 400表示海拔 400 米的高度限制AFS_AMSL_ERR_GPS 30是从限制值里减掉的 30 米裕量。这两个值必须结合当地海拔和空域要求本文还有配套的精品资源点击获取