ArduPilot飞控系统架构分析
基于对ArduCopter代码的分析,我将为您详细解释ardupilot飞控系统的架构和工作原理。
1. 系统总体架构
ArduPilot是一个复杂而强大的开源无人机飞控系统,主要由以下几个部分组成:
1.1 核心组件
- 主循环(Copter.cpp): 系统入口点,负责初始化和调度各个任务
- 调度器(Scheduler): 管理不同频率的任务执行
- 飞行模式系统(Mode): 实现不同的飞行控制逻辑
- 姿态控制系统(AC_AttitudeControl): 负责稳定飞行器姿态
- 位置控制系统(AC_PosControl): 负责控制飞行器位置
- 导航系统(AC_WPNav): 负责航点导航和路径规划
- 电机输出系统(AP_Motors): 负责控制电机输出
1.2 传感器系统
- IMU(惯性测量单元): 提供加速度和角速率数据
- GPS: 提供位置、速度和时间信息
- 气压计: 提供高度信息
- 罗盘: 提供航向信息
- 光流传感器: 提供相对位移信息
- 测距仪: 提供对地高度信息
1.3 通信系统
- MAVLink协议: 与地面站通信的标准协议
- GCS(地面控制站)接口: 处理与地面站的通信
2. 主程序流程
Copter.cpp是整个系统的入口点,定义了主要的调度任务和执行流程:
2.1 初始化流程
- 硬件初始化
- 传感器初始化
- 控制器初始化
- 飞行模式初始化
- 参数加载
2.2 主循环任务
系统使用调度器(scheduler_tasks数组)来管理不同频率的任务:
const AP_Scheduler::Task Copter::scheduler_tasks[] = {
// 高优先级任务(快速循环)
FAST_TASK_CLASS(AP_InertialSensor, &copter.ins, update), // 更新IMU数据
FAST_TASK(run_rate_controller_main), // 运行姿态控制器
FAST_TASK(motors_output_main), // 输出到电机
// 中低优先级任务
SCHED_TASK(rc_loop, 250, 130, 3), // 250Hz读取遥控器输入
SCHED_TASK(throttle_loop, 50, 75, 6), // 50Hz处理油门
// ...其他任务
}
这些任务按优先级排序,每个任务都有指定的执行频率和预期执行时间。
3. 飞行模式系统
ArduCopter支持多种飞行模式,每种模式都有不同的控制逻辑和行为:
3.1 模式基类
所有飞行模式都继承自Mode基类,该基类定义了飞行模式的通用接口:
class Mode {
public:
// 返回模式编号
virtual Number mode_number() const = 0;
// 初始化模式
virtual bool init(bool ignore_checks);
// 运行模式的主逻辑
virtual void run() = 0;
// 模式特性查询
virtual bool requires_GPS() const = 0;
virtual bool has_manual_throttle() const = 0;
// ...其他特性查询方法
};
3.2 主要飞行模式
系统支持的主要飞行模式包括:
- STABILIZE: 基本的姿态稳定模式
- ALTHOLD: 高度保持模式
- LOITER: 位置保持模式
- AUTO: 自动执行任务模式
- RTL: 自动返航模式
- LAND: 自动降落模式
- GUIDED: 引导模式,接受外部控制命令
- ACRO: 特技模式,提供更直接的角速率控制
4. 控制系统架构
ArduCopter的控制系统采用了层级控制架构:
4.1 位置控制器(AC_PosControl)
位置控制器负责将目标位置转换为目标速度和加速度:
- 输入: 目标位置、速度和加速度
- 输出: 目标姿态(倾角)
- 主要功能:
- 位置PID控制
- 速度PID控制
- 加速度控制
- 运动学路径规划
4.2 姿态控制器(AC_AttitudeControl)
姿态控制器负责将目标姿态转换为电机输出:
- 输入: 目标姿态(四元数或欧拉角)和角速率
- 输出: 电机控制信号
- 主要功能:
- 姿态P控制
- 角速率PID控制
- 角加速度限制
- 电机混控
4.3 控制流程
一个典型的控制流程如下:
- 位置控制器计算目标加速度
- 位置控制器将目标加速度转换为目标倾角
- 姿态控制器计算达到目标倾角所需的角速率
- 姿态控制器计算达到目标角速率所需的电机输出
- 电机输出被发送到ESC,控制电机转速
5. 关键算法
5.1 姿态估计
系统使用扩展卡尔曼滤波器(EKF)融合多个传感器数据,估计飞行器的姿态和位置:
- 加速度计和陀螺仪数据提供短期姿态估计
- GPS和气压计数据提供长期位置和高度修正
- 罗盘数据提供航向修正
5.2 PID控制
系统使用多层PID控制器:
- 位置控制使用P控制器
- 速度控制使用PI或PID控制器
- 角速率控制使用PID控制器
5.3 运动学路径规划
系统使用加加速度限制(jerk-limited)路径规划算法,生成平滑的运动轨迹:
void AC_PosControl::shape_pos_vel_accel(...)
这个函数计算从当前状态到目标状态的平滑轨迹,考虑速度、加速度和加加速度限制。
6. 安全机制
ArduCopter实现了多种安全机制:
- 失控保护: 当遥控信号丢失时,可以自动执行返航、降落等操作
- 电池监控: 当电池电量低时,可以触发警告或自动返航
- 地理围栏: 限制飞行器的活动范围
- EKF监控: 当状态估计不可靠时,可以触发失效保护
- 碰撞避免: 支持ADSB和其他避障系统
7. 参数系统
ArduCopter使用参数系统来存储和管理配置:
// 参数实例
Parameters g;
ParametersG2 g2;
参数可以通过地面站修改,并存储在非易失性存储器中。
8. 执行流程示例
以自动模式(AUTO)为例,执行流程如下:
- 系统初始化并进入AUTO模式
ModeAuto::run()方法被调度器定期调用- 根据当前任务类型(起飞、航点、降落等),调用相应的处理函数
- 处理函数计算目标位置和速度
- 位置控制器根据目标生成姿态命令
- 姿态控制器根据姿态命令计算电机输出
- 电机输出被发送到ESC,控制电机转速
9. 总结
ArduPilot飞控系统是一个复杂而强大的系统,通过模块化设计和分层架构,实现了灵活的飞行控制功能。主要特点包括:
- 模块化设计: 各个功能模块相对独立,便于维护和扩展
- 多种飞行模式: 满足不同的飞行需求
- 强大的控制算法: 实现稳定的姿态和位置控制
- 完善的安全机制: 保障飞行安全
- 丰富的配置选项: 通过参数系统实现高度可定制性
这种架构使ArduPilot能够适应从简单的多旋翼到复杂的自主飞行器等各种应用场景。
起飞控制系统详细解读:
- 类结构分析:
- Mode基类 (mode.h/mode.cpp)
|- _TakeOff嵌套类 (处理手动起飞)
|- _AutoTakeoff嵌套类 (处理自动起飞)
- 关键成员变量:
-
_TakeOff类:
- _running: 标记起飞是否进行中
- take_off_start_alt: 起飞开始高度
- take_off_complete_alt: 起飞完成高度
-
_AutoTakeoff类:
- complete: 标记起飞是否完成
- no_nav_active: 导航控制是否激活
- complete_alt_cm: 完成高度(cm)
- terrain_alt: 是否使用地形高度
- 核心函数实现:
_TakeOff类关键函数:
-
start(): 初始化起飞参数
void _TakeOff::start(float alt_cm) { _running = true; take_off_start_alt = pos_control->get_pos_target_z_cm();

最低0.47元/天 解锁文章
3222

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



