#この記事は
Dronecode本家サイトのDriver Developmentページの抜粋・翻訳です。
Driver Development
PX4のデバイスドライバーはデバイスドライバーフレームワークに基づいています
Creating a Driver
PX4はuORBからのデータを独占的に消費します。一般的なペリフェラルタイプのドライバーは、正しいuORBメッセージをPublishする必要があります。(例えば、ジャイロ、加速度計、気圧計など)
新しいドライバーを作成するための最良のアプローチは、同様のドライバー(src/driversを見てください)をテンプレートとして始めることです。
特定のI/Oバスとセンサーに関する詳細情報は、Sensor and Actuator Busesセクションで参照できます。
Note:
ドライバーが従う必要のある唯一のパターンは、正しいuORBトピックのPublishです。
Core Architecture
PX4はリアクティブなシステムであり、uORBのPub/Subを使用してメッセージを転送します。ファイルハンドルは、システムのコアオペレーションに必要ないか、使用されません。2つのおもなAPIが利用されます。
- Pub/Sub機構。PX4が動作するシステムによって、ファイルやネットワーク、メモリ共有のいずれで実現されるかは変わります。
- グローバルなデバイスレジストリ。これは、デバイスを列挙し、その構成を取得/設定するために使用できます。これは、リンクリストやファイルシステムへのマップと同じくらい簡単です
Device IDs
PX4はシステム上で各センサーを一意に認識するためにデバイスIDを使用します。
このIDは設定パラメータに保存され、センサーの校正値を適用するために利用されます。また、どのセンサーログがどのログファイルにエントリされるかの決定にも利用されます。
(例えば/dev/mag0
の代替に/dev/mag1
がある場合でも)センサーの順番は優先度には影響しません。優先度はuORBのトピック発行の一部として保存されます。
Decoding example
3つの磁力計の例では、フライトログ(.px4log)を使用してパラメーターをダンプします。
3つのパラメーターはセンサーIDをエンコードし、MAG_PRIMEはプライマリセンサーとして選択されている磁力計を識別します。各MAGx_IDは24ビットの数値であり、手動でデコードするには左にゼロを埋め込む必要があります。
CAL_MAG0_ID = 73225.0
CAL_MAG1_ID = 66826.0
CAL_MAG2_ID = 263178.0
CAL_MAG_PRIME = 73225.0
これは、アドレス0x1EのI2C、バス1を介して接続された外部HMC5983です。ログファイルにIMU.MagXとして表示されます。
# device ID 73225 in 24-bit binary:
00000001 00011110 00001 001
# decodes to:
HMC5883 0x1E bus 1 I2C
これは、SPI、バス1、スレーブ選択スロット5を介して接続された内部HMC5983です。これは、IMU1.MagXとしてログファイルに表示されます。
# device ID 66826 in 24-bit binary:
00000001 00000101 00001 010
# decodes to:
HMC5883 dev 5 bus 1 SPI
そしてこれは、SPI、バス1、スレーブ選択スロット4を介して接続された内部MPU9250磁力計です。これは、IMU2.MagXとしてログファイルに表示されます。
# device ID 263178 in 24-bit binary:
00000100 00000100 00001 010
#decodes to:
MPU9250 dev 4 bus 1 SPI
Device ID Encoding
デバイスIDは以下の形式の24ビットの数値です。最初のフィールドは、上記のデコード例の最下位ビットであることに注意してください。
struct DeviceStructure {
enum DeviceBusType bus_type : 3;
uint8_t bus: 5; // バス種別
uint8_t address; // バスのアドレス(例:I2Cのアドレス)
uint8_t devtype; // デバイス種別を示すデバイスクラス
};
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
Debugging
デバッグについての詳細はDebugging/Loggingを参照してください。
Verbose Logging
ドライバーやその他のモジュールは、デフォルトでは冗長性が最小限になるようなログ文字列を出力します。
(例えば、 PX4_DEBUG, PX4_WARN, PX4_ERRなど)
ログの冗長性は、ビルド時にRELEASE_BUILD(デフォルト)、DEBUG_BUILD(詳細)、またはTRACE_BUILD(非常に詳細)マクロを使用して定義されます。
CMakeLists.txtでドライバーpx4_add_module関数のCOMPILE_FLAGSを使用してログレベルを変更します。以下のコード抜粋は、単一のモジュールまたはドライバーに対してDEBUG_BUILDレベルのデバッグを有効にするために必要な変更を示しています。
px4_add_module(
MODULE templates__module
MAIN module
COMPILE_FLAGS
-DDEBUG_BUILD
SRCS
module.cpp
DEPENDS
modules__uORB
)
.cppファイルの最上部(インクルードの前)に#define DEBUG_BUILDを追加することで、ファイルごとに詳細ログを有効にすることもできます。