PX4飞控开发基础:添加新的传感器驱动程序
Part 1. 基本流程
将传感器驱动程序添加到PX4软件堆栈涉及几个步骤,并且需要了解PX4架构以及C++编程。PX4固件以模块化方式构建,使得可以轻松集成额外的传感器。
了解PX4驱动程序框架:
首先,熟悉PX4驱动程序框架。PX4使用设备驱动程序框架,使得编写和集成新的传感器驱动程序更加容易。研究现有的驱动程序和uORB消息系统,以了解数据在系统中的流动方式。
创建您的传感器驱动程序:
- 设置:在
src/drivers/
下创建一个新的驱动程序目录,并在其中包括您的驱动源文件。 - 初始化:实现初始化逻辑,包括设置I2C/SPI接口、检查传感器ID和设置默认传感器配置。
- 读取数据:实现从传感器读取数据的逻辑。这通常涉及通过I2C/SPI从传感器寄存器读取。
- 数据转换:将原始传感器数据转换为有意义的物理单位(例如,米,度)。
实现传感器接口:
这一点至关重要,因为它定义了您的传感器如何与PX4生态系统互动:
- uORB主题 :如果它们还不存在,为您的传感器数据定义uORB主题。uORB是PX4的进程间通信(IPC)系统。
- 发布数据:修改您的驱动程序以将传感器数据发布到适当的uORB主题。这通常涉及创建一个uORB发布句柄并使用它来发布数据。
- 与传感器模块集成:确保您的传感器数据正确集成到PX4中相应的传感器模块(例如,陀螺仪,加速度计,磁力计)中。这可能涉及修改传感器模块以识别和使用您的新传感器的数据。
配置文件:
- RC脚本 :修改启动脚本(位于
ROMFS/px4fmu_common/init.d-posix/rc.sensors
目录中),以便在启动时自动启动您的驱动程序。 - 参数文件:如果您的传感器需要可配置的参数,请将它们添加到系统的参数列表中。
测试和验证:
- 通信测试:进行Bench Test以验证您的传感器是否正确初始化并能与PX4通信。
- 数据验证:验证发布到uORB主题的数据是否正确且单位符合预期。
- 飞行测试:在受控环境中进行飞行测试,以确保传感器在实际飞行条件下表现如预期。
额外提示:
- 检查现有驱动程序以获取参考;它们可以提供一个好的起点和最佳实践。
- 使用PX4飞控的工程debug排查方法(https://discourse.cloudkernel.cn/t/topic/114)
- 使用诸如
listener
之类的调试工具在uORB主题上调试数据流。 - 咨询PX4开发者指南并与PX4社区沟通以获得帮助和更详细的指导。
请记住,实现传感器驱动程序需要对硬件(传感器)和软件(PX4)都有很好的理解。花时间彻底了解这两者。
Part 2. 代码讲解
以Kerloud mini中icm42670P imu驱动为例
文件icm42670p_main.cpp
- 驱动程序包含和设置:代码包括必要的PX4特定头文件,并定义了
ICM42670P
类,该类管理与ICM42670P传感器的互动。 - print_usage函数 :此函数提供了如何从命令行使用驱动程序的信息,列出了可用的命令及其选项。它是驱动程序接口的一部分,帮助用户了解如何操作驱动程序。
- instantiate函数 :这是一个用于创建
ICM42670P
驱动程序实例的工厂方法。它根据总线配置和提供的命令行参数处理驱动程序的设置。如果初始化失败,它将通过删除实例来清理并返回null。 - 主驱动命令(
icm42670p_main
):此函数作为从命令行调用驱动程序时的入口点。它处理命令行参数,并根据提供的命令(start
、stop
、status
)控制驱动程序:
- start :初始化并启动驱动程序。
- stop :停止并清理驱动程序。
- status :显示驱动程序的当前状态。
- 命令行参数处理:解析并应用传递给驱动程序的参数。它特别寻找
-R
选项,该选项指定传感器的旋转设置。 - BusInstanceIterator :这个实用工具用于遍历符合驱动程序要求的总线实例(如SPI或I2C总线),使驱动程序能够适用于多种硬件配置。
文件ICM42670P.cpp
- 类定义与初始化:定义了ICM42670P类,包括构造函数和析构函数,用于初始化和释放资源。
- 初始化与重置:
init()
方法负责初始化SPI通讯并调用Reset()
方法重置传感器。Reset()
方法设置传感器到初始状态。 - 数据采集和处理:
RunImpl()
方法根据传感器的状态执行不同的操作,包括重置、配置、从FIFO读取数据等。该方法还负责处理中断和定时采集数据。 - FIFO管理 :包括读取FIFO计数、从FIFO读取数据、重置FIFO等功能。这些功能支持高效地从传感器收集数据。
- 配置和校验:
Configure()
方法用于设置传感器的工作模式和参数。RegisterCheck()
方法用于验证寄存器设置是否正确。 - 数据处理:包括处理加速度计和陀螺仪数据的方法,如
ProcessAccel()
和ProcessGyro()
,将原始数据转换成标准格式,并更新到PX4系统。 - 温度更新:
UpdateTemperature()
方法读取并更新传感器的温度数据。 - 中断管理:包含配置和禁用数据准备好的中断的方法,如
DataReadyInterruptConfigure()
和DataReadyInterruptDisable()
。 - 辅助功能:包括打印状态、组合字节、设置和清除寄存器位的辅助函数。
总的来说,这段代码是一个完整的传感器驱动程序,负责初始化传感器,配置其参数,周期性地从传感器收集数据,并将这些数据整合到PX4系统中。
回到教程目录:Kerloud飞控系列教程(1):目录