(2)学习ArduPilot源码——shetch范例

(2)学习ArduPilot源码——shetch范例

我的tip:在了解了ArduPilot源码的基本信息和架构后,下面开始实战,下面开始学习第一个范例。

你自己探索这些代码的第一步是使用libraries的例程。根据arduino的传统,我们的大部分libraies都会有范例。范例(“sketch”)是写成cpp文件的主程序。

认识Ardupilot使用的API库和协议是理解代码的前提,因此使用范例是入门的好方法。刚开始你应该阅读、编译和运行下面的库的范例:

·        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

例如,下面命令可以编译和安装AP_GPS范例到Pixhawk上:

cdl ibraries/AP_GPS/examples/GPS_AUTO_test
make px4-clean
make px4-v2
make px4-v2-upload
我的tip(自己实践的经历):首次运行第二个命令时
make px4-clean
可能会出现下面的错误(我在ubuntu14.04上运行出现了下面的错误),提示找不到gawk

这是因为缺少一个虚拟包,在联网的情况下执行下面的安装命令
sudo apt-get install gawk
安装好gawk后,继续执行
make px4-clean
就可以正常编译了,如下图所示,会显示编译进度,编译可能会花挺长一段时间

编译到后面可能会提示一些错误和失败,可以先不用管,继续执行下一步命令
make px4-v2
接下来又是漫长的等待,真的要很久。

经过漫长的等待,最后发现有一些错误提示,这到底怎么解决?这些错误提示会影响到后面的操作吗?到目前的学习为止或许我们还没能力去解决,我们先带着这样的问题继续学习,或许后面积累的东西多了就会柳暗花明又一村。

电脑连接好飞控pixhawk,继续执行命令:

make px4-v2-upload

最后发现又是一堆错误,很正常,编译总会遇到这样那样的错误,根据提示试着解决,要是解决不了,后面继续学习想办法解决。

一旦你上传范例你就可以通过连接控制台查看输出。使用什么样的控制台由硬件板决定。在PX4板(比如PX4v1和pixhawk)就是USB连接器。

比如,如果你安装了mavproxy代理,你可以这样操作,在linux上连接pixhawk:

mavproxy.py--setup--master/dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00

使用--setup选项使mavproxy进入原串行模式,而不是执行MAVlink模式。这就是范例中你需要做的。

理解范例代码

当你阅读范例代码(比如GPS_AUTO_test代码)就会留意到一些奇怪的事情:

l  它声明了一个‘hal’变量作为引用

l  这些代码很粗糙,没有好评

l  setup()函数和loop()函数

hal引用

每个使用AP_HAL特征的文件需要声明一个hal引用。这给了进入AP_HAL的入口,AP_HAL提供了所有硬件特定函数的入口,包括打印消息到控制台,休眠和使用I2C和SPI总线。

真实的hal变量是隐藏在特定的AP_HAL_XXX 库里,在每个文件的引用只是提供了获取hal的便利方法。

最常用的hal函数是:

·        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() andhal.scheduler->delay_microseconds() to sleep for a short time

·        hal.gpio->pinMode(), hal.gpio->read() andhal.gpio->write() for accessing GPIO pins

·        I2C access via hal.i2c

·        SPI access via hal.spi

继续去看一下libraries/AP_HAL目录,了解在HAL上可用的所有函数列表。如下图所示

setup()和loop()函数

你或许会发现每个范例都会有setup()函数和loop()函数。在硬件板启动时就会调用setup函数,真实的调用来自每个板的HAL,因此main()函数是隐藏在HAL里的,硬件板完全启动后,main()函数就会调用setup()。

setup()函数只会调用一次,它初始化libraries,在启动时还可能答应一个“hello”来显示。

在setup()运行完成后,loop()函数接着被调用(被AP_HAL的主代码调用)范例的主要工作通常在loop()函数里进行。

要注意,在复杂的硬件板上,setup()/loop()函数只是冰山一角。这会使得Ardupilot看起来好像是单线程的,但是实际上有很多在底层运行的线程,硬件板(如PX4和基于linux的板)实际上有大量实时线程正在启动,具体请看后面的内容——理解ArduPilot线程。

AP_HAL_MAIN()宏

你会注意到在每个范例的后面会有额外的一行代码:

AP_HAL_MAIN();

这个就是HAL宏,它会根据硬件板为初始化HAL的代码,生成一些必要的代码来声明C++main()函数,你几乎不用担心它是怎样工作的,如果你对此感到好奇,可以查看AP_HAL_XXX目录里每个HAL的关于#define的内容,它通常在AP_HAL_XXX_Main.h.。

粗糙的示例代码

你会注意到范例的代码是相当粗糙的,且缺少注释。这也是你为代码贡献力量的机会!但你阅读过这些示例代码和知道它们怎样工作后,就可以添加注释在代码里,解释APIs然后提交一个推送,这样别人也会从你的学习中受益。

时间: 2024-10-10 07:14:50

(2)学习ArduPilot源码——shetch范例的相关文章

一起学习redis源码

redis的一些介绍,麻烦阅读前面的几篇文章,想对redis的详细实现有所了解,强力推荐<redis设计与实现>(不仅仅从作者那儿学习到redis的实现,还有项目的管理.思想等,作者可能比你我都年轻欧).如果阅读了上面的文档,激起你对redis的强力好奇,那么就只能阅读源码了.不管是在校学生,还是已工作的,redis的代码都值得阅读.我们可以了解如何编写一个工程可用软件,可以学习一些开源常用软件,通过redis丰富的数据结构,可以熟悉大学学习的那点儿数据结构,可以了解如何实现一个自己高效的网络

Struts2+Spring+Ibatis用户注册、登录、管理入门学习实例源码下载

原文:Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 源代码下载地址:http://www.zuidaima.com/share/1550463735532544.htm Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 项目截图: jar包和sql文件都在源码包中. 运行截图: 用户注册页面: 用户管理页面:

Linux学习之源码1:入口流程

有地方看到,启动流程是arch/arm/boot/compressed/head.s ----->调用arch/arm/boot/compressed/misc.c的decompress_kernel()函数解压内核.---->arch/arm/kernel/head-common.S初始化 ---->init/main.c的asmlinkage void __init start_kernel(void) 注意在arch/arm/kernel/smp.c文件中有一个启动多核处理器的函数

WEB前端开发学习:源码canvas 雪

WEB前端开发学习:源码canvas 雪 双旦节要到了,程序员们为了响应气氛,特别用代码制作了动态雪花,WEB前端开发学习的初学者们一起跟着案例做一遍吧! <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body style="overflow: hidden;margin:

一个jeecg整合activiti的学习例子,源码下载

社区成员:刘京华采用技术:jeecg+ activiti源码下载地址:http://pan.baidu.com/s/1dDxOHrV 截图演示:  2.jpg (71.81 KB, 下载次数: 0) 4.jpg (41.98 KB, 下载次数: 0) 5.jpg (64.07 KB, 下载次数: 0) 5.jpg (64.07 KB, 下载次数: 0) 一个jeecg整合activiti的学习例子,源码下载

Linux学习之源码2:start_kernel流程

一.X86的流程可以参考http://www.kerneltravel.net/kernel-book/第十三章%20启动系统/13.5.htm 二.arm的流程,在http://www.cnblogs.com/gangsaleisi/archive/2013/01/09/2851734.html基础上进行分析. 并且是在3.9.7版本上进行分析的,差别不是太大. 1.lockdep_init():lockdep哈希表初始化,lockdep是linux内核的一个调试模块,用来检查内核互斥机制尤其

Android FM模块学习之四源码解析(二)

上一章我们了解了FM主activity:FMRadio.java,若没查看的,请打开链接Android FM模块学习之四源码解析(一) 查看fmradio.java源码注释.接下来我们来看看FM重要的一个类:FMRadioService.java 由上一章我们已经知道,打开FM时,在OnStart函数中会bindToService来开启服务, public boolean bindToService(Context context, ServiceConnection callback) { L

OGRE学习之源码编译

1.下载源码地址:http://www.ogre3d.org/download/source :OGRE1.8.1 for windows 2.下载dependcy:http://www.ogre3d.org/download/source :Old Microsoft VC++ Precomplied dependency pakages 3.下载CMake:http://www.cmake.org/cmake/resources/software.html 4.先用VS2010编译depen

Linux学习之源码包安装与脚本安装(十八)

Linux学习之源码包安装与脚本安装 目录 源码包与RPM包的区别 源码包安装 脚本安装 源码包与RPM包的区别 1.区别 安装之前的区别:概念上的区别 安装之后的区别:安装位置不同 源码包: 开源的 安装更慢,更容易报错 安装更自由 安装完后效率更高 RPM包: 经过编译,能看到源代码 安装更快,报错容易解决 2.RPM包安装位置与源码包安装位置 RPM包安装位置: 源码包安装位置: 安装在指定位置当中,一般是/usr/local/软件名/  3.安装位置不同带来的影响 RPM包安装的服务可以