DroneのオープンソースであるDronecodeについて理解するために本家のマニュアルを抜粋&翻訳しています。
今回はPX4 Architectural Overviewページの翻訳&抜粋です。
アーキテクチャ概要
- PX4は主にフライトコントロールシステムとミドルウェアの2つのレイヤーからなる。
- PX4はエアフレーム(機体)によらずコードベースは同じ
- リアクティブな作りになっている
- コンポーネント志向
- 非同期なメッセージやり取りでの通信
- 様々なワークロードに対応している
アーキテクチャの全体像
大きく分類して
- Storage
- External Connectivity
- Drivers
- Flight Control
- Message Bus
という構成に分かれている
それぞれのモジュールはuORBというpublish-subscribeのMessage Busを介して通信します。
Flight Stack(フライトコントロールシステム)
- estimator:複数のセンサーからの入力を受け取り、統合し、現在の機体状態を推定します。 - controller(Position Controller/Attidude&Rate Controller):推定された機体状態と、指定の状態とを合わせることを目的とし、機体を目的位置に動かすための姿勢と推力を出力します。 - mixer:「右に移動」といった指示を個々のモーターの動作に変換するモジュールです。機体の構成(モーターの配置、重心、回転慣性)に応じた値を算出します。Middleware
ミドルウェア層は主に組み込みセンサーなどのデバイスドライバーや、コンパニオンコンピュータ・GCS(Ground control system)、メッセージバスのuORBなどからなります。
また、机上シミュレーションのためのモジュールも含まれています。
Update Rates
IMUドライバーのサンプリングレートは1kHzで、250Hzに統合して発信する。他の、navigatorなどのモジュールはもっと低いサンプリングレート、という感じになっている。
メッセージの送信間隔は uorb top
コマンドで調べられます。
Runtime Environment
PX4はPOSIX-APIを持つOS(Linux, macOS, NuttX, QuRT)上で動作し、各モジュールはメモリ空間を共有して動作します。
モジュールの起動方法には2種類あります。
Tasks
個別のスタックとプロセス上で動作させる方式
Work queue tasks
キューイングされたタスクとして順番に実行される方式
- すべてのタスクは相互に割り込むことができないため、協調して動作する必要があります
- 複数のタスクをキューで実行でき、また、複数のキューが存在する場合があります。
- タスクは、実行される時間を指定するか、uORBトピック更新コールバックを介してスケジュール実行されます。
なお、 uorb top
コマンドではWork queue上で実行されているタスクは見えない(work queueプロセス自体が見える)。work queue上で実行されている中身を見たい場合は work_queue status
コマンドを使います。
Background Tasks
上記Taskの中からpx4_task_spawn_cmd()
を実行することで、バックグラウンドのタスクを実行できる
OS-Specific Information
NuttX
NuttXはPX4用OSとして最適な(primaryの良い訳が思いつかない。。)OSです。
モジュールはタスクとして実行される。
Linux/macOS
LinuxまたはmacOS上で動作する場合、PX4は単一のプロセスで実行され、モジュールは個別のスレッドで実行されます。(NuttXのようにタスクとスレッドに違いはありません)
Controller Diagrams
(固定翼や、VTOL(垂直離着陸機)の解説もありますが、省略)
Multicopter Position Controller
(表記には、PX4 notationという表記法を使っています)
- 推定は、EKF2(Extended Kalman Filter)を用いて行う
指定位置と推定位置の差(Δr)を元もとにP(Proportional:比例制御)を行い、速度指定値算出を行う。
その指定速度と、推定速度の差(Δv)を算出し、PID制御で、F(thrust:突き上げ?)の指定値を算出する。
- F(thrust)指定値から射影計算しZ方向への指定値を算出する。
- F(thrust)指定値とattitude(姿勢)の指定値を統合して計算し、新たなattitude(姿勢)の指定値を算出する
という流れ。