🙌

simpleBGCの設定まとめ

2024/12/19に公開

背景

開発においてジンバルの機構を組み込むことがあり、そのときにできるだけスムーズなジンバル制御を実現するために、simpleBGCというジンバルコントローラをよく使います
simpleBGCはardupilotにも対応しており、ブラシレスモーターを使ったジンバルなので、サーボモーターと比べて動きが滑らかで、設定も比較的容易で、とても扱いやすいです
今回はその設定方法について今までやってきたことをまとめてみます

購入

色々なところで購入することはできるが、いつもiFlightから購入してます
エンコーダーなしでも制御することはできますが、エンコーダーがついているほうがより滑らかに制御できる印象です
モーターの選定については、スペックに記載されているトルクを参考にするとよいと思います
GM2804くらいの大きさでGoPro程度のもの、GM4108でコンデジから一眼レフ程度、GM110-8で一眼レフ以上のものくらいのイメージだと思います
実際には重量、慣性モーメント、重心位置に大きく依存するので、最初はワンランク大きいモーターを選んでおくといいと思います
まだ試したことはありませんが、T-motorもsimpleBGCに対応したモーターを出しているそうで、もっとトルクが必要な場合はそっちから選定することもできるかもしれません

制御前セッティング

ドキュメントは、BASECAMのページに載ってあるので、基本的な設定関係の説明は割愛します
セッティングについては様々なものがありますが、水平制御するために最低限必要な設定と、水平制御ができてからオートで行う設定があるので、まずは制御するために最低限必要な設定から説明します

ソフトのインストール

BASECAMのSimpleBGC GUIをインストールします

ファームウェアアップグレードとエンコーダ設定

購入したコントローラーボードのファームウェアを設定します
デフォルトでは、エンコーダーが使えるファームウェアでない場合が多いです
Firmware Upgradeタブで最新バージョンをチェックし、エンコーダーが使えるファームウェアを選択してアップグレードします

適切なCOMポートを選択して接続します
コントローラーが起動するときに、バッテリーから給電してしまうと、モーターを制御しようとするので、最初の設定はUSBから給電した方が良いです

Encodersタブの設定を入れて書き込みをします

Monitoringタブを開き、Receive extended debug infoにチェックを入れてモニタリングします
モーターを手で動かして、ENCODErの出力が変化することを確認します
グラフに表示されなくても、グラフの表示範囲から外れてしまっていることがあるので、数値が変化すれば大丈夫です

IMUのキャリブレーション

センサーのキャリブレーションを行います
エンコーダーのキャリブレーションは後で行います
HardwareタブのCalibrate IMU sensorsをクリックして、キャリブレーションのウィンドウを出します

センサーを上下、左右、前後に傾けてそれぞれの状態でAccelerometerのCALIBRATEを押します
センサーを水平な状態にして、GyroscopeのCALIBRATEを押します
Camera IMUと同様に、Frame IMUについてもキャリブレーションを行います

取り付け

センサーとコントローラーボードには向きがあります

前がy、右がxが基本的な向きです
センサーの向きを変えて設定で変更できるかもしれませんが、やったことがないのでわかりません

センサーを搭載部に設置し、コントローラーボードをフレームに設置します
コントローラーボードにもセンサーが仕込まれていて、フレーム側の角度をみてフィードフォワード制御することができますが、もしその制御をしなくてもいい場合は、コントローラーボードは搭載部側に設置するなど、どこに搭載しても問題ありません

配線

コントローラーボード<->センサー
コントローラーボード<->モーター
コントローラーボード<->エンコーダー
の配線を接続します
モーターが回転しても干渉しないようにケーブルを通します
最初はちゃんと設定できているかわからないので、まずは仮でケーブルを配線してみます
センサーには二か所のコネクタがありますが、どっちを使っても問題ありません
それぞれのモーターの駆動用の3本のケーブルには向きがあります
最初は適当にさしてみて、うまく制御できない場合に反対向きにしてみたりします

モーターの設定

HardwareタブのNUM POLESに、使っているモーターの値を入れます
Invertについては、実際に制御してみないとわからないと思います
AUTOでもできますが、たまにちょっとずれたりします
このNUM POLESの値が実際のモーターと異なると制御することができないです
MOTOR OUTPUTSのところでは、実際に使わないモーターがあれば、disableにします
これをちゃんと設定しないと変な挙動になる場合があります

カメラ、ピッチ、ロールの関係

HardwareタブのMisc hardware settingsのOrder of hardware axesを選択します

RC SettingsのOperation Mode SettingsのOrder of Euler anglesを選択します
詳しくは公式ドキュメントに書かれています

セッティングの確認

IMU以外にもいくつかキャリブレーションをする必要がありますが、基本的にAUTOで行うので、水平制御ができないと先に進めません
なので、最初のセッティングが正しいかどうか確認するために水平制御をしてみます
PCとボードをつないだ状態でバッテリーの電源をつないでも、いきなり制御しようとはしないで、ソフト側でON/OFFを制御できます
搭載部の重心位置をできるだけモーターの軸に合わせて、最初は何も搭載しないできるだけ軽い状態から始めます

エンコーダーの設定を外す

最初からうまく制御できない場合があるので、原因を切り分ける想定でエンコーダーを一旦無効にしておきます

水平制御できるか試す

基本的にStabilizationタブのパラメータはデフォルトの状態でスタートしてみます
モーターONにして挙動を確認してみます

  • 重い感じであればPを上げる
  • 意味がわからない動きになったらPを下げる
  • 中立点で振動する場合はDを上げる
    全く制御ができなさそうであれば
  • HardwareタブのMotor ConfigurationのNumPolesが正しいか確認
  • HardwareタブのMotor ConfigurationのINVERTを変えてみる
  • モーター駆動ケーブルのコネクタの向きを変えてみる
  • センサーの向きとモーターのピッチ、ロールの関係が合っているか確認する


    基本的にはこれらの確認で問題ありませんが、搭載部の負荷が大きい場合は振動が入ってきてしまったりします
    その場合は後述する「モーター振動の抑え方のテクニック」を確認してください
    これ以降については、なんとか水平制御できている前提で進めます

制御後セッティング

水平制御ができるようになったら、各種設定を行います

エンコーダーの設定

エンコーダーなしで制御できたら、エンコーダーありで制御してみます
AS5048(PWM)に切り替えます
Angle to move at calibrationを適切な角度に変更します
エンコーダーのキャリブレーションを行うときに、ここで設定した角度を回転させてキャリブレーションを行うので、可動できる範囲に設定します
El. Field offsetとMotor/encoder gearing ratioを全て0にして書き込みます
モーターをONにして、水平制御をかけます
CALIB EL. FIELDを押すと、モーターが回転して、キャリブレーションが完了すると値が変化するので、もう一度書き込みを押します

次に、モーターONの状態でCALIB. OFFSETを押して、エンコーダーのオフセットを設定します
値が変わったら、もう一度書き込みを押します

白い矢印がエンコーダの出力で、黒い部分が傾斜角センサー
黒と白の矢印がちゃんと動かない場合、エンコーダーのキャリブレーションを行います

HardwareタブのMAGNETIC LINKのところを、モーターONの状態でAUTおをクリック
完了後、書き込み

基本的な設定は以上です

チューニング

無負荷では水平制御はできるけど、搭載部に搭載物を載せるとうまく制御できなかったり、もっと追従性を上げたい、トルクを強くしたい、となることがあります
ここからはPIDのチューニングやフィルターについて説明します

チューニングするパラメータについて

Follow modeをDisabledの状態で水平制御をかけるパラメータを調整します
基本的に変更するパラメータは下記の通り。

  • Stabilization-各PID, Gain mult, OuterP, Low-pass filters, Notch filters
  • Hardware-Motor Power SettingsのPower




    PIDの値については、AUTOチューニングは使わない方が良いです
    Gain multi : 各PIDの値は上限が255になってます。それよりも大きな値にしたい場合、Gain multiを上げることにより、それに比例してPIDの値が変化します。
    例:P=50, I=0.1, D=20, Gain multi = 1の挙動とP=25, I=0.05, D=10, Gain multi = 2の挙動は等しい
    Outer P : モーターを目標値に回転させる速さの比例係数
    Power : モーターに加えられる最大の力。255が最大で、この時バッテリーのフル電圧をかける。上げるときはモーターの温度に注意!
    また、隣のBOOST POWERについては、エンコーダ使用時は無視されます

これらの値を調整し、必ず「書き込み」をクリックして書き込み、モーターのON or OFFを押す。書き込みを押さないと反映されないので注意

各種パラメータの設定については、モーターをONにして水平制御し、指で搭載部を押して角度をつけてから指を離し、水平に戻るまでの加速度計の値をモニタリングしながら調整していきます

振動について

パラメータを調整していると、二種類の振動パターンがあります
中立点を周期的に行ったり来たりするのを振動、中立点で止まるが非周期的にガタガタすることをモーター振動と定義します

PIDチューニング

振動はPを下げてDを上げる
モーター振動はDを下げる
<参考>

基本的にはこの方法で調整できますが、負荷が大きい場合、どうしてもDを上げたいけどモーター振動が入ってきてしまう場合があります

モーター振動の抑え方のテクニック

以下の3つの方法を組み合わせてモーター振動を抑えます

  • D-term LPF cut-off freqを下げる
  • Feedback signal LPF freqをEnableにして下げる
  • Notch filtersを使う

周波数の確認方法

Monitoringのところで、Receive extended debug infoにチェックを入れる。
振動しているときのFREQ_P,Rの値を確認する。
この周波数で振動している(と思われる)
経験的に、何パターンかの振動周期がある。それらを全てフィルタリングするために、例えば100Hzの振動ならば、LPFを100や90に設定するとよい。
また、スポット的に60Hzの振動が発生した場合、ノッチフィルターで設定する。Widthは小さい方が良い。Gainはわからない。が、100でやると収まる。
LPFを20のように低くすると、変な挙動にもなる。

モーター振動の抑え方のイメージ

モーターの振動に入ってくる要因として、Pに起因するものとDに起因するものがあります
高い周波数成分については、Low-pass filterのところで設定できます
Enableにチェックを入れて書き込まないと反応してくれません
経験則的には、Pは100くらい、Dは30くらいまでなら下げられます(ジンバル制御の構成にもよるので一概には言えないが)
このLPFで挙動がおかしくならない程度まで下げた値を設定すれば、高い周波数のモーター振動は抑えることができるが、これ以上LPFを下げられない周波数帯のモーター振動が発生してしまったときにNotch Filterを使うとよい
Notch FilterはP成分にもD成分にも効いていると思います

Followモード

常に水平だけでなく、カメラの向きを変えたいときにFollowモードを使用します
Follow modeタブを開き、一番上のDisabledにすると、常にセンサーを水平にしようとモーターを制御します
下のふたつ(Follow FC, Follow frame)にすると、機体が傾いた時に、それにつられてジンバルを制御します
各パラメータを調整することにより、どれくらい強く速く機体の傾きに追従するかを設定することができます
ジンバルの設定方法について、Disabledにして各パラメータ調整を行い、そのアドバンストとしてFollow modeを設定します

モーターの動作範囲

RC SettingsのOperation Mode Settings
MIN, MAX ANGLE : RCまたはFollowモードの時の動作範囲を入力します
スクリプトも同様にこの範囲の影響を受けます

慣性モーメント

モーターONの状態で、StabilizationタブのMomentum of InertiaのAUTO DETECTをクリック
完了後書き込み

Follow Flight Controller

RollとPitchの値を0より大きくすると、Followを始めます
値が大きい方がFollowの強さが強い印象
このモードだと、Advanced SettingsのHome Position Offsetが反映されません
RC SettingsタブのOperation Mode Settingsの値が反映されます
Speedというのが、追従していく速さ
上げすぎるとうまく制御ができなくなるので注意

Follow PITCH, ROLL

Roll start deg : Pitchがこの範囲を超えるとRollでFollowを始めます
Roll mix deg : Pitchがこの範囲を超えるとゆっくりと追従します
両方0に設定すると、追従性は一番良い
Basic Settings
Dead-band : この範囲内はFollowしない
Expo curve : 0にすると直線になる。直線にすれば、目標値との差と入力値が比例になる。0にすると一番追従性が高い
Apply offset correction… : よくわからない。チェックを外すと挙動が良くなる場合もあれば、外すと良くなる場合もあります


Follow modeのチューニング

Speedを上げると平均値の収束が速くなり、大きくしすぎるとオーバーシュートが発生、発散してしまいます
Dを上げて振動をなくせればよいが、大きくしすぎるとモーター振動が発生してしまうので、必要に応じてフィルタリングします

その他調整方法

  • ピッチやロールを同時に動かしたときにちゃんと制御できない場合
    HardwareのMotor outputで使わないモーターをdisableにしているか確認
  • 起動させたときに傾き、だんだん時間がたつにつれて水平が出る場合
    Gyro sensorをキャリブレーションしなおす
  • 水平を微調整したいとき
    IMU Sensors SettingsのMisalignment angle of rotationを調整

その他設定について

プロファイル

プロファイルとは、コントローラに保存する設定値のこと
一つのコントローラに最大5つのプロファイルを設定可能です
例えば、Profile1には弱い力でコントロールするように設定し、Profile2には強い力でコントロールするように設定をすることが可能です
また、プロポからの信号に応じてProfileを変更することもできます
基本的に設定値を変更したら、保存をしてパソコン内にバックアップとして残しておくとよいです
これを読み込みすることができます

受信機の設定

SimpleBGCには、FutabaのSBUSが使えるようになっています
受信機のSBUSをコントローラーのRC_ROLLに接続
RC_SettingsのRC_ROLL pin modeをFutabaにして、任意のパラメータを選択して、RC_VIRT_CH_●を選択
このチャンネルは送信機側でチャンネルを設定します

コマンドチャンネル

RC SettingsタブのCMDに適当なチャンネルを割り当てます
これにより右下のCommand Channel Assignmentに適当なアクションを割り当てれば、RCを使ってアクションを起こすことができます
プロファイルを変更したり、スクリプトを呼び出したり、色々なことができます

スクリプト

スクリプトを書き込み、実行させることができます
全部で5つのSlotがあり、それぞれにスクリプトを書き込むことができます
Load, Saveでパソコン内に保存することもでき、コントローラに書かれているスクリプトについては、Read, Writeで読み込み、書き込みが行えます
ただし、あまりコマンドがない。。。

Discussion