Kerloud飞控系列教程(11): PX4飞控开发基础之添加新的传感器驱动程序

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

  1. 驱动程序包含和设置:代码包括必要的PX4特定头文件,并定义了ICM42670P 类,该类管理与ICM42670P传感器的互动。
  2. print_usage函数 :此函数提供了如何从命令行使用驱动程序的信息,列出了可用的命令及其选项。它是驱动程序接口的一部分,帮助用户了解如何操作驱动程序。
  3. instantiate函数 :这是一个用于创建ICM42670P 驱动程序实例的工厂方法。它根据总线配置和提供的命令行参数处理驱动程序的设置。如果初始化失败,它将通过删除实例来清理并返回null。
  4. 主驱动命令(icm42670p_main :此函数作为从命令行调用驱动程序时的入口点。它处理命令行参数,并根据提供的命令(startstopstatus )控制驱动程序:
  • start :初始化并启动驱动程序。
  • stop :停止并清理驱动程序。
  • status :显示驱动程序的当前状态。
  1. 命令行参数处理:解析并应用传递给驱动程序的参数。它特别寻找-R 选项,该选项指定传感器的旋转设置。
  2. BusInstanceIterator :这个实用工具用于遍历符合驱动程序要求的总线实例(如SPI或I2C总线),使驱动程序能够适用于多种硬件配置。

文件ICM42670P.cpp

  1. 类定义与初始化:定义了ICM42670P类,包括构造函数和析构函数,用于初始化和释放资源。
  2. 初始化与重置init() 方法负责初始化SPI通讯并调用Reset() 方法重置传感器。Reset() 方法设置传感器到初始状态。
  3. 数据采集和处理RunImpl() 方法根据传感器的状态执行不同的操作,包括重置、配置、从FIFO读取数据等。该方法还负责处理中断和定时采集数据。
  4. FIFO管理 :包括读取FIFO计数、从FIFO读取数据、重置FIFO等功能。这些功能支持高效地从传感器收集数据。
  5. 配置和校验Configure() 方法用于设置传感器的工作模式和参数。RegisterCheck() 方法用于验证寄存器设置是否正确。
  6. 数据处理:包括处理加速度计和陀螺仪数据的方法,如ProcessAccel()ProcessGyro() ,将原始数据转换成标准格式,并更新到PX4系统。
  7. 温度更新UpdateTemperature() 方法读取并更新传感器的温度数据。
  8. 中断管理:包含配置和禁用数据准备好的中断的方法,如DataReadyInterruptConfigure()DataReadyInterruptDisable()
  9. 辅助功能:包括打印状态、组合字节、设置和清除寄存器位的辅助函数。

总的来说,这段代码是一个完整的传感器驱动程序,负责初始化传感器,配置其参数,周期性地从传感器收集数据,并将这些数据整合到PX4系统中。

回到教程目录Kerloud飞控系列教程(1):目录