技術士(総合技術監理・機械部門)のブログ

技術士がお届けする,技術,工学,技術者倫理などの話題

制御工学の悩み

2021-09-10 18:55:09 | 工学

Pythonによる制御工学を進めようと思っておりましたが

なにせ、素人なので教科書の勉強をお伝えすることが目的でした。

 

を考えていましたが、Pythonのツールとしてお伝えするには演習や例題が少なく、どうしたものかと悩んでいるうちに

時間が経過してしまいました。

読もうと思って買った

 

にしようかなと思い、

非線形のものの対象と何? という素朴な疑問 アフェイン系? 実システムであるの 理論ばっかりは嫌いと思いながら

そういえばそれがよく書いてある つまりノンホロの劣駆動ロボットかあ と思い久々に

 

美多先生のものですが、いまは絶版? アマゾンで検索すると二万四千円!の値段が

美多先生が急逝された時にはビックリいたしましたが、、、小職の恩師の急逝にも衝撃を受けましたが

その話はおいといて

でもノンホロだとPIDなどの単純な制御系ではなくなり、特異点などがあって、面白いかな。。

などと思いつつ、あちこち見て回り、今に至っております。

岡島寛先生が今YouTubeでも解説している(機械学会誌 9月号)

https://www.jsme.or.jp/kaisi/1234-36/

での制御チャンネルを参照

モデル誤差抑制補償器

を使った非線形制御について検討をしてみるとか

 

もう少し物色してみますのでお待ちください。

 

 


pythonで制御系設計(1’’’)精度がどうか?なんかいやな予感

2021-08-15 11:19:35 | 工学

極配置問題の関数について、以下のリンクでもpython control.place

とmatlabの違いについて示されています。

https://github.com/python-control/python-control/issues/117

設計された固有値を見ると

scilab--

--> [Ke]=ppol(Abb',Aab',L)'
 Ke  = 

   14.4   0.6 
   0.     15.7

--> spec(Abb-Ke*Aab)
 ans  =

  -16. + 0.i
  -15. + 0.i

で意図した極配置にはなっています。

ちなみにmatlabの結果で計算すると

--> Kee=Ke+[0 0;0.3 0] :matlabの結果を作成
 Kee  = 

   14.4   0.6 
   0.3    15.7

--> spec(Abb-Kee*Aab)
 ans  =

  -16.
  -15.

と実数での固有値となります。

これらの違いはアルゴリズムの違いとしてしか説明できませんので 上記LINKではcontrol.placeではないものを推奨しています。

では、pythonでもう一度やってみます。

import sys
sys.path.append('/Users/muranokenichi/opt/anaconda3/lib/python3.8/site-packages')
from control.matlab import *
import matplotlib.pyplot as plt
import numpy as np
import scipy as sc
from scipy import linalg

def hermitian(arr):
    return np.conjugate(arr.T)

A=np.array([[0,0,1,0],[0,0,0,1],[-36,36,-0.6,0.6],[18,-18,0.3,-0.3]])
B=np.array([[0],[0],[1],[0]])
J=np.array([-2+2j*np.sqrt(3),-2-2j*np.sqrt(3),-10,-10])
K=acker(A,B,J)
print(K)
Aab=hermitian(np.array([[1,0],[0,1]]))
Abb=hermitian(np.array([[-0.6,0.6],[0.3,-0.3]]))
L=np.array([-15,-16])
Ke=hermitian(place(Abb,Aab,L))
print(Ke)
eigen_val, eigen_vec = np.linalg.eig(Abb-Ke*Aab)
print('eigen control place ',eigen_val)

Keeg=sc.signal.place_poles(Abb,Aab,L)
Kee=hermitian(Keeg.gain_matrix)
print(Kee)
print('eigen scipy',Keeg.computed_poles)
eigen_val, eigen_vec = np.linalg.eig(Abb-Kee*Aab)
print('eigen scipy pole func',eigen_val)

結果は

[[130.44444444 -41.55555556  23.1         15.41851852]]
[[15.4  0.6]
 [ 0.3 14.7]]
eigen control place  [-15.9 -15.1]
[[15.4  0.6]
 [ 0.3 14.7]] ← controlと同じ結果
eigen scipy [-16. -15.]← 固有値が違う
eigen scipy pole func [-16.15574385 -14.84425615]←これも違うありゃー 精度悪い結果 (注:使い方には自信がありません)これはpython信用ならないか!!! ちょっと考えます未熟なのが悪いのか うーん どうしようご指摘あれば教えてください

 

 

 


pythonで制御系設計(1’’)

2021-08-14 13:23:32 | 工学

夏休みの宿題で 「オブザーバゲインを求めるということはどのようなことか」

を真剣にやるべきですが、道具から入ってます(mac mini M1 での動作確認をしているので:言い訳か!

scilab6.1.1(mac mini M1で動作しました!)でふたたびやってみましたが やはりKeは違う結果

-> A=[0,0,1,0;0,0,0,1;-36,36,-0.6,0.6;18,-18,0.3,-0.3]
 A  = 

   0.    0.    1.    0. 
   0.    0.    0.    1. 
  -36.   36.  -0.6   0.6
   18.  -18.   0.3  -0.3

--> B=[0;0;1;0]
 B  = 

   0.
   0.
   1.
   0.

--> [K]=ppol(A,B,J)
 K  = 

   130.44444  -41.555556   23.1   15.418519

--> Aab=[1 0;0 1]
 Aab  = 

   1.   0.
   0.   1.

--> Abb=[-0.6 0.6;0.3 -0.3]
 Abb  = 

  -0.6   0.6
   0.3  -0.3

--> L=[-15 -16]
 L  = 

  -15.  -16.

--> [Ke]=ppol(Abb',Aab',L)'
 Ke  = 

   14.4   0.6 
   0.     15.7

教科書では0.3になる。

---------- 以下 matlab R2021a trial use (古いと新しいのは仕事で使ってますが 個人のものではないのでtrialでやりました)

>> A=[0,0,1,0;0,0,0,1;-36,36,-0.6,0.6;18,-18,0.3,-0.3]

A =

         0         0    1.0000         0
         0         0         0    1.0000
  -36.0000   36.0000   -0.6000    0.6000
   18.0000  -18.0000    0.3000   -0.3000

>> B=[0;0;1;0]

B =

     0
     0
     1
     0

>> J=[-2+2*j*sqrt(3),-2-2*j*sqrt(3),-10,-10]

J =

  -2.0000 + 3.4641i  -2.0000 - 3.4641i -10.0000 + 0.0000i -10.0000 + 0.0000i

>> K=acker(A,B,J)

K =

  130.4444  -41.5556   23.1000   15.4185

>> Aab=[1 0;0 1]

Aab =

     1     0
     0     1

>> Abb=[-0.6 0.6;0.3 -0.3]

Abb =

   -0.6000    0.6000
    0.3000   -0.3000

>> L=[-15 -16]

L =

   -15   -16

>> [Ke]=place(Abb',Aab',L)'

Ke =

   14.4000    0.6000
    0.3000   15.7000

という結果に。明日は きちんとオブザーバの計算を見ます。

 


pythonで制御系設計(1’)

2021-08-13 17:40:28 | 工学

参考書としてあげた制御基礎理論を見ていますが、やはりmatlabが出てくる前の書籍であることもあり

内容的には問題ないのですが、演習としては何か作り出す必要があり、少々躊躇しています。

そんな中、以前のscilabでの演習で、制御のためのmatlabをscilabでやって違いが出たackerあるいはplace

pythonではどうなるのか試してみたいと思い、ちょっと寄り道してみます。

https://blog.goo.ne.jp/murano-brain/e/9bdc04e7690f767bff881ece7dcae593

ーーーーーーーー 以下 python 3.8

import sys
sys.path.append('/Users/***usrname***/opt/anaconda3/lib/python3.8/site-packages')
from control.matlab import *
import matplotlib.pyplot as plt
import numpy as np
from scipy import linalg
def hermitian(arr):
    return np.conjugate(arr.T)

A=[[0,0,1,0],[0,0,0,1],[-36,36,-0.6,0.6],[18,-18,0.3,-0.3]]
B=[[0],[0],[1],[0]]
J=[-2+2j*np.sqrt(3),-2-2j*np.sqrt(3),-10,-10]
K=acker(A,B,J)
K
Aab=hermitian(np.array([[1,0],[0,1]]))
Abb=hermitian(np.array([[-0.6,0.6],[0.3,-0.3]]))
L=np.array([-15,-16])
Ke=hermitian(place(Abb,Aab,L))
Ke

としましたが

matrix([[15.4,  0.6],
        [ 0.3, 14.7]])となってしまい、教科書の答え「14.4 0.6 / 0.3 15.7」 と違うことに。。。何か間違ってますか?夏休みの宿題かなあ

 


次世代制御理論への挑戦SICE VOL60.5 2021

2021-08-11 17:05:34 | 工学
かなり 威勢の良いタイトルで制御技術の変遷から将来の展望を解説しています。
ーーーー 以下は個人の感想です ブログですから ーーーーーーーーー

制御工学はある意味、わかりやすく

古典制御
現代制御
ロバスト制御
ネットワーク制御(ハイブリット制御)
サイバーフィジカルに変遷

と変遷しており、機械工学から見ると理論的な発展は著しく感じる。

じゃあ次世代はどうなるの?
となるが

制御というのは「対象があって ある目的に適合するように 所要の操作を加えること」
という定義であるのだから
対象が工学である以上、大きく変わったのか?
という疑問がある。

大規模になり、複雑になってはいるし、制御コンピュータの性能は飛躍的に早くなっているから
例えば、モデル予測制御なんてものも、時定数が短い機械系でも予測演算は問題なくできてしまうようになっている。

一方、理論的なところでは、どうしても線形理論がメインであり、ニューラルネットなどで非線形を扱ってモデル化し、
それを制御というところには行かない。これは、安定性の保証がないことが一因で、その理論も乏しいように思える。
非線形制御というのは、素人からみても進展していないのではないか?
これは座談会でも話題になっており、学会として ニューロでモデルを作ってみました 制御したらこうなりました
という論文は 何をしたの? ということにしかならないから、活発にならないと言っています。

また、座談会の最後で総括していますが、制御の先生方はダイナミクスをもつ対象に強みをもっているから
と言っています。でもダイナミクスをもつ対象が大規模になって複雑になってきたら、今の制御理論では
検証もできないし、実験もできないと言っている。
どうしたいの?
私見ですが、パラダイムシフトを考えるなら
分解と統合という制御設計手法では今までと変わらないと思います。また、工学では変わらないことで今は良いかもしれません。
物事を分解するという手法から脱却して
大規模なら大規模のまま扱う。
生物のもつ制御系は分解されていますか? ひとつの痛点の刺激でフィードバックしますか?
大量のセンサ入力を学習させ、階層型のハイブリット制御系にて全体を制御するような仕組みが求められるのでは?
生物ではたぶんモデルのダイナミクスは記述できません。ソフトロボティクスで問題となっているテーマですね。
歩行するロボットをイメージすると、
モデルの柔軟性にまかせるところはまかせて、でも学習もして、大脳が判断するところ(視覚や強い刺激)とマイナーフィードバックの
小脳のループと、ローカルには環境への柔軟な追従にまかせる。といったことを考えてほしいです。 
ーーー 以上考えがまとまってませんが 愚痴ですので ーーーーーーーーーーーーーーーーー