コンテンツへスキップ

「pythonによる制御工学入門」を読ませて頂きました。面白かったのでご紹介します。
pythonによる制御工学入門

pythonによる制御工学入門」を読ませて頂きました。面白かったのでご紹介します。

サポートページ =>『Pythonによる制御工学入門』サポートページ

期間:12日間程度(1日2~3時間)

特徴

内容

  • pythonの基礎
  • 制御モデル
    • 伝達関数モデル
    • 状態空間モデル
  • 制御対称のふるまい
    • 時間応答
    • 周波数応答
  • 制御系設計
    • PID制御
    • 2自由度制御
    • ゲインチューニング(限界感度法)
    • ゲインチューニング(モデルマッチング)
    • 状態フィードバック制御(極配置法)
    • 状態フィードバック制御(最適レギュレータ)
  • 安定性
    • 閉ループ
    • 開ループ
  • アドバンスドな制御系設計
    • オブザーバ
    • ロバスト制御

感想

私の事前知識:

古典制御の伝達関数やPID制御は授業で出てきたので何となくイメージ出来ていました(わかるとは言ってない)。現代制御は全くわかりませんでした。

pythonに関してはゆるふわで常用しています。

全体の感想

表題からわかるようにpythonですぐ動かせます。パラメータを弄って理解を深めたり、自分で設計するうえで真似すればに使えるため便利です。

実用や、制御を勉強するための入門として全体を俯瞰する目的で書かれていると思われます。そのため、後半は特にあっさりした説明になっています。

pythonの記法に関しては、(私は読み飛ばしましたがパッと見た感じ)必要な部分は書いてありそうです。pythonを使ったことのない方には多少大変かもしれません。

モジュールはNumpy,Matplotli,Scipy,Sympy,Python-control(, slycotもインストールする必要あり)。 Python-control (リンクは2019/12/25時点で最新バージョンのマニュアルへ)はMATLABっぽく書けるパッケージなので、MATLABを使ったことがある方に良いかもしれません。

モデル

最適レギュレータを下で紹介していますので、状態空間モデルに関して少し書きます。

伝達関数モデルではフィードバック系全体について、出力y(t)、入力u(t)に対してP(t)を

$$\frac{y}{u}=P(t)$$

の形で表します。それに対して状態空間モデルでは、内部の状態を全て観測して、

$$\dot{ \textbf{x}}(t)= \textbf{Ax}(t)+ \textbf{Bu}(t)$$ $$\textbf{y}(t)= \textbf{Cx}(t)+ \textbf{Du}(t)$$

の形で表します。例えば、このようなアームを考えてみます。

アームのモデル

トルクを$$\tau$$

粘性摩擦による力を$$\mu \dot{\theta}$$

重力加速度をgとすると、運動方程式は

$$\tau(t)=J\ddot{\theta}+\mu \dot{\theta}+Mglsin\theta$$

と書けます。入力u(t)、出力y(t)をそれぞれ

$$u(t)=\tau(t)$$

$$y(t)=\theta(t)$$

とし、角度 $\theta$ を十分小さいとして $sin(\theta)$ を

$$sin(y(t))=y(t)$$

と近似すると、

$$u(t)=J\ddot{y}(t)+\mu \dot{y}(t)+Mgly(t)$$

と書けます。これをもとに伝達関数が作れます。

さらに、状態空間モデルでは、

$$\textbf{x}(t)= \begin{bmatrix} \theta & \dot{\theta} \end{bmatrix}^T$$

と置いて

$$\dot{\textbf{x}}(t)= \begin{bmatrix} \dot{\theta} \cr \ddot{\theta} \end{bmatrix} =\begin{bmatrix} 0 & 1\cr -\frac{Mgl}{J} & -\frac{\mu}{J} \end{bmatrix}\textbf{x}(t) + \begin{bmatrix} 0 \cr \frac{1}{J} \end{bmatrix}u(t) $$

$$y(t)=\theta(t)=\begin{bmatrix} 1 & 0 \end{bmatrix} \textbf{x}(t) $$

となります。状態空間モデルの形にまとめると、

$$\dot{ \textbf{x}}(t)= \textbf{Ax}(t)+ \textbf{Bu}(t)$$ $$\textbf{y}(t)= \textbf{Cx}(t)+ \textbf{Du}(t)$$

$$\textbf{A}=\begin{bmatrix} 0 & 1\cr -\frac{Mgl}{J} & -\frac{\mu}{J} \end{bmatrix},\textbf{B}=\begin{bmatrix} 0 \cr \frac{1}{J} \end{bmatrix}, \textbf{C}=\begin{bmatrix} 1 & 0 \end{bmatrix},\textbf{D}=0$$

のように表せます。

ただし、状態空間モデルでは各パラメータが観測出来る必要があります。

序盤はかなりわかりやすく書かれています。古典制御と現代制御の基本的な部分はわかった気がします。

制御系設計

pythonで自分で動かせるという点で最もよかったのが設計の部分でした。教科書のグラフをサラッと見るよりわかった感がありました。

授業で使った教科書ではPID制御の理論をやったあとで、「なんで制御できるのかはわかったけど、kp,ki,kdの具体的な調べ方がわからん」と思ってたので、ゲインチューニングがコードと一緒に書いてあるのはかなり有り難かったです。

MATLABのようにマクローリン展開などが一瞬で出来ます。

(ここでちょっと思ったのが、MATLABのような有料ツールに近いことが無料で出来るのだから計算速度等が落ちているのではということ。実際のところはどうなのかは調べてません。)

個人的ハイライト:最適レギュレータ

p.176~状態空間モデルでのフィードバックゲインFを下のように与えます。

$$u=\textbf{Fx}$$

この F を"いい感じ"(雑)に選ぶ為に使われる手法の1つが最適レギュレータらしいです。

最適レギュレータでは、最適な値を求めるために、評価関数を最小にすることを考えます。

$$\textbf{Q}=\textbf{Q}^T>0,\textbf{R}=\textbf{R}^T>0$$

に対して評価関数

$$J=\int^\infty_0\textbf{x}(t)^T\textbf{Qx}(t)+u^T(t)\textbf{R}u(t)dt$$

を最小化するコントローラは

$$u=\textbf{F}_{opt}\textbf{x}$$

$$\textbf{F}_{opt}=\textbf{R}^{-1}\textbf{B}^T\textbf{P}$$

の形で得られます。ただし、

$$\textbf{P}=\textbf{P}^T>0$$

はリカッチ方程式

$$\textbf{A}^T\textbf{P}+\textbf{A}\textbf{P}+\textbf{P}\textbf{B}\textbf{R}^{-1}\textbf{B}\textbf{P}+\textbf{Q}=0$$

を満たす唯一の正定対象行列です。 なんでこうなるのかは詳しくは書いてませんが今後調べます。 また、Jの最小値は

$$\textbf{x}(0)^T\textbf{Px}(0)$$

です。

python上でMATLABの関数に似たものを使用できるpython_controlというものがあります。これで、一見難しそうな計算が一瞬の内に出来ます!!これはやばい。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline 
from control.matlab import *
# グラフの設定
def plot_set(fig_ax,*args):
    # x軸のラベルを1つ目を引数に
    fig_ax.set_xlabel(args[0])
    # y軸のラベルを2つ目を引数に
    fig_ax.set_ylabel(args[1])
    fig_ax.grid(ls=':')
    if len(args)==3:
        fig_ax.legend(loc=args[2])

A = [[0,1],[-4,-5]]
B = [[0],[1]]
C= np.eye(2)
D = np.zeros([2,1])
P= ss(A,B,C,D)#状態空間モデル
#最適レギュレータによるFの計算
Q = [[100,0],[0,1]]
R=1
X,E,F=care(P.A, P.B, Q, R)#フィードバックゲインF,リカッチ方程式の解X,閉ループ極Eを返す。
F=-F
#状態空間モデルでの応答
Acl = P.A+P.B*F
Pfb = ss(Acl, P.B, P.C, P.D)#状態空間モデル
Td = np.arange(0, 5, 0.01)#時間
Ud = 1*(Td>0)#時間Tdが正の範囲では1,負では0となるステップ信号。
X0 = [-0.3,0.4]#初期値
xst,t=step(Pfb,Td)#ステップ応答
xin,_=initial(Pfb,Td,X0)
x,_,_=lsim(Pfb,Ud,Td,X0)

fig, ax = plt.subplots(1,2,figsize=(6,2.3))
for i in [0,1]:
    ax[i].plot(t,x[:,i])
    ax[i].plot(t,xst[:,i], ls='-')
    ax[i].plot(t,xin[:,i], ls='-.')

plot_set(ax[0],'t','$x_1$')
plot_set(ax[1],'t','$x_2$')
plt.savefig('最適レギュレータによるフィードバック制御.png')
最適レギュレータのステップ応答。
( 青が応答、オレンジがゼロ状態応答、点線がゼロ入力応答。)

最適レギュレータの関数:

現代文明に感動しました。伝達関数モデルでのゲインチューニングの方法もすぐできて衝撃的でした。

次に読みたい

最後に参考文献としておすすめ本が載っているのもポイント高い。

解析力学キャンパス・ゼミ (馬場 敬之 (著), マセマ出版社)を読んだ感想です

解析力学キャンパス・ゼミ 馬場 敬之 (著), マセマ出版社

期間: 15日程度

特徴

単純な例を多く挙げつつきちんと導出や計算過程を書いてくれている

内容

  • 基礎事項
    • 回転行列
    • ラグランジュの運動方程式、ハミルトンの正準方程式を使用した練習問題
  • ラグランジュの運動方程式
    • オイラー角
    • オイラーの方程式
    • 変分原理
    • 仮想仕事とダランベールの原理
  • ハミルトンの正準方程式
    • 位相空間とトラジェクトリー
    • 正準変換
    • リウビルの定理
    • ポアソン括弧
    • 無限小変換

感想

事前知識:

力学の大学院授業を受講して何となく一般化座標のイメージが出来ていた。ラグランジュの運動方程式はわっぱりわかっていなかった。

全体

さすがマセマ。数学的に難しい部分をわかり安く説明していて、自分で導出できる。全体的にわかったような気がする(気がするというのは重要)。

練習問題はほぼなく、導出と例題がほとんど。

他の難しい顔した本を読む前に一回読むといいと思う。

ラグランジュの運動方程式

一般化座標で表記できるため、足が固定されていない移動ロボットの運動を考える上で重要。

ラグランジュの運動方程式:

$$ \frac{d}{dt}(\frac{\partial L}{\partial\dot q_i})-\frac{\partial L}{\partial q_i}= Q_i (i =1,2,..,f)$$

$$L=T-U$$

L:ラグランジアン

Q:非保存力による一般化力

f:自由度

q:一般化座標

一般化座標を用いて記述することで、ニュートンの運動方程式で考えなければならなかった外力や束縛力を無視して記述できる。これは素晴らしい!!

デカルト座標、極座標、球座標で考えた後、座標を一般化する。力学の記憶が定かではなくてもわかるように、自由度やコリオリの力など出てくる専門用語には必ず説明があった。

オイラー角がちょいイメージしにくかったが、他のどの本より丁寧に書いていたと思う。

かなり丁寧かつ簡単に書いている。最適降下線問題やサイクロイド曲線の問題程度までの難易度で、わかりやすい。

ハミルトンの正準方程式

ハミルトンの正準方程式:

$$ \frac{d q_i}{d t}=\frac{\partial H}{\partial p_i} $$ $$ \frac{d p_i}{d t}= - \frac{\partial H}{\partial q_i} $$

$$H=\Sigma ^f_{i=1}p_i \dot q_i - L$$

$$p_i=\frac{\partial L}{\partial \dot q_i} (i =1,2,..,f)$$

H:ハミルトニアン

q_i:一般化座標

p_i:一般化運動量

トラジェクトリー(位相空間内の代表点が描く軌跡みたいなもの)がイメージしにくく、大変だった。

個人的ハイライト

p164~ :単振動のトラジェクトリーは楕円形、という話から E=$h\nu$ ,光量子のエネルギーに触れたところが面白かった。計算量は増えるが、この考えから統計力学や量子力学に発展すると言うのが面白い。

関連

他のいろんな力学の本と合わせて読みたい。

次に読みたい

統計力学キャンパス・ゼミ馬場 敬之 (著) マセマ出版社

解析力学 細谷曉夫著 -やまなみ書房 <=無料で公開してくださっている神様ですありがとうございます!!!!

2

年末なので今年の振り返り&目標再設定記事を書きます。ポエムです。

本記事は「IGGG Advent Calendar 2019」の13日目の記事(ポエム)です。

現在の目標は明らかに限界ですので、年末ですし目標再設定記事を書きます。

今年やった事

  • python boot camp参加=>記事へ
  • 研究(pythonもジュールezdxfを使ってDXFを自動生成するやつを作った。記事にしていない)
  • 研究(上記に関係。KiCADをかなり使い込んだ。)=>記事
  • 振動や力学の本を読んだ。機械学習の勉強を始めた。=>BOOK REPORT
  • At coderに登録した。
  • その他細々とした活動

ブログやプログラミング関係のことはこんなものです。全然やってねぇ。

これまで

週一更新を目標にしてやってきました。

内容に関しては、これまでの方針など=>イノマタの趣味部屋とは。要約すると、ロボットを個人で作るしアプリも作るのが目標、ということを言っています。

一応今まで、ドローンの姿勢制御のような部分を意識して勉強を進めてきました。電気科なので、ロボットを作ろう、というなかでコアにする技術はモータの性能や制御にしようと思っていました。これに関して知識がまだまだなのは明らかです。

それに加えて、最近では力学の勉強をすすめてきました。私の大学の電気科は全然力学をやりません。なので独学で力学、流体、熱、統計は一通りおさえていきたいと考えています。勉強を進めて来まして、解析力学や逆運動学をぼちぼち勉強中。また、ブームに乗っかり、少しづつ機械学習の基本的な部分を勉強中であります。

結果

明らかに多岐にわたりすぎていて無理です。アイアンマンじゃなきゃ無理。

具体的には作業時間不足です。深いところまでできないので、やってみた系、始め方系の記事が多かったです。

勉強は果てしないことがわかりましたし、ロボットは個人で作るものじゃないような気がします。迷走。

ほんとは何がしたいの?

先日アクアマンをみました(おすすめです=>amazon prime video) 。作中では、水中都市アトランティスや広大な海の景色がめちゃくちゃ美しい。空を飛んでいるように泳ぐ姿(ドラゴンボールの武空術に近いです)で思い出しました。

結局私が一番やりたいことは、飛行物体を作って飛び回ることです。そのことを思い出したことで、軌道がずれてきていることはっきりしました。これがなかなか致命的なレベルになってきたことを自覚したので、再設定を公開するべき時だなということになりました。

これから

今後もロボっぽいものを作るのはあきらめません。

解析力学やロボット工学の勉強をしてきて、なんとなく方向性が見えてきました。今後は、

まず、モータ、制御、機械学習をそれぞれ学部生が勉強できる範囲で勉強。加えて4力(材料はあとで?)と、ノンホロノミック系に手を出したい。数学がダメなので時間をかけてちゃんと勉強したいです。

そして、それを使って何か現実的に作れる目標が必要。なので当面の目標機体は水中ロボットを目指して行きたいと思います。あと、磁気浮上装置を作成したいと思っています(大学の研究の内容)。

必要なもの/何をブログにするのか

今後の記事は、主に2種類

  • おすすめの参考書
  • 作ったもの(これまでどおり)

参考書に関して

これまで少しずつ本の紹介記事も書いてきました。これは、勉強に次官を取られて記事をかけず苦し紛れにかいていた側面がありました。一方で、現在独学で勉強している身としては、何を読んだらいいのかわからないという問題がありました。

独学で勉強するなかであってうれしかった情報というのが、例えば力学や制御の簡単な本を読んでいたとき(振動の本)、次は解析力学や~~~がいいですよ、書いてあったことです。検索ワードが分からないうちは手も足も出ませんでした。

加えて、専門書って基本高いじゃないですか(とくに学生には)。それに、amazonレビューでは、この本はわかりにくい、などと書かれていたとして読者がミスマッチだったのか本当に説明が微妙なのかわからないじゃないですか。これの内容はこういうものだ、ということが、現在勉強している学生の目線で分かるのは、読者の皆様にとって有益なのではないでしょうか。

と言うわけで、今後は本のレビューを増やします。

まとめ

毎週の更新は無理です。毎週更新は完全に諦めます。

想定していたよりはるかに深い部分の理論を利用した小型ロボットを作成する方向に注力し、様々な挑戦の様子を記録します。

同じように個人でロボットを作りたいと考えている方が、独学で勉強する指標にできるように専門書のレビューを書き溜めていきたいと思います。加えて、大したことない人間がコツ事勉強を進めている様子が、誰かの勇気になれば嬉しです。

作りたいものを作る、までのステップを書いていきます。先は長そうですが、参考になる部分があればうれしいです。