库示例草图

探索代码的第一步是使用库的示例草图(example sketches)。 遵循arduino传统,我们为大多数库(libraries)提供了示例草图。 “草图(sketches)”只是一个主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示例草图:(上述命令在windows平台下的PX4 Console下不能执行,需要在Linux平台下或者在Windows10下的Ubuntu下)

cd $ARDUPILOT_HOME    # AruPilot库的顶级目录,也就是/ardupilot目录
./waf configure --board=px4-v2

执行结果如下图:

构建examples/INS_generic,并烧录到飞控中:

./waf build --target examples/INS_generic --upload

提示重新插拔USB:

执行成功结果如下图:

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

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

烧录完示例后,您可以通过连接到控制台来查看输出。 控制台取决于电路板的类型。 在PX4板(即PX4v1和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模式。 这就是您所需要的示例草图。

了解示例草图代码

当您正在阅读示例草图代码(如GPS_AUTO_test代码)时,您会注意到一些似乎很奇怪的事情:

  • 它声明一个“hal”引用变量
  • 代码很粗略,注释很随意
  • setup()和loop()函数

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()实现短时间延时
  • halgpio-> pinMode(),hal.gpio-> read()和hal.gpio-> write()用于访问GPIO引脚
  • I2C通过hal.i2c访问
  • SPI通过hal.spi访问

您可以去libraries/AP_HAL路径下,查看HAL可用功能的完整列表。

setup()和loop()函数

您将注意到,每个草图都有一个setup()函数和loop()函数。 板子启动时调用setup()函数。 实际的调用来自每个电路板的HAL,所以main()函数隐藏在HAL中,然后在板子特定启动完成后调用setup()。

setup()函数只调用一次,用来初始化库,您可以打印一个“hello”来显示它运行正常。

在setup()完成之后,loop()函数被连续调用(通过AP_HAL中的主代码)。 草图的主要工作通常在loop()函数中。

请注意,这个setup()/ loop()安排只是更复杂的电路板的冰山一角。 这可能使得ArduPilot看起来像是单线程的,但事实上还有更多的事情发生,而在具有线程(如PX4和Linux的主板)的板上,实际上将会有很多实时线程启动。 请参阅下面了解ArduPilot线程的部分。

AP_HAL_MAIN()宏

你会注意到每个草图底部都有一条这样的一行代码:

AP_HAL_MAIN(); 这是一个HAL宏,它生成必要的代码来声明一个C ++主函数,以及HAL的任何板级初始化代码。 你无需关心它是如何工作的,但如果你想继续深究,你可以在每个HAL的AP_HAL_XXX目录中查找#define。 它通常在AP_HAL_XXX_Main.h中。

粗略示例代码

您将注意到,示例草图非常粗糙,并被严重评论。 这是您为代码做出贡献的机会! 当您阅读示例草图并探索其工作原理时,会向代码中添加一些注释来解释API,然后提交拉取请求,以便其他人可以从您的学习中受益。

results matching ""

    No results matching ""