Ardupilotドローン制作 ～ホバリングチェックまで～

## まえがき

最近[ドローンエンジニア会議](https://www.dckaga.com/dem2023)なるものが開催され、X(旧Twitter)に会場の様子がポストされていました  
それを見て率直に楽しそう！次またあれば参加したいなと思いました。    
  
同じ方向性の会として、[ドローンエンジニア養成塾](https://www.drone-j.com/engineer_training/)も長く活動されています  
  
どちらもドローンの自動操縦について勉強する会で、主にArdupilotを用いた機体を作成している模様です。  
このArdupilot、[最近各地で開催され話題のドローンショー](https://droneshow.co.jp/)の機体に採用されていたり  
最近活用が進んでいるような空気を感じました  
  
そんなこんなで、もし今後会議や養成塾に参加した時や、単純に面白い機体を作成したくなった時のために、
Ardupilotの機体を作れるようになっておこう！！と思い立ち、作成に取り組みました。本記事はその覚え書きです

## 筆者のスキル(=想定読者スキル)

- いくつかのセンサーを伴ったBetaflightの自作機体を作成できる
- Betaflightの設定が一通りできる。センサーの設定をやったことがある
- ELRSレシーバーのファーム更新とバインドができる

## 一旦機体を作成する

適当に機体を作成します。[Ardupilot対応FC](https://ardupilot.org/copter/docs/common-autopilots.html)を選んで使いましょう

![Ardupilot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3341104/0d67a43f-fb0b-d7f6-0a49-b829073d983d.png)

- 今回は[Flywoo GOKU GN 745 AIO with 40A ESC](https://ardupilot.org/copter/docs/common-flywoo-f745.html)を使用
  - ESCはBlHeri32
  - BMP280気圧センサー内蔵
- 各種パーツ
  - Foxeer M10Q 120 GPS 5883 Compass(GPSとコンパスの複合で現在最軽量パーツ？)
  - BetaFPV ELRS lite Receiver(レシーバー)
  - 適当なモーター・プロペラ・フレーム
  - 適当なVTX・FPVカメラ。VTXの電源はコネクタにした(多分設定作業が長いのでVTXの電源を切りたい)

## PC用設定ソフト

[Mission Planner](https://ardupilot.org/planner/index.html#home)

## ファーム書き込み

- ファームウェアは[ここ](https://firmware.ardupilot.org/Copter/)で配布されている。アップデート時は個別のFC向けのファームウェアファイルを毎度ダウンロードしてくる
- Flywoo GOKU GN 745 AIOを使っているので、対象ファームは`FlywooF745`の名前の物を選んだ
- 初回は、`with_bl.hex`ファイルをbetaflightなどのファームフラッシャーで書き込む
- アップデートは`.apj`ファイルをMission Plannerの`ファームウェアインストール Leg..`の`カスタムファームウェアの選択`より選んで書き込む

## 機体初期設定

基本の流れは[公式サイトマニュアル](https://ardupilot.org/copter/docs/configuring-hardware.html)  
ただ読んでてわかりづらいため、以降に自分が行った作業ステップを記述する

### 必須ハードウェア-フレームタイプ

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `フレームタイプ`のメニューを選択
1. 通常のドローンの構成では4ローターの図を選び、`'X'`のラジオボタンにチェックを行う

### 必須ハードウェア-Accel Calibration

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `Calibrate Accel`ボタンを押す
1. ちょっと待つとボタンの下にメッセージが出てくる
1. メッセージに対応した姿勢にFCを傾け、`Calibrate Accel`ボタンの位置のボタンを再度押す
1. 次のメッセージが出てくるので、再度姿勢を変えてボタンを押す。最後まで繰り返す
1. キャリブレーションが完了する

- 姿勢の説明図は[ここ](https://ardupilot.org/copter/docs/common-accelerometer-calibration.html)を参照

### 必須ハードウェア-Initial Tune Parameter

※`Accel Calibration`を先にやってから実施する

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `Initial Tune Parameter`のメニューを選択
1. 作成した機体に合わせて数値を設定し、`Calculate Initial Parameters`ボタンをクリック
1. 計算された値が出てくるので、`Write to FC`ボタンをクリック

### オプションハードウェア-モーターテスト

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `オプションハードウェア`のメニューを選択
1. `モーターテスト`のメニューを選択
1. モーターABCDのテストボタンを押し、モーターの位置と回転方向を整える

- 正解

|モーター|位置|回転方向|
|----|----|----|
|A|右前|CCW|
|B|右後|CW|
|C|左後|CCW|
|D|左前|CW|

- 位置が合わない場合

モーターのポートの割り当てを変更する(BetaFlightのリソースリマッピング相当)  
`必須ハードウェア-Servo Output`の1から4のFunction、Motor1～Motor4のタブを選んで変更できる

- 回転方向が合わない場合

ESCの設定ソフトで反転を行う。  
  
まずESCのパススルーを有効にする

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`より`SERVO`の項目のツリーを開く
1. `SERVO_BLH_AUTO`の値を`1`にする

次に`BLHeliSuite32`と接続し、モーター回転方向を調整する。  
ESCファームバージョンが合うように注意。

### (参考)モーター位置合わせをフルパラメータ ツリーから行う方法

(※手順が面倒なのでこの方法でやらなくてよい)  
`必須ハードウェア-Servo Output`で調整する以外に、ポート番号を直接書き換える方法もある  
[情報ソース](https://discuss.ardupilot.org/t/my-method-for-iteratively-configuring-motor-ordering-and-direction/67644)  

- ポート割り当て番号の正解

|モーター位置|ポート番号|
|----|----|
|右前|33|
|右後|36|
|左後|34|
|左前|35|

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`より、`SERVOn`(nは数字)の項目のツリーを開き、`SERVOn_FUNCTION`の項目の数値を調整する
1. モーター4つの割り当てはおそらく`SERVO1`,`SERVO2`,`SERVO3`,`SERVO4`にあるはず

### (事前知識)フルパラメータで扱うSERIALの番号について

- 0:USB
- 1～:各UART

### レシーバーの接続

- 予めBetaflightFCのパススルーなどでELRSを更新・プロポとレシーバーのバインドを済ませたレシーバーを使うと楽。  
  
ELRSレシーバーをFCにつなげる  
TX2/RX2にはんだ付けした場合、Mission Plannerでの設定手順は以下  

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く
1. `SERIAL2`の項目のツリーを開き、`SERIAL2_PROTOCOL`の値を`23`にする(レシーバーを付けてFC・レシーバーの電源を入れた場合、自動で設定されているので確認のみで良い。違ったら23が設定されているポートは`2`などにし、レシーバーのシリアルポートに本値`23`を入れる)
1. `SERIAL2`の項目のツリー内、`SERIAL2_BAUD`の値を`115`にする
1. `RC`の項目のツリーを開き、`RC_OPTIONS`の値をクリック。ダイアログが立ち上がり、`Use 420kbaud for ELRS protocol`と`Suppress CRSF mode/rate message for ELRS systems`を選択する(ほかのは選択を解除)
1. `RSSI`の項目のツリーを開き、`RSSI_TYPE`の値を`3`にする

[(参考)](https://www.expresslrs.org/quick-start/ardupilot-setup/)

### フライトモードの選択スイッチの設定

アングル・アクロ・自動航行などの選択スイッチの割り当てを行う  
※レシーバーがバインドされ、Mission Planner上でプロポからの操作がFCで受け付けられていること

1. プロポの電源を入れ、レシーバーの電源をいれバインドされている状態にする
1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `ラジオキャリブレーション`のメニューを選択
1. フライトモード選択スイッチに割り当てたいチャンネル番号を、プロポのボタンを操作して特定する
1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く
1. `FLTMODE_CH`の値を`割り当てたいチャンネル番号`にする
1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `フライトモード`のメニューを選択
1. フライトモード選択スイッチを操作し、操作に応じてプルダウンメニューのフォーカスが移ることを確認する
1. 操作してフォーカスを移すことができるプルダウンより、割り当てたいフライトモードを選択する

### バッテリーフェイルセーフ閾値

バッテリー電圧1次閾値を設定する  
アーム許可閾値、2次閾値は解除する

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `フェイルセーフ`のメニューを選択
1. `電池`セクションの値を使用するバッテリーの電圧・容量に応じて調整する。
1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ リスト`を開く
1. `BAT_ARM_VOLT`の値を`0`にする
1. `BAT_CAPACITY`の値を`使っているバッテリーの容量`にする
1. `BAT_CRT_VOLT`の値を`0`にする

### Armスイッチ設定

アーム/ディスアームはスロットル0+ヨー右5秒/ヨー左2秒でも行えるが、プロポのスイッチに割り当てることもできる

1. プロポの電源を入れ、レシーバーの電源をいれバインドされている状態にする
1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `ラジオキャリブレーション`のメニューを選択
1. アームスイッチに割り当てたいチャンネル番号を、プロポのボタンを操作して特定する
1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く
1. `RCn`(nはアームスイッチに割り当てたいチャンネル番号)のツリーを開き、`RCn_OPTION`の値を`153`にする

[RC_OPTION設定値の詳細](https://ardupilot.org/copter/docs/common-auxiliary-functions.html)

### プロポからの信号調整

スティック操作と逆に機体が動く場合

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く
1．`RCn`(nはスティック操作のチャンネル)の項目のツリーを開き、`RCn_REVERSED`の値を`1`にする

### 必須ハードウェア-コンパス

コンパスのキャリブレーションを行う  
機体を手で持って回転させるため、ノートパソコンなどでやるとよい

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `コンパス`のメニューを選択
1. コンパスモジュールがリストに出現していることを確認
1. Onbord Mag Calibrationメニュー、`Fitness`を`Relaxed`に
1. `Start`ボタンを押下、ダイアログを閉じ、Mag1のゲージを貯める
1. ゲージのため方はAccel Calibrationの6姿勢それぞれで機体を縦を軸に360度回転させる(DJI機のキャリブレーションをイメージする)

## 飛行！

1. 機体にバッテリーをつなげ、地面に置く
1. フライトモードは`Stab`
1. 各種センサーの公正を待つ
1. 準備ができたらアームスイッチを押す
1. アームスイッチを押した5秒後にモーターが回転する
1. テイクオフ！

以上、お疲れ様でした