前の記事で示した、ドローンのPID制御において、制御とプロペラの回転の間に遅延がある場合のモデルを実際に計算してみる。
本稿で不明なところは、以下のページを参考にしてください。
目次:PID制御によるドローンの揺れに関する数値シミュレーション
ついに振動が現れた。
前の記事で示した、ドローンのPID制御において、制御とプロペラの回転の間に遅延がある場合のモデルを実際に計算してみる。
本稿で不明なところは、以下のページを参考にしてください。
目次:PID制御によるドローンの揺れに関する数値シミュレーション
これまでのモデルは、制御が直ちにモーターの回転数に反映することを前提にしていた。ESCの信号に対して機敏に反応するモータであれば、これまでの分析通りに結果が出るはずである。しかし、私の場合は、開発資金の貧しさによって、1個数百円から千円程度の2212型、KV値が920のトルク重視で、プロペラ9インチ用のモータを使っていると、このような機敏さは期待できない。
実際、最近、光反射センサーによるタコメータを自作し、回転中の4つのプロペラ回転数をリアルタイムで把握して送ってくるシステムをつけたところ、ESCの信号に対して、波形で確認される限り200ms程度の遅延が発生していることがわかった。これが、どれほどの問題か、自作ドローンの安定したホバリングの困難性と、どれほどつながっているかを調べることが、このシリーズの分析を始めた動機だった。
つまり、これからが本番なのである(笑)
お決まりで、これまでの議論のページをリストアップしておく。
目次:PID制御によるドローンの揺れに関する数値シミュレーション
この間、今現に作製しているドローンの使用に近づけて、物理的な現象をより再現する形で、PID制御をシミュレーションするという作業をやってきた。それで気づいたことをメモがわりにここに書いておく。
まず何よりも、P制御では、一応揺れが収束はしていくものの、機体の安定を実現するのは困難なレベルだった。とろこが、D制御をしっかり入れると、揺れは、あるいは初期の傾きは一挙に解消して水平を実現してしまう。それは驚くべきほどのレベルでそうなった。
その時のモーター回転に対する、P制御とD制御のレベルをグラフに書かせてみた。最終的には、ほとんど揺れなく水平状態になるのだが、あえてD制御のスケールを少し抑え気味にした時の結果をグラフで示しておこう。
これは、D制御を500というスケールで入れた場合だった。オレンジの線が回転数という単位で見たD制御の調整量の推移である。これに対して、青の線は、同じく回転数で見たP制御のスケールである。回転数で見たとは、そのレベルの回転数の調整がモータに指示されるという意味である。このD制御のレベルを2000まで増加すると、揺れなく、ワンショットで、水平状態を達成してしまう。(ひとつ前の記事を見ればその図を見ることができる)
この状況ですら、P制御だけに比べてみれば、より急速に水平かを実現しているものとなっている。なぜD制御を入れるとそうなるのか。それは、見てもわかるように、調整周期のズレである。P制御は実際の機体の傾きを比例的に反映するが、D制御は、実際の傾きに対して周期が微妙に遅れている。その遅れによって、揺れを打ち消しているのである。
今まで、D制御はパルス的な反応に対して、それをまず打ち消す動きとして現れるというような認識でいた。パルス的な動きが重要だと思っていたのである。しかし、そのようなものは、このシミュレーションの動きの中では現れないし、たとえ現れたとしても姿勢安定化の上で大きな役割を果たさないだろう。
実機の飛行状態のモーターの回転数がログされるようになったので、わかってきたことは、そのようなパルス的なD制御の信号に対して、モータは反応できないということである。だから、D制御は、実機では重要な機能を持たせられないなと思い、P制御だけでなんとかならないかと思うようになっていた。そして、姿勢から周期を推測して、P制御のずれた形での制御信号を与えればなんとかなるのではと思っていたのだが、D 制御はまさにそれをやっていたのである。
sinカーブを微分するとcosカーブになる。つまり、1/4周期、微分は遅れるのである。上の図の揺れの1周期は約1.2秒であり、その1/4は300msである。この遅れこそが素早い収束の動きを実現する決定的要素だと考えられる。
やっぱり信号から回転数へのラグの問題を考えないといけないか。
ドローン姿勢のPID制御のうち、P制御とD制御を行なったシミュレーション結果を示す。これまでの議論については、以下のページを参照してください。
PID制御によるドローンの揺れに関する数値シミュレーション(1):理論編
PID制御によるドローンの揺れに関する数値シミュレーション(2):シミュレーションモデル
以下で解説する、EXCELのシミュレーションファイルは、以下からダウンロードできる。(基本的にEXCELで開いてください。Googleのスプレッドシートなど代替ソフトで開くと、計算とグラフ表示に問題が生じる可能性があります。クリックして、Googleのスプレッドシートが開いてしまった場合は、メニューの「ファイル」から一旦ダウンロードしたのちにExcelで再実行してください)
EXCELファイル(モジュールなし)のダウンロード(2022/01/28修正)
EXCELファイル(モジュール組み込み済み)のダウンロード(2022/01/28修正)
シミュレーションにはRKMETHODという自作の関数をEXCELのVBAで作成し使用している。モージュールなしを選んだ場合は、それがないというエラーが出るので、「ツール」→「マクロ」からVBAのエディタを開いて、「挿入」→「標準モジュール」をクリックして、エディタを開き、次の関数をコピペしてください。そして、PDパラメータなどを更新すると正しく表示されます。
(次から)
Function RKMETHOD(a As Double, b As Double, c As Double, d As Double, e As Double, j As Double, s As Double, omega As Double, theta As Double, k_omega As Double, k_theta As Double) As Double
RKMETHOD = a + b * (theta + k_theta) + c * (theta + k_theta) ^ 2 + d * (omega + k_omega) + e * (theta + k_theta) * (omega + k_omega) + j * (omega + k_omega) ^ 2 + s * Cos(theta + k_theta)
End Function
(以上)
ファイルの使い方を説明する。
ファイルを開くと左側に、パラメーターの設定欄、右側にシミュレーションの実行画面が現れる。パラメータを変更すると自動的にシミュレーション結果も変更される。ただし、計算量が多いので、時間が1、2分かかる場合があるかもしれない。その時はそのまま待つしかない。
開いたEXCELシートの左側のパラメータは、私の自作ドローンの使用に沿ったものが書いてある。薄緑蘭のものは、任意に変更が可能である。薄赤の欄は、自動的に変更されるパラメータである。
パラメータの説明を加える。
| スロットル(回転数:rpm) |
| 回転数を力に変換 |
| 機体質量 Kg |
| 中心とモーター間の距離 m |
| 制御パラメータP |
| 制御パラメータD |
| Δt (時間間隔:秒) |
これまでの記述については、以下のページを参考にしてください。
PID制御によるドローンの揺れに関する数値シミュレーション(1):理論編
PID制御によるドローンの揺れに関する数値シミュレーション(2):シミュレーションモデル
$$mL\frac{d^{2}\theta}{dt^{2}}=F-mg\cos \theta$$
ここで実行するシミュレーションモデルについては、以下の二つの記事で解説している。必要に応じてそちらを参照していただきたい。
PID制御によるドローンの揺れに関する数値シミュレーション(1):理論編
PID制御によるドローンの揺れに関する数値シミュレーション(2):シミュレーションモデル
以下で解説する、EXCELのシミュレーションファイルは、以下からダウンロードできる。(EXCELで開いてください。代替ソフトで開くと、データや式は問題ないと思いますが、グラフが正しく表示されない可能性があります。グラフを書き直せば大丈夫だと思いますが)
EXCELファイルのダウンロード(このファイルのダウンロードを中止しました。D制御も組み込んだより一般的なモデルのEXCELファイルをお使いください。その中で、この記事の結果が再現可能です【D制御パラメータをゼロにする】。以下のリンク先にある、このシリーズの(5)の記事からダウンロードできます。)
ファイルの使い方を説明する。
ファイルを開くと、緑の縦線の左側に設定すべきパラメータの欄があり、「パラメータ」の蘭のDeltaという項目以外を入力する必要がある。Deltaは、そのままにすると、自動的にホバリングレベルのプロペラ回転速度で、上昇力(スラスト)と重力加速度がバランスするように計算される。あえて違う値を入力する場合は、そうしてもよい。どうなるかはご自身で考えていただきたいが、モデルが壊れることはないので、自由にやられたらよいと思う。ここで実行する数値シミュレーションモデルは、次の2階非線型常微分方程式で表される。
それは、次の式で表される。
$$\begin{equation}\frac{d^{2}\theta}{dt^{2}}=\frac{1}{L}\left(\frac{\alpha}{m}-g\cos \theta\right)-\frac{\beta \theta}{mL}+\frac{\gamma}{mL} \theta^{2} \end{equation}\label{eq11}$$
この式がどのように導出されるかについては、以下のページで詳しく説明しているので、参照いただきたい。
PID制御によるドローンの揺れに関する数値シミュレーション(1):理論編
動きを確かめるのは、$\theta$のピッチ角である。
$t$は時間、$L$はドローン中心からモーター位置までの距離、$m$は、ドローンのモーター位置にかかる質量である。$g$は、重力加速度である。また、パラメーター$\alpha, \beta, \gamma$は次のように表される。
$$\begin{eqnarray*}\alpha&=&\delta V_{0}^{2}\\\beta&=&2pV_{0}\delta\\\gamma&=&p^{2}\delta\end{eqnarray*}$$
ここで、$\delta$はモーターの回転数の二乗を力(N)に変換するパラメーターでモーターのパワー水準を表すパラメータである。$V_{0}$は、ホバリング状態を可能にするプロペラ回転数、$p$は、PID制御のうちのP 制御のパラメータである。先のモデル解説でも述べたように、現時点でのモデルでは、P制御のみを組み込み、D(微分)制御は次の課題にしている。(I制御は、モデルの性質上不要と考えている。傾向的傾きを作る潜在要素が見当たらない)
シミュレーションは、常微分方程式に関する4次のルンゲ・クッタ法を用いる。ただし、この常微分方程式は、2階なので、1階の常微分方程式を連立させる方法で行う。そのためにやや複雑になることが避けられない。
$\eqref{eq11}$の係数を$a, b, c, d$にまとめて、見やすくし、次のように表す。
$$\begin{equation}\frac{d^{2}\theta}{dt^{2}}=a-b\cos \theta-c\theta+d\theta^{2}\end{equation}\label{eq12}$$
また、初期値は、$\theta$の初期値$\theta_{0}$と角速度$\frac{d\theta}{dt}=\omega$の初期値$\omega_{0}$が与えられているものとする(シミュレーションでは、妥当な数値を適当に与えればよい)。
この時、上記の二階常微分方程式は、次の連立1階常微分方程式として表される。
$$\begin{eqnarray*}\frac{d\theta}{dt}&=&w\\\frac{d\omega}{dt}&=&a-b\cos \theta-c\theta+d\theta^{2}\end{eqnarray*}$$
この二つの式に、4次のルンゲ・クッタ法を用いる。(4次のルンゲ・クッタ法については、『微分方程式による計算科学入門』三井、小藤、斎藤著、「常微分方程式の数値計算法」山本昌志など、参照)
計算式は、次のような10本の式で表される。以下の、$n: (0,1,2,\cdots)$は時間を表す。
$$\begin{eqnarray*}k_{1}^{\theta}&=&h\omega_{n}\\k_{1}^{\omega}&=&h(\alpha-b\cos(\theta_{n})-c \theta_{n}+d \theta_{n}^{2})\\k_{2}^{\theta}&=&h(\omega_{n}+\frac{k_{1}^{\omega}}{2})\\k_{2}^{\omega}&=&h(a-b\cos(\theta_{n}+\frac{k_{1}^{\theta}}{2})-c( \theta_{n}+\frac{k_{1}^{\theta}}{2})+d (\theta_{n}+\frac{k_{1}^{\theta}}{2})^{2})\\k_{3}^{\theta}&=&h(\omega_{n}+\frac{k_{2}^{\omega}}{2})\\k_{3}^{\omega}&=&h(a-b\cos(\theta_{n}+\frac{k_{2}^{\theta}}{2})-c( \theta_{n}+\frac{k_{2}^{\theta}}{2})+d (\theta_{n}+\frac{k_{2}^{\theta}}{2})^{2})\\k_{4}^{\theta}&=&h(\omega_{n}+k_{3}^{\omega})\\k_{4}^{\omega}&=&h(a-b\cos(\theta_{n}+k_{3}^{\theta})-c( \theta_{n}+k_{3}^{\theta})+d (\theta_{n}+k_{3}^{\theta})^{2})\\\theta_{n+1}&=&\theta_{n}+\frac{1}{6}(k_{1}^{\theta}+2k_{2}^{\theta}+2k_{3}^{\theta}+k_{4}^{\theta})\\\omega_{n+1}&=&\omega_{n}+\frac{1}{6}(k_{1}^{\omega}+2k_{2}^{\omega}+2k_{3}^{\omega}+k_{4}^{\omega})\end{eqnarray*}$$
システムで、dshot信号を作るのをpicoでやらせていた。UARTの使用の関係で、pico1台で、2つのモータに信号を送っていたので、2つのpicoを使っていた。それまでは、pico二信号を送って、あなたはどちらのpicoですかと問い合わせして、その答えを聞いて /dev/t...