前面都在讲姿态解算的理论知识,终于到源码部分了。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的源码系统框架图如下:
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 memoryGCS_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