移植到新的飞行控制器板

本节介绍与直接在 Linux 电路板上运行 ArduPilot 相关的主题。请参见 用于移植到运行 ChibiOS 的板子上的页面.

备注

任何对 ArduPilot 代码的固件定制都必须遵守 GPL3.0+ 开放源代码许可证的条款。ArduPilot 还提醒开发人员和制造商在开发新的(飞行)控制器时遵守相应的商标法和版权法。

../_images/gpl3.png

考虑加入 ArduPilot Discord 聊天室在 HAL-DEV,#Linux 频道下与其他开发者讨论此话题。

步骤 1 - 开始

  • 确定新飞行控制器使用的微处理器。如果该微处理器用于我们已经支持的电路板,例如 Raspberry Pi 使用的 BCM283x 或 BeagleBones 使用的 TI Sitara/OMAP,那么移植应该相对简单。

  • 选择新的板名。

  • 在 libraries/AP_HAL/AP_HAL_Boards.h 中预留一个新的 HAL_BOARD_SUBTYPE_LINUX_$(NEW_BOARD_NAME)。

  • 如果 ArduPilot 将使用 spidev 和 i2cdev 内核模块,请确保已构建这两个模块。

提示

慎重选择板名!请使用 13 个字符或更少的字符作为板名,否则当板名从飞行控制器发送到地面站(如 Mission Planner)时,可能会被截断。

步骤 2 - 工具链配置

在 Tools/ardupilotwaf/boards.py 中:

  • 创建一个新类,并选择适当的工具链,通常是 arm-linux-gnueabihf。有关示例,请参阅 "以 pxfmini(linux) 类为例"。

  • 用新保留的电路板子类型更新 CONFIG_HAL_BOARD_SUBTYPE。

在 Tools/scripts/board_list.py 中:

  • 在 self.boards[] 列表中添加新的板块名称。

第 3 步 - 配置和构建电路板的示例和固件

按照 编写代码 说明,或采取快捷方式阅读 BUILD.md 文件,其中包括执行以下操作:

  • CD ardupilot (或您的 克隆 ArduPilot 至)

  • ./waf 配置 --板 新板

  • ./waf 旋翼飞行器

解决代码库中 "#error "信息突出显示的任何问题,这需要对每块板进行配置。

这也是建立任何相关的 图书馆草图示例.

第 4 步 - 上传并运行示例和固件

如果是本地构建,可执行文件已经加载到目标系统中,可以直接执行。

如果使用 waf 上传(仅限 Linux、MacOSX),请参阅以下配置命令 BUILD.md 来设置 waf 的 -upload 标志。其他用于交叉编译的选项包括 SCP 或 NFS。

参见 启动选项 命令行选项,为 MavLink 配置至少一个端口,并启动 ArduPilot。

步骤 5 - 外围设备功能和驱动程序

许多电路板将使用 I2C、UART 和 SPI 的 Linux 用户空间 API,只需要配置和相关的内核模块。有关引脚复用和设备树配置,请参阅 CPU、BSP 和电路板文档。以下外设往往更为复杂。

SPI 支持

要配置基于 SPI 的设备,需要使用 Linux 用户空间 SPI API,只需要 libraries/AP_HAL_Linux/SPIDevice.cpp 中 SPIDeviceManager::_device[] 中的每板配置(总线 ID、片选 ID、模式、速率)。

支持 GPIO

大多数 ArduPilot Linux 板使用以下两种方法之一访问 GPIO:sysfs 或 mmap。

对于 sysfs:

  • 通过 sysfs 访问 GPIO 已被弃用。

  • 创建新库/AP_HAL_Linux/GPIO_$(NEW_BOARD_NAME).cpp 和 .h,并填写所需的 _$(NEW_BOARD_NAME)_GPIO_MAX 和 pin_table。

对于 libgpiod(Todo):

  • port ardupilot 以支持 libgpiod 后端 pinMode()、read()、write()。

  • 按板配置

对于 mmap():

  • 请参阅 GPIO_BBB.cpp 和 GPIO_RPI.cpp 示例

  • 创建新库/AP_HAL_Linux/GPIO_$(NEW_BOARD_NAME).cpp 和 .h

  • 找到内存文件(/dev/mem 或 /dev/gpiomem)并打开()。

  • 查找文件中 GPIO 内存区域的偏移量。如果使用 /dev/mem,请查阅处理器参考手册或 Linux 设备树文件。对于 /dev/gpiomem,请使用 0。

  • 使用上述偏移量将 GPIO 寄存器 mmap() 到 ArduPilot 中。

  • 使用内存映射 GPIO 寄存器实现 pinMode()、read()、write() 功能。

提示

如果 CPU 的每个组中有多个 GPIO,但只有一个 DATA 或 OUT 寄存器,而没有 SET 和 CLEAR 寄存器,则可能需要避免使用 mmap 后端,因为当内核或其他用户空间程序使用同一组中的 GPIO 时,对 GPIO DATA 寄存器的读-修改-写访问可能无法保证线程安全。

无论采用哪种方法,都需要编辑 libaries/AP_HAL_Linux/GPIO.h,为电路板加入相应的 GPIO_$(NEW_BOARD_NAME) 头文件。

RC 输入

不同的电路板支持多种不同的 RCInput 机制,包括 PPM、SBUS、UART 和 UDP。

PPM 输入按 CPU 处理,通常使用 DMA 或实用微控制器(如 TI 芯片上的 PRU)。

检查 libaries/AP_HAL_Linux/RCInput_* 文件,查看是否存在合适的文件,或者创建一个。

使用 CONFIG_HAL_BOARD_SUBTYPE 在 libraries/AP_HAL_Linux/HAL_Linux_Class.cpp 中配置 rcinDriver。

RCOutput

与 RCInput 类似,检查 libraries/AP_HAL_Linux/RCOutput_* 文件以查看是否存在合适的文件,或创建一个合适的文件。

对于没有相应硬件来生成 RCOutput 信号的 CPU,可以使用额外的硬件,如用于生成 PWM 的 NXP PCA9685。

使用 CONFIG_HAL_BOARD_SUBTYPE 在 libraries/AP_HAL_Linux/HAL_Linux_Class.cpp 中配置 rcoutDriver。

第 7 步 - 调出传感器

在 libraries/AP_HAL/board/linux.h 中添加传感器相关配置。

先从气压计开始,然后是 IMU、指南针,最后是其他传感器。

上传示例和固件,并测试传感器是否正常工作。

第 8 步 - 配置参数、日志和地形存储

在 libraries/AP_HAL/board/linux.h 中配置 HAL_BOARD_LOG_DIRECTORY、HAL_BOARD_TERRAIN_DIRECTORY、HAL_BOARD_STORAGE_DIRECTORY。

下一步工作

如果您已经走到这一步,恭喜您已经将 ArduPilot 移植到了新的电路板上!请联系 ArduPilot Discord 聊天室 来宣布你的成功。