ArduPilot固定翼参数树详解:从AHRS_ORIENTATION到AFS_失效保护配置 简介这份文档面向无人机、航模飞控调试的初学者与进阶玩家针对 Mission Planner 地面站参数树条目繁多、英文术语晦涩、新手难以快速定位关键项的痛点对参数树进行了系统翻译与归纳。内容覆盖 ACRO 特技模式锁定与角速度、ADSB 广播式监视、AFS 高级失效保护含 AMSL 高度限制、通讯与 GPS 丢失阈值、终止动作引脚、AHRS 姿态估计与安装朝向、高度控制算法等核心参数逐条给出中文释义、取值范围与调参提示。资源包为 1 个 docx 文档约 75KB便于离线查阅与打印对照。目前已有 9978 人学习下载适合在装机、试飞与故障排查时作为手边速查手册帮助读者理解参数含义、减少误设风险提升调参效率与飞行安全性。1. 参数树不是字典是飞行包线的边界条件很多人第一次打开 Mission Planner 的 Full Parameter Tree看到上千行ACRO_、AFS_、AHRS_开头的条目第一反应是找一份中文对照表把不认识的词查一遍。但真正飞过几次之后你会发现参数表的价值不在于“这个词什么意思”而在于“这个值改完之后飞机在什么条件下会做出什么动作”。比如AFS_AMSL_LIMIT设成 0 是禁用高度限制设成 120 意味着气压高度一旦超过 120 米飞控会直接触发终止逻辑——这不是一个翻译问题而是一个安全边界问题。这份文档把 ArduPilot 固定翼参数树按字母序做了逐条翻译和范围标注适合两类人一是刚接触 Mission Planner 地面站、需要快速定位某个参数含义的新手二是已经能飞手动模式、准备进入自动任务和失效保护配置阶段的飞手。它不教你 PID 怎么调但能让你在改TECS_或NAVL1_之前先搞清楚哪些参数碰了会直接改变飞行器的失效行为。2. 从 AHRS_ORIENTATION 到 COMPASS_ORIENT姿态与罗盘安装的坐标系对齐2.1 为什么安装朝向参数不能靠猜AHRS_ORIENTATION和COMPASS_ORIENT是参数树里最容易设错、设错后后果最直接的两个参数。它们解决的是同一个问题的两个层面飞控板在机架里怎么装的外置罗盘又怎么装的。飞控固件默认认为板子的 X 轴指向机头、Y 轴指向右侧、Z 轴指向下方。如果实际安装时板子旋转了 90 度加速度计和陀螺仪读出来的“前方”其实是机架的“右方”姿态解算会直接错乱。AHRS_ORIENTATION就是告诉飞控这个旋转量取值范围从 0 到 37覆盖了 45 度步进的偏航旋转以及各种翻转组合。常见做法是先看飞控说明书确认板子默认朝向再根据实际安装角度查表选值。比如板子默认接口朝后但你把它横过来装了机头方向对应板子的右侧那就需要选一个 Yaw90 或 Yaw270 的值具体是哪个取决于旋转方向。2.2 参数取值与验证方法下面这段 Python 脚本用 pymavlink 读取当前AHRS_ORIENTATION和COMPASS_ORIENT的值并打印出对应的朝向描述。它适合在调参前跑一遍确认飞控里存的值和你以为的一致。from pymavlink import mavutil # 连接飞控端口按实际情况改 master mavutil.mavlink_connection(/dev/ttyUSB0, baud57600) master.wait_heartbeat() # 参数名到朝向描述的映射部分常用值 orient_map { 0: None (默认: X前 Y右 Z下), 1: Yaw45, 2: Yaw90, 3: Yaw135, 4: Yaw180, 5: Yaw225, 6: Yaw270, 7: Yaw315, 8: Roll180, 16: Roll90, 24: Pitch90, 25: Pitch270 } for pname in [AHRS_ORIENTATION, COMPASS_ORIENT]: master.mav.param_request_read_send( master.target_system, master.target_component, pname.encode(), -1 ) msg master.recv_match(typePARAM_VALUE, blockingTrue, timeout3) if msg: val int(msg.param_value) desc orient_map.get(val, f其他值({val})请查完整表) print(f{pname} {val} - {desc})逻辑说明脚本通过 MAVLink 的PARAM_REQUEST_READ消息逐个请求参数值收到PARAM_VALUE后解析。orient_map只列了最常用的几个值完整表在文档里有 0 到 37 的全量对照。参数说明master.target_system和target_component通常保持默认的 1 和 1timeout3是等待响应的秒数数传延迟高时可以加到 5。注意AHRS_ORIENTATION修改后必须重启飞控才生效而且重启前要把飞机放水平。文档里明确写了这一点但很多人改完直接解锁结果姿态零点偏移。2.3 COMPASS_ORIENT 与 AHRS_ORIENTATION 的独立关系外置罗盘的朝向参数COMPASS_ORIENT是独立于AHRS_ORIENTATION的。也就是说飞控板可以旋转 90 度安装外置罗盘也可以有自己的旋转角度两者互不影响。文档里特别强调如果使用了外置罗盘COMPASS_ORIENT需要根据罗盘手册单独设置。验证方法是把飞机机头指向正西看 Mission Planner 的 HUD 上罗盘读数——Y 轴应该有正读数X 轴接近 0。如果不对就说明COMPASS_ORIENT设错了。常见做法是先用COMPASS_LEARN做一次自动学习让飞控自己算偏移但朝向参数必须手动设对自动学习不会帮你纠正安装方向。3. AFS_ 系列失效保护参数从心跳引脚到飞行终止的完整链路3.1 高级失效保护系统的分层逻辑AFS_开头的参数构成了一套独立于普通失控保护FS_系列的高级失效保护系统。它的核心思路是当飞控检测到某些不可恢复的故障时不是简单地返航或盘旋而是执行更激烈的动作——包括强制飞行终止。文档里几个关键参数的关系是这样的AFS_ENABLE是总开关设为 0 则所有 AFS 功能失效AFS_TERMINATE可以在飞行中动态设置来强行终止AFS_TERM_ACTION决定终止后做什么默认 0 是没动作设为 42 这个“魔数”则会在所有舵面执行最大打舵加 0 油门。AFS_HB_PIN和AFS_TERM_PIN是两个数字 IO 口前者以 10Hz 翻转作为心跳信号后者在终止后输出高电平。这套机制通常配合外部失效保护板使用让外部硬件能区分“飞控死机”和“飞控主动终止”。3.2 参数配置表与典型场景下表列出了 AFS 系列中最常需要调整的参数及其典型值适用于固定翼长航时任务。参数名默认值建议范围作用AFS_ENABLE00/1总开关0 禁用全部 AFSAFS_AMSL_LIMIT00 或任务高度50海拔限制超限强制终止AFS_AMSL_ERR_GPS-1-1 或 10~30GPS 高度误差裕量-1 表示气压计失效立即终止AFS_QNH_PRESSURE01013.25 对应值QNH 压强0 禁用高度限制AFS_TERM_ACTION00 或 42终止后动作42 为最大打舵坠机AFS_MAX_GPS_LOSS00 或 3~5GPS 丢失累计次数上限0 为不限AFS_WP_COMMS0任务航点编号通讯失联时飞往的航点这张表的使用场景是你在做超视距任务空域有高度上限且飞机上装了外部终止板。AFS_AMSL_LIMIT设成比批准高度低 20 米左右AFS_AMSL_ERR_GPS设成 15 米左右这样即使气压计漂移GPS 高度也不会让飞机突破硬限制。AFS_TERM_ACTION保持 0因为终止动作交给外部板执行软件层不参与。3.3 用 MAVLink 动态设置 AFS_TERMINATEAFS_TERMINATE的特殊之处在于它可以在飞行中通过 MAVLink 命令动态设置。下面这段代码演示如何通过地面站脚本发送参数设置指令。from pymavlink import mavutil import time master mavutil.mavlink_connection(udp:127.0.0.1:14550) master.wait_heartbeat() def set_param(name, value, param_typemavutil.mavlink.MAV_PARAM_TYPE_REAL32): 通过 MAVLink 设置飞控参数 master.mav.param_set_send( master.target_system, master.target_component, name.encode(), float(value), param_type ) # 等待确认 ack master.recv_match(typePARAM_VALUE, blockingTrue, timeout2) if ack and ack.param_id name: print(f已设置 {name} {ack.param_value}) else: print(f{name} 设置未确认) # 动态触发飞行终止谨慎使用 set_param(AFS_TERMINATE, 1)逻辑说明param_set_send发送参数写入请求飞控收到后更新 EEPROM 并回传PARAM_VALUE作为确认。参数说明MAV_PARAM_TYPE_REAL32适用于大多数浮点参数如果是整数型参数如AFS_TERM_ACTION可以用MAV_PARAM_TYPE_INT32。这段代码只建议在地面测试时验证链路实际飞行中触发终止需要配合外部硬件确认。注意文档里AFS_AMSL_ERR_GPS的说明提到“OBC 用户应当将这个值设置得与 D2 安全盒一致”这里的 OBC 指机载计算机D2 是某种安全盒型号。如果你没有外部安全盒这个参数保持 -1 即可意味着气压计失效会立即触发终止。4. 空速计与电池监控ARSPD_ 和 BATT_ 参数的校准链路4.1 ARSPD_RATIO 与 ARSPD_OFFSET 的标定顺序空速计参数里ARSPD_RATIO和ARSPD_OFFSET是两个必须校准的值。文档里ARSPD_OFFSET默认 2.333235ARSPD_RATIO默认 1.9936但这些默认值只对特定硬件有意义。正确流程是先在地面做一次“零空速校准”让飞控记录当前传感器读数作为偏移然后在飞行中做“比例校准”让飞控用地速和空速的比值来修正ARSPD_RATIO。ARSPD_AUTOCAL设为 1 可以开启飞行中自动校准文档说如果比率变化超过 5%新值会每隔 2 分钟存入 EEPROM。ARSPD_TUBE_ORDER默认 2表示接受任意皮托管连接顺序但如果你明确知道动静压管的接法设成 0 或 1 可以让飞控检测静压过大导致的假空速。4.2 电池监控参数的硬件对应关系BATT_系列参数里最容易搞混的是引脚编号。文档里写得很清楚BATT_VOLT_PIN和BATT_CURR_PIN的取值取决于硬件平台。APM2.5 电源模块的电压引脚是 13电流引脚是 12Pixhawk 电源模块的电压引脚是 2电流引脚是 3PX4 的电压引脚是 100电流引脚是 101。BATT_VOLT_MULT默认 10.1对应 3DR 电源模块如果用的是 3DR 四合一电调这个值要改成 12.02。BATT_AMP_PERVOLT默认 17表示电流传感器每输出 1V 对应 17 安培。这些值设错不会导致飞控报错但会导致电压和电流读数完全失真进而影响FS_BATT_VOLTAGE和FS_BATT_MAH的触发时机。4.3 用脚本批量读取和校验监控参数下面这段脚本一次性读取所有电池和空速相关参数并和文档中的推荐值做对比。from pymavlink import mavutil master mavutil.mavlink_connection(/dev/ttyUSB0, baud57600) master.wait_heartbeat() # 文档推荐值以 Pixhawk 3DR 电源模块为例 expected { BATT_MONITOR: 4, BATT_VOLT_PIN: 2, BATT_CURR_PIN: 3, BATT_VOLT_MULT: 10.1, BATT_AMP_PERVOLT: 17.0, ARSPD_PIN: 15, ARSPD_TUBE_ORDER: 2, ARSPD_USE: 1, } for pname, exp_val in expected.items(): master.mav.param_request_read_send( master.target_system, master.target_component, pname.encode(), -1 ) msg master.recv_match(typePARAM_VALUE, blockingTrue, timeout3) if msg: actual msg.param_value status OK if abs(actual - exp_val) 0.01 else 需检查 print(f{pname}: 当前{actual}, 推荐{exp_val} [{status}])逻辑说明脚本遍历一个预期值字典逐个请求参数并比较。abs(actual - exp_val) 0.01是浮点比较的容差。参数说明ARSPD_PIN在 Pixhawk 上设为 15 对应模拟空速计接口如果用 I2C 空速计则设为 65。BATT_MONITOR设为 4 表示同时监控电压和电流设为 3 则只监控电压。注意文档里BATT_CAPACITY默认 3300 mAh这个值必须改成你实际电池的容量否则FS_BATT_MAH的剩余电量估算会完全不准。5. 参数树检索与批量导出用 MAVExplorer 和 pymavlink 做差异对比5.1 为什么需要参数差异对比调参过程中最危险的操作是“改了一个参数但忘了改之前是什么”。Mission Planner 的 Full Parameter Tree 支持保存参数文件但如果你同时维护多架飞机、或者在不同固件版本之间迁移手动对比几百个参数是不现实的。常见做法是用 pymavlink 把当前参数全部拉下来存成文本然后用 diff 工具对比两个文件。文档里FORMAT_VERSION参数会在 EEPROM 格式变化时增长这个值可以用来判断两个参数文件是否来自兼容的固件版本。5.2 批量导出全部参数的脚本from pymavlink import mavutil import json master mavutil.mavlink_connection(udp:127.0.0.1:14550) master.wait_heartbeat() # 请求全部参数 master.mav.param_request_list_send( master.target_system, master.target_component ) params {} while True: msg master.recv_match(typePARAM_VALUE, blockingTrue, timeout5) if msg is None: break params[msg.param_id] { value: msg.param_value, type: msg.param_type, index: msg.param_index, count: msg.param_count } # 收齐后退出 if len(params) msg.param_count: break # 存成 JSON方便后续 diff with open(params_current.json, w) as f: json.dump(params, f, indent2, sort_keysTrue) print(f共导出 {len(params)} 个参数)逻辑说明param_request_list_send请求飞控发送全部参数飞控会分批回传PARAM_VALUE消息。msg.param_count是参数总数收齐后跳出循环。参数说明timeout5在数传速率低时需要加大存成 JSON 后可以用jq或 Python 的json模块做差异对比。比如对比两个文件# 用 jq 提取参数名和值排序后 diff jq -r to_entries[] | \(.key)\(.value.value) params_current.json | sort a.txt jq -r to_entries[] | \(.key)\(.value.value) params_backup.json | sort b.txt diff a.txt b.txt这段 bash 命令把 JSON 转成参数名值的纯文本排序后对比。输出中开头的是当前文件独有的值开头的是备份文件独有的值。常见做法是每次飞行前导出一次参数落地后如果改了东西用 diff 确认改了什么。5.3 用 MAVExplorer 做参数趋势查看MAVExplorer 是 ArduPilot 生态里的日志分析工具它也能读取参数文件并做可视化对比。如果你有多个.param文件可以用MAVExplorer.py --param加载后查看参数变化。不过对于纯参数对比上面的 JSON diff 方案更轻量。文档里提到的COMPASS_DEV_ID、COMPASS_DEV_ID2这些自动检测参数在不同飞控之间会不同做 diff 时应该忽略这些硬件相关的 ID 字段只关注你手动改过的参数。注意FORMAT_VERSION如果两个文件不一致说明固件版本不同参数含义可能有变化diff 结果只能作为参考不能直接套用。本文还有配套的精品资源点击获取