(4)库示例概述

简介: (4)库示例概述

前言

自己探索代码的第一步是使用库的示例概述。遵循 arduino 传统,我们为大多数共享库提供了示例概述。一个 ‘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

例如,以下将在 Pixhawk 上构建和安装 AP_GPS 示例概述:

cd $ARDUPILOT_HOME # the top-level of an ArduPilot repository
./waf configure --board=Pixhawk1
./waf build --target examples/GPS_AUTO_test --upload

waf 可以列出它能构建的示例:

1. cd $ARDUPILOT_HOME
2. ./waf list | grep 'examples'

一旦你上传了这个例子,你就可以通过连接到控制台来查看输出。控制台是什么,取决于板子的类型。在 Pixhawk 板上,它是 USB 接口。所以只要用你喜欢的串行程序连接到 USB 设备(波特率并不重要)。

例如,如果你安装了 mavproxy,你可以这样做来连接到 Linux 上的 Pixhawk:

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

使用 --setup 选项可以使 mavproxy 进入原始串行模式,而不是经过处理的 MAVLink 模式。 这就是你对示例概述的需要。

1 在SITL中运行示例

某些示例也可以在 SITL 中运行。例如,运行协议解码器示例:

cd $ARDUPILOT_HOME # the top-level of an ArduPilot repository
./waf configure --board sitl
./waf build --target examples/RCProtocolDecoder

要开始示例,请直接运行它:

./build/sitl/examples/RCProtocolDecoder -M quad -C

2 理解示例概述代码

当你在阅读示例概述代码(例如 GPS_AUTO_test 代码)时,你会注意到一些一开始可能看起来很奇怪的事情:

  • 它声明了一个‘hal’变量作为一个引用;
  • 这段代码很粗糙,没有很好的注释;
  • setup() 和 loop() 函数。

2.1 hal引用

每个使用 AP_HAL 功能的文件都需要声明一个 hal 引用。这样就可以访问 AP_HAL :: HAL 对象,该对象可以访问所有硬件的具体功能,包括将消息打印到控制台,休眠以及与 I2C 和 SPI 总线通信等。

实际的 hal 变量被隐藏在板子具体的 AP_HAL_XXX 库中。每个文件中的引用只是提供了一种方便的方法来获取 hal。

最常用的 hal 函数是:

  • hal.console-> printf() 打印字符串;
  • AP_HAL :: millis()和AP_HAL :: micros() 用于获取启动后的时间;(毫秒和微秒)

hal.scheduler-> delay()和hal.scheduler-> delay_microseconds() 用于休眠一小段时间;

hal.gpio-> pinMode(),hal.gpio-> read() 和 hal.gpio-> write() 用于访问 GPIO 引脚;

  • 通过 hal.i2c 访问 I2C;
  • 通过 hal.spi 访问 SPI;

现在,查看 libraries/AP_HAL 目录,查看 HAL 上可用功能的完整列表。


2.2 setup()和loop()函数

你会注意到,每个示例都有一个 setup() 函数和 loop() 函数。当电路板启动时调用 setup() 函数。实际的调用来自每个板子的 HAL 内部,

所以 main() 函数被隐藏在 HAL 内部,然后在板子具体启动完成后调用 setup()。

setup() 函数只被调用一次,通常是初始化库,并且可能会打印一个“hello”标语以表明它正在启动。

setup() 完成后,loop() 函数被持续调用(由 AP_HAL 中的主代码调用)。示例的主要工作通常在loop() 函数中。

请注意,对于更复杂的电路板,这种 setup()/loop() 布置只是冰山一角。这可能会让人觉得 ArduPilot 是单线程的,但事实上下面还有很多事情要做,在具有线程的主板(例如 Pixhawk 和基于 Linux 的主板)上,实际上会启动许多实时线程。请参阅下面有关理解 ArduPilot 线程的部分。

2.3 AP_HAL_MAIN()宏

你会注意到在每个示例的底部有这样额外的一行:

AP_HAL_MAIN();

这是一个 HAL 宏,产生必要的代码来声明一个 C++ 主函数,以及任何 HAL 的板级初始化代码。你几乎不必担心它的工作原理,但是如果你很好奇,可以在每个 HAL 的 AP_HAL_XXX 目录中查找 #define。它通常在 AP_HAL_XXX_Main.h 中。

2.4 粗略的示例代码

你会注意到,这些示例概述是相当粗糙的,而且注释不清。这是你为代码做出贡献的机会!当你在阅读示例概述并探索其工作原理时,给代码添加一些注释以解释 API,然后提交一个拉取请求(submit a pull request),这样其他人就可以从你的研究中受益。


相关文章
|
7月前
|
自然语言处理 数据可视化 数据挖掘
带你飞上云端,轻松解析数据——gopup库详细解析--包含安装库教程
本文介绍了Python库gopup,它是一个用于轻松爬取互联网数据的工具,简化了数据收集和处理的过程。文章提供了gopup的安装教程,特别强调了安装时需注意setuptools版本,并给出了PyCharm和命令行两种安装方法。gopup库能获取包括指数、百度和谷歌数据等多种类型的数据。文中还展示了如何使用gopup获取微博指数和豆瓣新片榜数据,并通过代码示例呈现数据和图表。此外,文章提醒了使用时的风险和部分接口的失效情况,并提供了库文档链接以供深入学习。gopup库适用于数据可视化和数据分析,是进行文本挖掘和自然语言处理项目的理想工具。
255 0
带你飞上云端,轻松解析数据——gopup库详细解析--包含安装库教程
|
6月前
|
存储 NoSQL MongoDB
深入解析 MongoDB 与 Python:基本语法、实用示例与最佳实践
深入解析 MongoDB 与 Python:基本语法、实用示例与最佳实践
109 0
|
Python
python脚本基础示例
python脚本基础示例
84 1
|
7月前
|
算法 Serverless C++
C++常用头文件概述与示例
C++常用头文件概述与示例
254 0
|
7月前
|
Web App开发 API C#
PuppeteerSharp库在C#中的应用案例
PuppeteerSharp库在C#中的应用案例
|
机器学习/深度学习 算法 Linux
还在当调参侠?推荐这三个超参优化库【含示例代码】
在传统的算法建模过程中,影响算法性能的一个重要环节、也可能是最为耗时和无趣的一项工作就是算法的调参,即超参数优化(Hyper-parameter Optimization,HPO),因此很多算法工程师都会调侃的自称"调参侠"。近期在研究一些AutoML相关的论文和实现,而在AutoML中的一个核心组件就是HPO。借此机会,本文梳理总结Python中三种常见的可实现HPO的库,并提供一个简单的示例。
557 0
还在当调参侠?推荐这三个超参优化库【含示例代码】
|
存储 索引 Python
Python列表概述( 学习笔记 )(上)
列表是存储有序对象的一组容器
Python列表概述( 学习笔记 )(上)
|
存储 数据可视化 应用服务中间件
数据卷使用方法
数据卷使用方法
170 0
|
XML JSON 算法
PolarDB-X 1.0-API参考-1.0(2019版本)-公共参数
本文介绍每个接口都需要使用的请求参数和返回参数。
323 0