Ardupilot源码框架

时间:2024-04-04 21:57:07

    前面都在讲姿态解算的理论知识,终于到源码部分了。Ardupilot源码地址:https://github.com/ArduPilot/ardupilot,官网地址:http://ardupilot.org/

1、Ardupilot介绍

    在Pixhawk的历史那节中我们谈到,Pixhawk是硬件平台,PX4是pixhawk的原生固件,专门为pixhawk开发的。APM(Ardupilot Mega)也是硬件,Ardupilot是APM的固件,所以称ArduPilot固件也叫APM。Ardupilot由一群爱好者开发维护的,从最早的APM1,APM2开始,后来软件代码不断状大,原来的APM2的硬件不能胜任最新代码,再后来开发者就把Ardupilot代码转移到了Pixhawk平台上,兼容了Pixhawh硬件平台,所以就导致现在Pixhawk上有两套飞控代码的原因,所以在Pixhawk硬件平台上可以运行PX4固件(原生固件),也可以运行APM固件。Pixhawk是硬件平台,PX4是pixhawk的原生固件,专门为pixhawk开发的。APM(Ardupilot Mega)也是硬件,Ardupilot是APM的固件,所以称ArduPilot固件也叫APM。Ardupilot由一群爱好者开发维护的,从最早的APM1,APM2开始,后来软件代码不断状大,原来的APM2的硬件不能胜任最新代码,再后来开发者就把Ardupilot代码转移到了Pixhawk平台上,兼容了Pixhawh硬件平台,所以就导致现在Pixhawk上有两套飞控代码的原因,所以在Pixhawk硬件平台上可以运行PX4固件(原生固件),也可以运行APM固件。

    由于Ardupilot兼容Pixhawk,因此Ardupilot的HAL层也可以使用pixhawk硬件。Ardupilot是基于Pixhawk原生代码开发的上层应用,如下面的源码框架图所示,Ardupilot把底层的PX4Firmware和NuttX等都抽象为HAL,developer只需要关心上层应用即可,基于Pixhawk原生设计上层控制逻辑。Ardupilot其实是开源的、玩具级飞控,它为了兼容各种乱七八糟的板子、机型,有很多冗余的代码,这些冗余的代码让我们理解飞控本身增加了难度和学习成本。如果我们需要一款专业的飞控,完全可以去掉这些冗余的代码,只保留我们需要的精简过的功能,这样也就能大大降低它代码的复杂程度。也就是说,假如你打算开一家无人机公司,不需要从最底层一行一行的代码写起,可以直接把这套开源的Pixhawk原生代码搞透彻,然后基于它进行上层开发,加入自己NB的算法。

    Ardupilot目前主要是支持的5种设备的目录包括ArduPlane(固定翼)、ArduCopter(直升机/多旋翼)、APMrover2、AntennaTracker、ArduSub。当你从github上将Ardupilot这套源码下载下来以后,你会发现这套源码其实包含不同的上层应用。而其中ArduCopter是针对四旋翼飞行器的。由于是开源项目,为了方便更多不懂底层硬件的人来开发上层应用,所以这个项目将底层的一些东西进行了封装,抽象成了一堆的库,让软件开发人员根据这个库,就能实现上层应用的开发。Ardupilot的源码系统框架图如下:

Ardupilot源码框架

2、库文件介绍

库文件介绍(位于\libraries目录下),libraries包含了所有需要的库函数头文件等。

核心库:

AP_AHRS              -姿态估计的库,使用DCM(方向余弦矩阵)或者EKF(卡尔曼滤波)
AP_Common        -核心库会被其他库所依赖
AP_Math              -各种各样的数学操作的函数,特别是对向量操作比较有用
AC_PID                 -PID控制库
AP_InertialNav     - 惯性导航库,已经将GPS及气压器的数据和加速度计进行了融合
AC_AttitudeControl   -姿态控制库
AP_WPNav             -导航库
AP_Motors            -多旋翼和传统直升机混合的电机库,主要是跟电机输出有关的
RC_Channel           -将从APM_RC接收到的pwm信号转换成内部单元,例如角度
AP_HAL, AP_HAL_AVR, AP_HAL_PX4   - 硬件抽象层,主要将底层硬件进行抽象。使上层应用拥有统一的接口,使其更容易移植到不同的硬件上,其中AP_HAL目录定义了一个通用的接口,特别是hal.rc_out_write()函数将从 AP_Motors 类中接收的具体PWM转化为特定板子pin脚的输出。其他的目录AP_HAL_XXX针对不同硬件平台进行详细的定义。例如AP_HAL_AVR目录对于AVR平台,AP_HAL_PX4对应PX4平台,AP_HAL_Linux对应Linux平台。 

传感器库:

AP_InertialSensor   -读取陀螺仪和加速度的数据,以标准单元(deg/s,m/s)将数据提供给主函数和其他库
AP_RangeFinder      -声呐和红外距离传感器接口库
AP_Baro                   -气压计接口库
AP_GPS                    -GPS接口库
AP_Compass            -三轴磁力计(罗盘)接口库
AP_OpticalFlow       -光流传感器接口库  

其他库:

AP_Mount,AP_Camera, AP_Relay:相机安装控制库,相机快门控制库
AP_Mission: 从eeprom(电可擦只读存储器)存储/读取飞行指令相关库
AP_Buffer:惯性导航时所用到的一个简单的堆栈(FIFO,先进先出)缓冲区
AP_AccelCal、AP_Declination、AP_RCMapper、AP_RPM、AP_RSSI
AP_ADC:Analog to Digital
APM_Control: pitch/roll/yaw controller
DataFlash:flash memory

GCS_Console/GCS_MAVLink:地面站通信、飞行日志

3、主目录文件介绍

多旋翼飞控的所有文件都放在\Ardupilot的目录下。

Copter.h  : 各个头文件的集合,各种飞行模式初始化函数和执行函数的声明,日志和地面站的相关函数声明,自动调参参数的声明。姿态控制中使用到的函数几乎都在该头文件中进行了声明。
Parameters.h :   定义了两个全局参数类,类中包含各种参数的定义
Define.h :   各种宏定义
inertia.h  :   从加速度计读取惯性力
ekf_check.cpp :   检测EKF或惯性导航系统的故障触发飞行的警报并帮助采取对策
esc_calibration.cpp:   检查和执行ESC校准的功能
events.cpp :    当故障安全更改时将调用此事件。
log.cpp :     飞行日志
failsafe.cpp :   失控保护
AP_Arming.cpp : 上电BB声、校准时的BB声、电机解锁BB声
fence.cpp :         地理围栏,阻止无人机飞入禁飞区
GCS_Mavlink.cpp : 地面通信站
motor.cpp :       电机BB响,电机解锁
motor_test.cpp :    MavLink电机测试
mode.cpp :           飞行模式初始化和切换
mode_acro.cpp :     特技
mode_althold.cpp : 定高
mode_auto.cpp :       自动
mode_autotune.cpp : 自动调参
mode_circle.cpp:     绕圈
mode_drift.cpp :    漂移
mode_flip.cpp :    空翻
mode_guided.cpp :  引导
mode_land.cpp :    着陆
mode_poshold.cpp :   定点
mode_rtl.cpp :        返航
mode_sport.cpp :  运动
mode_stabilize.cpp :  自稳

参考:https://blog.csdn.net/qq_21842557/article/details/50815000
          https://blog.csdn.net/qq_21842557/article/details/50844016