转自 新浪微博@WalkAnt

基础知识

详细参考:http://dev.ardupilot.com/wiki/learning-the-ardupilot-codebase/

第一部分:介绍

详细参考:http://dev.ardupilot.com/wiki/learning-ardupilot-introduction/

ArduPilot 代码分为5个主要部分,基本结构分类如下:

  • vehicle directories
  • AP_HAL
  • libraries
  • tools directories
  • external support code

1、vehicle directories模型类型

当前共有4种模型:ArduPlane, ArduCopter, APMrover2 and AntennaTracker。都是.pde文件,就是为了兼容arduino平台,以后可能会放弃。

2、AP_HAL硬件抽象层

硬件抽象层,使得在不同硬件平台上的移植变得简单。

其中AP_HAL目录定义了一个通用的接口。其他的目录AP_HAL_XXX针对不同硬件平台进行详细的定义。例如AP_HAL_AVR目录对于AVR平台,AP_HAL_PX4对应PX4平台,AP_HAL_Linux对应Linux平台。

3、tools directories工具目录

主要提供支持。For examples, tools/autotest provides the autotest infrastructure behind theautotest.diydrones.com site and tools/Replay provides our log replay utility.

4、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

5、系统编译

针对不同的硬件板,编译可以采用“make TARGET”的形式。

  • make apm1 – the APM1 board
  • make apm2 – the APM2 board
  • make px4-v1 – the PX4v1
  • make px4-v2 – the Pixhawk

如果要移植到新的硬件,可以在mk/targets.mk文件中添加。

比如: make apm2-octa -j8

或者: make px4-v2 -j8

采用8通道并行编译方式,针对APM、Pixhawk硬件板(AVR、STM32),编译八旋翼代码。

第二部分: 学习sketch例程代码

http://dev.ardupilot.com/wiki/learning-ardupilot-the-example-sketches/

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

例如,下面的编译方法,将在Pixhawk上安装AP_GPS例程sketch。

cd libraries/AP_GPS/examples/GPS_AUTO_test

make px4-clean

make px4-v2

make px4-v2-upload

正确理解sketch例程代码,我们以GPS_AUTO_test.pde代码为例(目录ardupilot\libraries\AP_GPS\examples\GPS_AUTO_test),主要几个特点:

1、 pde文件包含很多 includes;

2、 定义了 hal 引用声明;

3、 代码非常粗糙;

4、 setup() 和 loop()函数

1、include文件

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()。

转载于:https://www.cnblogs.com/pinlyu/p/4632454.html

转载:Pixhawk源码笔记一:APM代码基本结构相关推荐

  1. 转载:Pixhawk源码笔记七:姿态控制预览

    转自:新浪@WalkAnt 第八部分 姿态控制预览 英文参考:http://dev.ardupilot.com/wiki/apmcopter-programming-attitude-control- ...

  2. Ardupilot -- APM源码笔记(重制)~序言

    首先,本篇不会涉及到源码方面的解读跟指导,只是为了后续章节做一些说明,并讲讲写下这些博文的原因 说起无人机的话,应该很多人会想到大疆.亿航这些商业巨头,这样的产业能发展起来也跟无人机代码开源有关.从微 ...

  3. vue如何让一句代码只执行一次_lt;Vue 源码笔记系列4gt;异步更新队列与$nextTick...

    1. 前言 原文发布在语雀: <Vue 源码笔记系列4>异步更新队列与$nextTick · 语雀​www.yuque.com 上一章我们讲到了修改数据是如何触发渲染函数的观察者,最终调用 ...

  4. redis源码笔记 - 刘浩de技术博客 - 博客园

    redis源码笔记 - 刘浩de技术博客 - 博客园 redis源码笔记 - 刘浩de技术博客 - 博客园 redis源码笔记 记录发现的一个hiredis的bug 摘要: hiredis是redis ...

  5. Java基础笔记(2)——HashMap的源码,实现原理,底层结构是怎么样的

    Java基础笔记(2)--HashMap的源码,实现原理,底层结构是怎么样的 HashMap的源码,实现原理,底层结构 1.HashMap: HashMap是基于哈希表的 Map 接口的实现.此实现提 ...

  6. redis源码笔记 - initServer - 刘浩de技术博客 - 博客园

    redis源码笔记 - initServer - 刘浩de技术博客 - 博客园 redis源码笔记 - initServer - 刘浩de技术博客 - 博客园 redis源码笔记 - initServ ...

  7. Py区块链源码笔记 (1)挖矿

    昨晚听大佬小课堂,给我普及一晚上区块链相关各种知识,深深感觉到自己宛如一个智障,我不配说自己是学计算机的啊-- 膜拜之余,转载大佬的文章,像大佬学习! 文章出处:Py区块链源码笔记 (1)挖矿 也欢迎 ...

  8. angularjs源码笔记(3)--injector

    2019独角兽企业重金招聘Python工程师标准>>> 简介 injector是用来做参数自动注入的,例如 function fn ($http, $scope, aService) ...

  9. 手机自动化测试:Appium源码分析之跟踪代码分析四 1

    手机自动化测试:Appium源码分析之跟踪代码分析四 控制器模块 // Appium webserver controller methods // https://github.com/hugs/a ...

最新文章

  1. 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
  2. 如何锻炼自己的抗干扰能力
  3. nlp homework 03
  4. python培训好学吗-python难学吗?为什么上了python培训还是学不会?
  5. Redis在Windows上编译
  6. Tensorflow_yolov3 Intel Realsense D435奇怪的现象,多摄像头连接时一旦能检测到深度马上就会卡(卡住)
  7. Task和async/await详解
  8. 用Log4Net来记录系统的日志信息
  9. Linux进阶之路————组管理与权限管理
  10. [Flink]Flink实时框架介绍
  11. Python代码刷博客访问量
  12. 选择所在城市html按字母,移动端根据字母定位到指定的城市【原创】
  13. Windows Server 2008 R2的教程36篇!
  14. Android Java 颜色代码 对照表
  15. 《白帽子讲web安全》我的安全世界观
  16. WES 7 FBWF灾难性故障
  17. 优化-处理大量定时任务的思路
  18. conda:安装python
  19. [转载]--令人拍案叫绝的Wasserstein GAN
  20. rt1052 usb速率_如何才能赋予RT1052超级视频编解码能力?

热门文章

  1. 学习笔记~~~~~python基础
  2. 分组查询 group by 子句及order by子句
  3. 软件:推荐五款超级好用的电脑小众软件,值得收藏!
  4. 计算机基础:存储系统知识笔记(一)
  5. 提高程序员工作效率的11个技巧
  6. 如何成为一名优秀的程序员?
  7. STM32 串行通信原理
  8. dbus 和 policykit 实例篇(python)
  9. 长语音识别体验_如何为语音体验写作
  10. 得到鹅厂最新前端开发手册一份