ArduPilot 第1章 软件架构
本文主要分享ArduPilot的分享也会从系统到模块的架构和原理。
参考文章
https://zhuanlan.zhihu.com/p/646716446?utm_id=0
商用-ArduPilot开源飞控系统之简单介绍_ardupilot飞控
http://www.360doc.com/content/23/0905/03/1676247_1095258442.shtml
Ardupilot代码学习笔记
https://blog.youkuaiyun.com/PENG__WANG/article/details/120182354
一.ArduPilot系统组成
Ardupilot主要组成:
1.Vehicle应用层,
比如
多旋翼(ArduCopter)
固定翼(ArduPlane)
小车(Rover)
2. 库
比如
硬件抽象层(AP_HAL)
传感器驱动(AP_InertialSensor)
传感器融合(AP_NavEKF/2/3)
电机混控输出(AP_Motors)
日志库(AP_Logger)
3. 第三方模块
比如·
RTOS(ChibiOS)
CAN协议层(DroneCAN)
MAVLINK协议层
DDS库(Micro-XRCE-DDS-Client)
构建工具(waf)
地面站软件:Mission Planner/APM Planner 2.0/QGroundControl
4.标准协议:MAVLink/UAVCAN
5.SDK、工具:MAVProxy/DroneKit
6.遥控接收机 + 遥控器
7.外部传感器(GPS/Compass/Lidar etc)
8.维测工具(调试工具,配置工具)
9.视频系统(单独拎出来,其实视频/照片都是摇杆的一部分
二.ArduPilot代码结构
ArduPilot的基本结构分为5个主要部分:
设备代码(AntennaTracker/ArduCopter/ArduPlane/ArduSub/Rover/Blimp)
共享库
硬件抽象层
工具目录
外部支持代码(即mavlink、dronekit)
.(工程目录结构)
├── AntennaTracker
├── ArduCopter
├── ArduPlane
├── ArduSub
├── Rover
├── Blimp
├── libraries
├── modules
└── Tools
注:MAVLink作为一种标准协议,将飞控从系统中独立出来,完成最为基本的飞行控制动作
ArduPilot采用的是将功能模块封装成类,再由具体的应用实例化需要的功能模块类,完成具体的功能。
模块间的数据传递依靠函数传参和类指针完成。这样的方式非常灵活,可以比较方便完成复杂操作。
ArduPilot原本是基于Arduino开发的UAV项目,沿用了Arduino的基本框架,最为直观的是应用的setup()和loop()接口。
setup()完成应用的初始化,loop()是应用循环执行函数。
三.ArduPilot函数
1.调用主函数
\ardupilot\ArduCopter\Copter.cpp
AP_HAL_MAIN_CALLBACKS(&copter);
2.系统main函数
以ChibiOS系统举例,在libraries/AP_HAL/AP_HAL_Main.h 中定义了系统的main函数,这里调用了硬件抽线层的run函数。
#define AP_HAL_MAIN() \
AP_HAL::HAL::FunCallbacks callbacks(setup, loop); \
extern "C" {
\
int AP_MAIN(int argc, char* const argv[]); \
int AP_MAIN(int argc, char* const argv[<