跳至内容

驱动程序开发

PX4 设备驱动程序基于 设备 框架。

创建驱动程序

PX4 几乎只消耗来自以下设备的数据 uORB.常见外设类型的驱动程序必须发布正确的 uORB 信息(例如:陀螺仪、加速度计、压力传感器等)。

创建新驱动程序的最佳方法是以类似的驱动程序为模板(参见 src/drivers).

信息

有关使用特定 I/O 总线和传感器的更多详细信息,请查阅 传感器和执行器总线 节。

信息

发布正确的 uORB 主题是驱动程序的唯一模式。 必须 跟上。

核心架构

PX4 是一种 反应系统 并使用 uORB 发布/订阅传输信息。系统的核心操作不需要或不使用文件句柄。主要使用两个应用程序接口:

  • 发布/订阅系统有文件、网络或共享内存后端,具体取决于 PX4 的运行系统。
  • 全局设备注册表,可用于枚举设备并获取/设置其配置。它可以是一个链接列表,也可以是文件系统的映射。

设备 ID

PX4 使用设备 ID 在整个系统中一致地识别单个传感器。这些 ID 保存在配置参数中,用于匹配传感器校准值,以及确定哪个传感器被记录到哪个日志文件条目中。

传感器的顺序(例如,如果有一个 /dev/mag0 和一个备用 /dev/mag1) 并不决定优先级--优先级被存储为已发布的 uORB 主题的一部分。

解码示例

以系统中的三个磁强计为例,使用飞行日志(.px4log)转储参数。这三个参数编码了传感器 ID 和 MAG_PRIME 标识哪个磁强计被选为主传感器。每个 MAGx_ID 都是 24 位数字,应在左侧填充 0,以便手动解码。

cal_mag0_id = 73225.0
cal_mag1_id = 66826.0
cal_mag2_id = 263178.0
cal_mag_prime = 73225.0

这是通过 I2C 连接的外部 HMC5983,总线 1,地址为 0x1E:日志文件中将显示为 IMU.MagX.

# 设备 ID 73225,24 位二进制:
00000001 00011110 00001 001

# 解码为
HMC5883 0x1E 总线 1 I2C

这是通过 SPI 连接的内部 HMC5983,总线 1,从属选择插槽 5。它在日志文件中将显示为 IMU1.MagX.

# 设备 ID 66826,24 位二进制:
00000001 00000101 00001 010

# 解码为
HMC5883 dev 5 总线 1 SPI

这是通过 SPI 连接的内部 MPU9250 磁强计,总线 1,从属选择插槽 4。它将在日志文件中显示为 IMU2.MagX.

# 设备 ID 263178,24 位二进制:
00000100 00000100 00001 010

#decodes to:
MPU9250 dev 4 总线 1 SPI

设备 ID 编码

根据这种格式,设备 ID 是一个 24 位的数字。请注意,在上面的解码示例中,第一个字段是最小有效位。

C
结构 设备结构 {
  枚举 设备总线类型 bus_type : 3;
  uint8_t 巴士: 5;    // 总线类型的哪个实例
  uint8_t 地址   // 总线上的地址(如 I2C 地址)
  uint8_t devtype;   // 设备类别特定设备类型
};

总线类型 是根据

C
枚举 设备总线类型 {
  设备总线类型_UNKNOWN = 0,
  设备总线类型_I2C     = 1,
  设备总线类型_SPI     = 2,
  设备总线类型_UAVCAN  = 3,
};

devtype 是根据

C
#define DRV_MAG_DEVTYPE_HMC5883  0x01
#define drv_mag_devtype_lsm303d  0x02
#define drv_mag_devtype_accelsim 0x03
#define DRV_MAG_DEVTYPE_MPU9250  0x04
#define drv_acc_devtype_lsm303d  0x11
#define drv_acc_devtype_bma180   0x12
#define DRV_ACC_DEVTYPE_MPU6000  0x13
#define drv_acc_devtype_accelsim 0x14
#define drv_acc_devtype_gyrosim  0x15
#define DRV_ACC_DEVTYPE_MPU9250  0x16
#define DRV_GYR_DEVTYPE_MPU6000  0x21
#define drv_gyr_devtype_l3gd20   0x22
#define drv_gyr_devtype_gyrosim  0x23
#define DRV_GYR_DEVTYPE_MPU9250  0x24
#define drv_rng_devtype_mb12xx   0x31
#define drv_rng_devtype_ll40ls   0x32

调试

有关一般调试主题,请参阅 调试/记录.

冗长日志

默认情况下,驱动程序(和其他模块)输出的日志字符串都是最简短的(例如对于 PX4_DEBUG, PX4_WARN, PX4_ERR等)。

在构建时使用 释放_构建 (默认)、 DEBUG_BUILD (冗长)或 TRACE_BUILD (极其冗长)的宏。

使用 COMPILE_FLAGS 驾驶员 px4_add_module 函数 (CMakeLists.txt).下面的代码片段显示了为单个模块或驱动程序启用 DEBUG_BUILD 级调试所需的更改。

px4_add_module(
	模块 templates__module
	主模块
	COMPILE_FLAGS
		-DDEBUG_BUILD
	SRCS
		module.cpp
	取决于
		模块__uORB
	)

TIP

还可以按文件启用详细日志记录,方法是添加 #define DEBUG_BUILD 在 .cpp 文件的顶部(在任何包含之前)。