驱动ID
PX4使用驱动ID将独立传感器贯穿于整个系统。这些ID存储于配置参数中,用于匹配传感器校正值,以及决定哪些传感器被记录到log中。
传感器的顺序(例如一个是/dev/mag0
,另一个是/dev/mag1
)于优先级是不挂钩的,优先级实际是在发布uORB topic时确定的。
举个例子
有关系统上三个磁力计的示例,使用飞行日志(.px4log)转存变量。三个参数(devtype、adress、bus)对传感器ID进行编码,MAG_PRIME识别哪个磁力计被选为主传感器。每一个MAGx_ID是一个24bit数值,左面手工填零补充。
CAL_MAG0_ID = 73225.0
CAL_MAG1_ID = 66826.0
CAL_MAG2_ID = 263178.0
CAL_MAG_PRIME = 73225.0
大家先不妨对下面的24位ID进行解码。
通过I2C连接的外部HMC5883,总线1,地址0x1E:在log中以IMU.MagX
显示。
# device ID 73225 in 24-bit binary:
00000001 00011110 00001 001
# decodes to:
HMC5883 0x1E bus 1 I2C
通过SPI连接的内部HMC5883,总线1,选择slot5。在log中以IMU1.MagX
显示。
# device ID 66826 in 24-bit binary:
00000001 00000101 00001 010
# decodes to:
HMC5883 dev 5 bus 1 SPI
以及通过SPI总线连接的内部MPU9250磁力计,总线1,从设备选择slot4。在log中以IMU2.MagX
显示。
# device ID 263178 in 24-bit binary:
00000100 00000100 00001 010
#decodes to:
MPU9250 dev 4 bus 1 SPI
设备ID编码
根据此格式,设备ID是一个24位的数字。注意,第一字段是上述解码示例中的最低有效位。
struct DeviceStructure {
enum DeviceBusType bus_type : 3;
uint8_t bus: 5; // which instance of the bus type
uint8_t address; // address on the bus (eg. I2C address)
uint8_t devtype; // device class specific device type
};
这里bus_type
按以下方式解码:
enum DeviceBusType {
DeviceBusType_UNKNOWN = 0,
DeviceBusType_I2C = 1,
DeviceBusType_SPI = 2,
DeviceBusType_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
设备ID解码示例
结合此图,上面的24位ID编码,不言自明。
By Fantasy