驱动程序开发
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 位的数字。请注意,在上面的解码示例中,第一个字段是最小有效位。
结构 设备结构 {
枚举 设备总线类型 bus_type : 3;
uint8_t 巴士: 5; // 总线类型的哪个实例
uint8_t 地址 // 总线上的地址(如 I2C 地址)
uint8_t devtype; // 设备类别特定设备类型
};
总线类型
是根据
枚举 设备总线类型 {
设备总线类型_UNKNOWN = 0,
设备总线类型_I2C = 1,
设备总线类型_SPI = 2,
设备总线类型_UAVCAN = 3,
};
和 devtype
是根据
#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 文件的顶部(在任何包含之前)。