目的和范围
本文档描述了ArduCopter的飞行模式架构和状态机实现。它涵盖了飞行模式在控制回路中的定义、注册、切换和执行方式。这包括基Mode类、各个模式的实现、模式切换逻辑以及复杂模式(例如自动和引导模式)中的子模式状态机。
飞行模式架构
ArduCopter 采用分层飞行模式系统,每种模式都继承自一个公共Mode基类,并实现各自特定的行为。该系统支持约 30 种不同的飞行模式,每种模式都根据飞行员输入、GPS、传感器和任务指令以不同的方式控制飞行器。
模式类层次结构

模式枚举和注册
模式数
所有飞行模式均由枚举中定义的唯一编号标识Mode::Number:

众数用于:
- 参数存储(
FLTMODE1通过FLTMODE6) - MAVLink 通信(自定义模式字段)
- 模式切换命令
- 日志记录和遥测
模式注册和查找
每种模式都在类中实例化为一个单例对象Copter:
| 模式实例 | 类型 | 目的 |
|---|---|---|
mode_stabilize |
ModeStabilize |
手动稳定飞行 |
mode_acro |
ModeAcro |
杂技速率控制 |
mode_althold |
ModeAltHold |
高度保持 |
mode_auto |
ModeAuto |
自主任务 |
mode_guided |
ModeGuided |
GCS/脚本控制 |
mode_loiter |
ModeLoiter |
GPS定位保持 |
mode_rtl |
ModeRTL |
返回启动页面 |
| ... | ... | ... |
该mode_from_mode_num()函数将模式编号映射到模式对象:

模式切换状态机
模式切换逻辑已实现,Copter::set_mode()并且在允许模式更改之前包含多个验证检查。
模式转换流程

模式更改验证检查
模式切换期间(布防时)将执行以下检查:
| 查看 | 健康)状况 | 受影响的模式 |
|---|---|---|
| 节气门位置 | 油门必须低 | 手动油门模式 |
| GPS定位 | 需要有效职位 | requires_GPS() == true |
| 海拔估算 | 所需有效海拔高度 | 非手动油门模式 |
| 转子运转 | 转子必须运转 | 仅限直升机 |
| 围栏恢复 |



被折叠的 条评论
为什么被折叠?



