1. 布防与安全系统概述
在无人机飞控系统中,布防(Arming)和安全系统是最基础也是最重要的功能模块之一。ArduPilot作为开源飞控领域的标杆项目,其布防和安全系统的设计理念直接影响着整个飞行器的安全性能。
布防系统本质上是一套"电子保险栓"机制,它决定了电机是否能够输出动力。就像战斗机发射导弹前需要解除多重保险一样,ArduPilot的布防流程包含了十余项安全检查,只有当所有条件都满足时,飞控才会允许电机启动。我在2016年参与农业无人机项目时,就曾因为忽视了一个简单的电压检测条件,导致现场演示时无法布防,这个教训让我深刻理解了这套系统的重要性。
安全系统则像是无人机的"神经系统",持续监控着飞行状态。它包含故障检测、失效保护和应急响应三个层次。以我调试过的六旋翼为例,当GPS信号丢失时,系统会立即切换至光流定位;若光流也失效,则会根据最后已知位置执行自动返航。这种分级响应的设计理念,使得系统既不会对临时干扰过度反应,又能在真正危险时快速介入。
2. 布防系统深度解析
2.1 布防条件检查机制
ArduPilot的布防检查是通过ARMING_CHECK掩码实现的,开发者可以通过参数ARMING_CHECK配置需要检查的项目。典型的检查项包括:
| 检查项 | 参数位 | 说明 | 典型阈值 |
|---|---|---|---|
| 罗盘校准 | bit0 | 检查磁力计偏移量 | OFFSET_MAX=500 |
| 加速度计校准 | bit1 | 检查加速度计偏差 | 偏差<0.25G |
| 遥控器信号 | bit3 | 检测遥控器输入 | 各通道PWM在900-2100us |
| 飞行模式 | bit5 | 检查是否为允许布防的模式 | 非CRASH模式 |
| GPS定位 | bit6 | 检查GPS状态 | hdop<2.0 |
在代码层面,这些检查主要在AP_Arming::pre_arm_checks()中实现。以电压检查为例,其核心逻辑是:
cpp复制if ((checks_to_perform & ARMING_CHECK_VOLTAGE) &&
!failsafe.battery_voltage) {
if (battery.voltage() < MIN_VOLTAGE) {
check_failed(ARMING_CHECK_VOLTAGE, "Low battery");
return false;
}
}
实际调试中发现,有些飞控板电压检测电路存在约0.3V的测量偏差,建议在参数表中将MIN_VOLTAGE设置比理论值高10%
2.2 多模式布防方式
ArduPilot支持多种布防触发方式,每种方式都有其适用场景:
-
遥控器组合键(最常见):
- 通常设置为右摇杆右下角保持2秒
- 需要在RCx_OPTION参数中配置对应通道
- 优势:操作直观,符合飞行员习惯
-
MAVLink指令:
- 通过地面站发送ARMING_COMMAND
- 适用于自动化测试场景
- 需要配置SERIALx_PROTOCOL参数
-
IO触发:
- 使用AUX端口连接物理开关
- 工业无人机常用方案
- 需要设置BRD_PWM_COUNT参数
-
自动布防:
- 配置ARMING_AUTO=1
- 起飞时自动完成布防
- 仅建议在特定商业场景使用
在代码实现上,所有布防请求最终都会调用AP_Arming::arm()方法。这个方法会依次执行:检查→设置armed标志→初始化控制器→启动电机。其中电机启动采用缓启动策略,通过MOT_SLEW_TIME参数控制转速爬升时间(默认0.5秒)。
3. 安全系统架构剖析
3.1 多级故障检测系统
ArduPilot的安全系统采用分层检测架构,从硬件层到应用层共有五级检测:
-
传感器健康度监测:
- 使用Signal Quality Indicator(SQI)评估传感器可靠性
- 例如:加速度计通过振动频谱分析检测异常
-
数据一致性检查:
- 比较不同传感器数据差异
- 典型如:GPS速度与惯导速度差值检查
-
控制器状态监控:
- 监测姿态控制器输出是否饱和
- 检测位置误差是否超过阈值
-
执行机构反馈:
- 通过ESC遥测检测电机转速
- 比较指令PWM与实际转速差异
-
环境感知校验:
- 避障传感器数据融合
- 地形跟随高度验证
在代码中,这些检测主要分布在AP_Failsafe模块。以电池检测为例,其采用滑动窗口滤波算法:
cpp复制void AP_BattMonitor::update_failsafes()
{
_avg_voltage = 0.8f * _avg_voltage + 0.2f * voltage();
if (_avg_voltage < _failsafe_voltage) {
trigger_failsafe();
}
}
3.2 失效保护策略
当检测到故障时,系统会根据故障等级采取不同响应:
| 故障等级 | 触发条件 | 默认响应 | 参数配置 |
|---|---|---|---|
| 警告 | 暂时性异常 | 仅记录日志 | FS_ACTION=0 |
| 一级 | 可继续飞行 | 模式降级 | FS_ACTION=1 |
| 二级 | 需立即处理 | 自动返航 | FS_ACTION=2 |
| 紧急 | 危及安全 | 立即降落 | FS_ACTION=3 |
特别值得注意的是FS_OPTIONS参数,它允许配置特殊场景下的行为。例如:
- bit0:禁用GPS失效保护
- bit1:低电量时继续任务
- bit2:失控时保持悬停
在室内飞行测试时,建议设置FS_OPTIONS=3(禁用GPS和位置失效保护),否则可能因定位误差触发误保护
4. 关键问题排查指南
4.1 典型布防失败案例
根据社区反馈统计,布防失败主要集中在以下场景:
-
罗盘校准问题(占比42%):
- 现象:地面站显示"Compass not healthy"
- 排查步骤:
- 检查COMPASS_USE参数是否正确
- 使用magfit工具分析校准数据
- 确认没有强磁场干扰源
-
加速度计异常(占比23%):
- 现象:"Accels not healthy"
- 解决方案:
- 执行level校准
- 检查vibration_level参数
- 加固飞控减震措施
-
参数配置冲突(占比18%):
- 典型如ARMING_CHECK与FS_ACTION矛盾
- 建议使用参数验证工具检查
4.2 安全系统误触发处理
安全系统最常见的误触发场景及应对方法:
案例1:GPS失效保护误触发
- 现象:户外飞行时突然进入RTL模式
- 根本原因:hdop瞬时跳变
- 解决方案:
- 调整FS_GPS_ENABLE=2(延迟触发)
- 设置GPS_HDOP_GOOD=250
- 增加GPS_HDOP_FILTER滤波
案例2:低电量提前保护
- 现象:电池仍有30%电量却触发降落
- 排查步骤:
- 校准BATT_VOLT_MULT参数
- 调整BATT_LOW_MAH值
- 检查电池老化情况
5. 高级配置技巧
5.1 自定义布防逻辑
通过修改AP_Arming_custom.cpp可以实现特殊布防逻辑。例如农业无人机常用的"喷药系统联锁":
cpp复制bool AP_Arming_Custom::pre_arm_checks()
{
if (!AP_Arming::pre_arm_checks()) {
return false;
}
// 检查喷药系统压力
if (sprayer.pressure < SPRAY_MIN_PRESSURE) {
check_failed(ARMING_CHECK_NONE, "Spray pressure low");
return false;
}
return true;
}
5.2 安全系统优化策略
对于专业应用场景,建议考虑以下优化:
-
传感器冗余设计:
- 配置多个IMU和GPS
- 设置EK3_SRC_OPTIONS参数
-
动态阈值调整:
cpp复制// 根据飞行高度调整位置误差阈值 void AP_Failsafe::update_pos_threshold() { float alt = inertial_nav.get_altitude(); _pos_err_thresh = MAX(alt * 0.2f, 5.0f); } -
机器学习异常检测:
- 使用LSTM网络分析传感器时序
- 集成TensorFlow Lite模型
在极飞农业无人机项目中,我们通过增加振动频谱分析模块,将电机故障的提前预警时间提高了60%。这需要在AP_Notify中添加特殊告警模式:
cpp复制void AP_Notify::handle_vibration_alert()
{
if (vibration_status > THRESHOLD) {
set_rgb_led(255,50,0); // 琥珀色闪烁
play_pattern(SOUND_ALERT);
}
}
布防与安全系统的调试需要耐心和系统思维。建议每次修改参数后,先在模拟器(如SITL)中进行全面测试。记住一个原则:安全系统应该像优秀的副驾驶一样,既不会干扰正常操作,又能在关键时刻挽救飞机。