ArduPilot固定翼参数树详解:从AHRS_ORIENTATION到AFS_失效保护配置
2026/9/23 23:27:53 网站建设 项目流程

简介:这份文档面向无人机、航模飞控调试的初学者与进阶玩家,针对 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_ORIENTATIONCOMPASS_ORIENT是参数树里最容易设错、设错后后果最直接的两个参数。它们解决的是同一个问题的两个层面:飞控板在机架里怎么装的,外置罗盘又怎么装的。飞控固件默认认为板子的 X 轴指向机头、Y 轴指向右侧、Z 轴指向下方。如果实际安装时板子旋转了 90 度,加速度计和陀螺仪读出来的“前方”其实是机架的“右方”,姿态解算会直接错乱。AHRS_ORIENTATION就是告诉飞控这个旋转量,取值范围从 0 到 37,覆盖了 45 度步进的偏航旋转以及各种翻转组合。常见做法是:先看飞控说明书确认板子默认朝向,再根据实际安装角度查表选值。比如板子默认接口朝后,但你把它横过来装了,机头方向对应板子的右侧,那就需要选一个 Yaw90 或 Yaw270 的值,具体是哪个取决于旋转方向。

2.2 参数取值与验证方法

下面这段 Python 脚本用 pymavlink 读取当前AHRS_ORIENTATIONCOMPASS_ORIENT的值,并打印出对应的朝向描述。它适合在调参前跑一遍,确认飞控里存的值和你以为的一致。

from pymavlink import mavutil # 连接飞控,端口按实际情况改 master = mavutil.mavlink_connection('/dev/ttyUSB0', baud=57600) 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(type='PARAM_VALUE', blocking=True, timeout=3) 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_systemtarget_component通常保持默认的 1 和 1;timeout=3是等待响应的秒数,数传延迟高时可以加到 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_PINAFS_TERM_PIN是两个数字 IO 口,前者以 10Hz 翻转作为心跳信号,后者在终止后输出高电平。这套机制通常配合外部失效保护板使用,让外部硬件能区分“飞控死机”和“飞控主动终止”。

3.2 参数配置表与典型场景

下表列出了 AFS 系列中最常需要调整的参数及其典型值,适用于固定翼长航时任务。

参数名默认值建议范围作用
AFS_ENABLE00/1总开关,0 禁用全部 AFS
AFS_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_TERMINATE

AFS_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_type=mavutil.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(type='PARAM_VALUE', blocking=True, timeout=2) 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_RATIOARSPD_OFFSET是两个必须校准的值。文档里ARSPD_OFFSET默认 2.333235,ARSPD_RATIO默认 1.9936,但这些默认值只对特定硬件有意义。正确流程是:先在地面做一次“零空速校准”,让飞控记录当前传感器读数作为偏移;然后在飞行中做“比例校准”,让飞控用地速和空速的比值来修正ARSPD_RATIOARSPD_AUTOCAL设为 1 可以开启飞行中自动校准,文档说如果比率变化超过 5%,新值会每隔 2 分钟存入 EEPROM。ARSPD_TUBE_ORDER默认 2,表示接受任意皮托管连接顺序,但如果你明确知道动静压管的接法,设成 0 或 1 可以让飞控检测静压过大导致的假空速。

4.2 电池监控参数的硬件对应关系

BATT_系列参数里最容易搞混的是引脚编号。文档里写得很清楚:BATT_VOLT_PINBATT_CURR_PIN的取值取决于硬件平台。APM2.5 电源模块的电压引脚是 13,电流引脚是 12;Pixhawk 电源模块的电压引脚是 2,电流引脚是 3;PX4 的电压引脚是 100,电流引脚是 101。BATT_VOLT_MULT默认 10.1,对应 3DR 电源模块;如果用的是 3DR 四合一电调,这个值要改成 12.02。BATT_AMP_PERVOLT默认 17,表示电流传感器每输出 1V 对应 17 安培。这些值设错不会导致飞控报错,但会导致电压和电流读数完全失真,进而影响FS_BATT_VOLTAGEFS_BATT_MAH的触发时机。

4.3 用脚本批量读取和校验监控参数

下面这段脚本一次性读取所有电池和空速相关参数,并和文档中的推荐值做对比。

from pymavlink import mavutil master = mavutil.mavlink_connection('/dev/ttyUSB0', baud=57600) 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(type='PARAM_VALUE', blocking=True, timeout=3) 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(type='PARAM_VALUE', blocking=True, timeout=5) 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, indent=2, sort_keys=True) print(f"共导出 {len(params)} 个参数")

逻辑说明:param_request_list_send请求飞控发送全部参数,飞控会分批回传PARAM_VALUE消息。msg.param_count是参数总数,收齐后跳出循环。参数说明:timeout=5在数传速率低时需要加大;存成 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_IDCOMPASS_DEV_ID2这些自动检测参数,在不同飞控之间会不同,做 diff 时应该忽略这些硬件相关的 ID 字段,只关注你手动改过的参数。

注意:FORMAT_VERSION如果两个文件不一致,说明固件版本不同,参数含义可能有变化,diff 结果只能作为参考,不能直接套用。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询