4. 主流工具链选型

起飞和降落,是无人机飞行中最容易出问题的两个阶段。我见过太多新手在SITL仿真里飞得挺好,一到了起飞和降落就手忙脚乱。说白了,这两个阶段涉及模式切换、高度判断、地面效应,任何一个环节没处理好,飞机就可能翻跟头。

这一章,咱们就把起飞和降落彻底讲透。手动怎么起?自动怎么起?降落的逻辑是什么?万一出事了怎么紧急处理?你跟着我走一遍,心里就有底了。

核心要点:起飞和降落不仅仅是“油门拉起来”和“油门收回去”。它们背后是飞控的状态机在控制——从地面到空中,再从空中回到地面,每一步都有严格的逻辑判断。

起飞与降落核心知识体系 手动起飞 自动起飞 (Takeoff) 降落 & 紧急降落 解锁 (Arm) 油门推至50%+ 离地后调整姿态 切换至Loiter/AltHold 设置目标高度 自动油门爬升 到达高度悬停 自动切换至Loiter Land模式 紧急降落 下降率控制 立即下降/解锁 关键参数:MIS_TAKEOFF_ALT · TKOFF_RAMP_TIME · LAND_SPEED · ARMING_CHECK

4.1 手动起飞流程

手动起飞,是每个飞手的基本功。在SITL仿真里,我建议你先把手动起飞练熟,再去碰自动起飞。为什么?因为手动起飞能让你直接感受油门响应和姿态变化,这对理解飞控行为很有帮助。

手动起飞的标准流程,其实就四步:

  1. 解锁(Arm)—— 通过遥控器或MAVLink指令解锁电机。解锁后,螺旋桨开始低速旋转。
  2. 推油门至50%以上—— 油门低于50%时,飞控认为你还在做地面检查。超过50%,飞控开始增加电机转速,飞机离地。
  3. 离地后调整姿态—— 飞机刚离地时容易晃动,你需要用摇杆稳住。我个人习惯是离地后先悬停半秒,确认姿态稳定再继续爬升。
  4. 切换至Loiter或AltHold模式—— 到达安全高度后,切换到定高或悬停模式,让飞控接管高度保持。

小技巧:在SITL里练习手动起飞时,可以先把油门曲线调得柔和一些。用RC3_MIN和RC3_MAX参数调整油门行程范围,让油门响应不那么灵敏。我曾经在仿真里把油门曲线设得太陡,结果一推油门飞机直接窜到10米高,吓我一跳。

手动起飞最容易犯的错误是什么?油门推得太快。你想想看,飞机在地面时,螺旋桨产生的气流会被地面反弹回来,这叫“地面效应”。地面效应会让飞机在离地瞬间获得额外的升力,如果你油门推得太猛,飞机就会突然弹跳起来。嗯,这里要注意——离地后稍微收一点油门,抵消地面效应的影响。

4.2 自动起飞逻辑(Takeoff命令)

自动起飞,说白了就是飞控帮你完成整个起飞过程。你只需要发一个Takeoff命令,设定目标高度,剩下的交给飞控。

在SITL里,自动起飞的流程是这样的:

  • 飞控收到Takeoff命令后,先检查飞机是否已解锁。如果没解锁,命令会被拒绝。
  • 解锁后,飞控自动将油门推到起飞油门值(由TKOFF_THR_MIN和TKOFF_THR_MAX参数控制)。
  • 飞机离地后,飞控以TKOFF_RAMP_TIME参数设定的速率,平滑增加油门,使飞机以恒定爬升率上升。
  • 到达目标高度后,飞控自动切换至Loiter模式,保持位置和高度悬停。

这里有个关键参数——MIS_TAKEOFF_ALT。这个参数定义了自动起飞的目标高度。我遇到过有人把这个参数设成0,结果飞控起飞后直接悬停在离地0米的位置,相当于没飞起来。所以,MIS_TAKEOFF_ALT至少要设成2米以上,留出安全空间。

自动起飞 vs 手动起飞:

对比项 手动起飞 自动起飞
操作方式 遥控器油门杆 MAVLink命令 / 任务指令
油门控制 飞手手动控制 飞控自动控制
爬升率 由飞手决定 由参数TKOFF_RAMP_TIME决定
适用场景 测试、特技飞行 任务飞行、航线规划
风险 操作失误易炸机 参数设置不当可能失控

在SITL里测试自动起飞,我建议你用mission planner的Action选项卡,直接发送Takeoff命令。你也可以在航线任务里插入一个NAV_TAKEOFF航点,让飞机在任务开始时自动起飞。

# 通过MAVLink发送Takeoff命令(目标高度10米)
# 使用pymavlink库
from pymavlink import mavutil

master = mavutil.mavlink_connection('udp:127.0.0.1:14550')
master.wait_heartbeat()

# 发送Takeoff命令
master.mav.command_long_send(
    master.target_system,
    master.target_component,
    mavutil.mavlink.MAV_CMD_NAV_TAKEOFF,
    0,  # 确认
    0,  # 俯仰角(默认0)
    0,  # 偏航角(默认0)
    0,  # 无效
    0,  # 无效
    0,  # 纬度(默认当前位置)
    0,  # 经度(默认当前位置)
    10  # 目标高度(米)
)

警告:自动起飞前,一定要确保GPS定位正常(3D Fix),且EK3_*参数配置正确。如果GPS信号不好,飞控可能无法保持位置,飞机起飞后会漂移。我在一次仿真测试中忘了检查GPS状态,结果飞机起飞后直接往北漂了50米,差点撞到虚拟的建筑物。

4.3 降落模式(Land)

降落模式,是飞控自动完成降落的过程。你切换到Land模式后,飞控会以预设的下降率(由LAND_SPEED参数控制)降低高度,直到触地。

降落模式的逻辑其实挺有意思的:

  • 飞控先以恒定下降率下降,同时保持位置(GPS或光流)。
  • 当高度低于某个阈值(默认0.5米)时,飞控进入“地面检测”阶段。
  • 飞控通过加速度计检测是否触地。如果检测到触地,飞控会自动降低油门至0,并锁定电机。
  • 如果飞控长时间检测不到触地(比如降落在软草地上),它会以更低的下降率继续下降,直到触地。

这里有个坑——LAND_SPEED参数。这个参数控制下降率,单位是厘米/秒。默认值是50(即0.5米/秒)。如果你把这个值设得太大,飞机会快速砸向地面;设得太小,降落过程会很长。我个人习惯设成30-40厘米/秒,既保证降落速度,又不会太猛。

经验之谈:在SITL里测试降落时,可以观察STATUSTEXT消息。飞控在降落过程中会输出类似Land: started、Land: descending、Land: detecting ground、Land: landed的状态信息。这些信息对调试很有帮助。

4.4 紧急降落

紧急降落,是当飞机出现严重故障时的保命手段。比如GPS丢失、电池电压过低、或者飞控检测到传感器异常。

ArduPilot提供了几种紧急降落方式:

方式 触发条件 行为
Land模式 手动切换 以正常下降率降落,保持位置
RTL(返航) 信号丢失 / 手动切换 先返航到家点,再自动降落
紧急降落(EKF Failsafe) EKF定位异常 立即下降,不保持位置
紧急解锁(Disarm) 严重故障 / 手动触发 直接锁定电机,自由落体(慎用)

我最常用的是RTL。在SITL里,你可以通过遥控器上的一个开关来触发RTL。我个人习惯把RTL设在一个容易够到的开关上,一旦发现异常,立刻拨过去。

但要注意——RTL不是万能的。如果GPS信号丢失,RTL无法返航。这时候你需要用Land模式,让飞机在当前位置上空直接降落。我曾经在一次仿真中模拟了GPS丢失,然后切换到Land模式,飞机稳稳地降落在了原地。嗯,这个测试很有必要做一遍。

紧急情况下的操作顺序:

  1. 先尝试切换至Land模式,让飞机在当前位置上空降落。
  2. 如果Land模式无效(比如飞控完全失控),尝试紧急解锁(Disarm)。
  3. 紧急解锁后,电机会立即停转,飞机自由落体。这是最后的手段,只适用于即将撞到人群或重要设施的情况。

在SITL里,我建议你专门花时间练习紧急降落流程。反复模拟GPS丢失、电池故障、电机失效等场景,直到形成肌肉记忆。

4.5 本章小结

起飞和降落,是无人机飞行的“头”和“尾”。手动起飞让你掌握油门和姿态的配合;自动起飞让你理解飞控的状态机逻辑;降落模式让你学会安全回收;紧急降落则是你的最后一道防线。