1. 1 Ardupilot源码框架
1.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的源码系统框架图如下:
库文件分为五个部分:
- vehicle code:车辆代码,每种车辆类型的顶级目录,有四种车型:
- Plane
- Copter
- APMrover2
- AntennaTracker
- shared libraries 共享库
- hardware abstraction layer(AP_HAL) 硬件抽象层
- tools directories 工具库
- external support code
1.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 | :地面站通信、飞行日志 |
1.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 | : 自稳 |