Ardupilot 源码笔记(1)
来源:互联网 发布:如何找淘宝客推广 编辑:程序博客网 时间:2024/05/16 20:27
一.框架介绍
由于近期做关于无人机的项目,开始接触并研究Ardupilot源码,研究这套源码是一项很庞大的工程,通过查阅资料,做笔记记录下要点,以备复习与交流。
下图是pixhawkd的框架图:
ArduPilot 代码分为 5 个主要部分,基本结构分类如下:
- vehicle directories
- AP_HAL
- libraries
- tools directories
- external support code
以下是对这5个主要部分的简单介绍:
vehicle directories 模型类型
模型目录是为每一个模型类型定义固件的最高级别的目录当前共有 4 种模型:ArduPlane, ArduCopter, APMrover2 ,AntennaTracker。都是.pde文件,为了兼容 arduino 平台 ,伴随着 .cpp 文件,每一个模型目录包含了一个* make.inc 文件,该文件列出了所依赖的库。Makefiles读取该文件并为编译创建-l和-L文件。AP_HAL 硬件抽象层
硬件抽象层,使得在不同硬件平台上的移植变得简单。 其中 AP_HAL 目录定义了一个通用的接口。其他的目录 AP_HAL_XXX 针对不同硬件平台进行详细的定义。例如 AP_HAL_AVR 目录对于 AVR 平台,AP_HAL_PX4 对应 PX4 平台,AP_HAL_Linux 对应 Linux
平台。tools directories 工具目录
主要提供支持。例如,tools/autotest 文件提供了自动检测的基础文件来自于autotest.diydrones.com网站,tools/Replay 提供日志重播的程序。external support code 外部支持代码
对于其他平台,需要外部支持代码。例如 Pixhawk、PX4 的支持代码如下:- PX4NuttX – 板载实时系统。the core NuttX RTOS used on PX4 boards
- PX4Firmware – PX4 固件。the base PX4 middleware and drivers used on PX4 boards
- uavcan – 飞行器 CAN 通信协议。the uavcan CANBUS implementation used in ArduPilot
- mavlink – Mavlink 通信协议。the mavlink protocol and code generator
- 系统编译
Sketch 例程代码
在学习过程中,本人使用source insight 作为看源码的工具。 sketch,是指使用 .pde 文件编写的主程序。 找到以下sketches:
- libraries/AP_GPS/examples/GPS_AUTO_test
- libraries/AP_InertialSensor/examples/INS_generic
- libraries/AP_Compass/examples/AP_Compass_test
- libraries/AP_Baro/examples/BARO_generic
- libraries/AP_AHRS/examples/AHRS_Test
以GPS_AUTO_test.pde代码为例,sketch主要有以下几个主要特点:
1. pde文件包含很多includes,
pde 文件转变为 C++文件后,提供必要的库引用支持;
2. 定义了hal引用声明, 定义如下:
const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER;// pixhawk 等价于 AP_HAL_PX4 该定义,方便访问硬件接口,比如 console 终端、定时器、I2C、SPI 接口等。实际的定义是在 HAL_PX4_Class.cpp 中定义,如下: const HAL_PX4 AP_HAL_PX4; 其中hal 是针对 AP_HAL_PX4 的引用,经常使用的方法如下:
- 终端字符输出。hal.console->printf() and hal.console->printf_P() to print strings (use the _P to use less memory on AVR) - 获取当前运行时间。hal.scheduler->millis() and hal.scheduler->micros() to get the time since boot - 延时。hal.scheduler->delay() and hal.scheduler->delay_microseconds() to sleep for a short time - IO 输入输出。hal.gpio->pinMode(), hal.gpio->read() and hal.gpio->write() for accessing GPIO pins - I2C 操作,hal.i2c - SPI 操作,hal.spi
3. setup()和 loop()
每个 sketch 都有一个 setup()和 loop()函数。板子启动时,setup()被调用。这些调用都来自 HAL 代码中的 main()函数调用(HAL_PX4_Class.cpp 文件 main_loop())。setup()函数只调用一次,用于初始化所有 libraries。
Loop()循环被调用,执行主任务。
4. 、AP_HAL_MAIN()宏
每一个 sketch(.pde 文件)最底部,都有一个“AP_HAL_MAIN();”指令,它是一个 HAL 宏,用于定义一个 C++ main 函数,整个程序的入口。它真正的定义在 AP_HAL_PX4_Main.h 中。
#define AP_HAL_MAIN() extern "C" __EXPORT int SKETCH_MAIN(int argc, char * const argv[]); int SKETCH_MAIN(int argc, char * const argv[]) { hal.init(argc, argv); \ return OK; \ }
作为程序的起点,在 AP_HAL_MAIN()里,就正式调用了 hal.init()初始化代码。 程序的执行过程就是:程序起点 AP_HAL_MAIN() hal.init() hal.main_loop() sketch 中的 setup()和 loop()。
- Ardupilot 源码笔记(1)
- Ardupilot源码UART_test 分析笔记(1)
- APM.ardupilot 源码笔记1
- ArduPilot/APM源码学习笔记(一)
- APM.ardupilot 源码笔记2
- Ardupilot -- APM源码笔记二(重制)~ Ardupilot 链接库引导
- Ardupilot -- APM源码笔记(重制)~序言
- Ardupilot -- APM源码笔记三(重制)~ 传感器驱动程序
- Ardupilot -- APM源码笔记四(重制)~ 线程机制
- Ardupilot -- APM源码笔记一(重制)~ APM源码基本结构
- (5)学习ArduPilot源码——shetch范例
- (1)参与ardupilot项目编程--概述
- ArduPilot源码学习--(一)--MAC下编译ArduPilot源码
- ARDupilot
- (4)学习ardupilot源码——引言和代码架构
- Ardupilot Copter飞控源码框架介绍
- 一个非常好的ardupilot源码解析博客
- Pixhawk之UAV控制理论、ardupilot源码框架介绍
- c++学习笔记(五)——字符串
- jQuery--事件方法
- 欢迎使用CSDN-markdown编辑器
- python 获取指定目录,指定时间下所有更改的文件
- PAT_A 1014. Waiting in Line (30)
- Ardupilot 源码笔记(1)
- 车轱辘通知挪车、车牌识别
- cocos2dx js调用Ojbect c, 回调函数修改jsb.reflection.callStaticMethod
- 交互设计--用户头像的设计以及点击操作习惯
- 什么是野指针?野指针的危害?如何避免野指针?
- Bayes参数估计
- boss 说的cap如何正确理解CAP理论?
- Oracle OCP笔记(33)DBA查看系统常用脚本
- swift Property