Edited at

CleanFlightコードリーディング - その1

More than 3 years have passed since last update.

この記事は、オープンソースのフライトコントローラ Clean Flight の動作原理や実装理解のためにコードリーディングした時の私的なメモ。

ソースコードの場所: https://github.com/cleanflight/cleanflight


mainの流れ

src/main/main.c


  • 初期化(init()の呼び出し)

  • 処理するタスクを有効化

  • イベントループ


    • scheduler()の呼び出し

    • シリアルR/W




scheduler()の流れ

src/main/scheduler.c

イベントループ一回につき一つのタスクが選択され実行される。


  • リアルタイムタスクの実行状態チェック(scheduler()で処理対象ではないタスクが動いているようであれば、タスク実行をスキップする)

  • 動的にプライオリティを計算し実行するタスクを選択する

  • 選択したタスクを実行する


タスク

スケジューリング対象のタスク一覧はsrc/main/mw.c からたどることができる。タスクは、センサーから取得した情報を更新しているものが多い。例えば、taskUpdateAccelerometer()は加速度センサーの値を更新していおり実体は src/main/flight/imu.c にある。

タスクの中でも重要なのが、 taskMainPidLoopChecker()。ここから taskMainPidLoop()が呼び出される。この関数では、センサーから取得したデータとコントローラから受信した制御信号から次にとるべき機体の姿勢を計算してモーターの回転数を更新している。この一連の流れは、PID制御の理論に基づいている。

制御のおおまかな流れは、 こちらの資料が分かりやすい。

こんかいは、とりあえずここまで。