サイトマップ

はじめての現代制御理論 講義13 サーボ系の設計

講義13 サーボ系の設計

これまでだと、0に収束させることしかできない
構成を追加することで、外乱や、目標値のプロファイル駆動に適用させる

サーボ系の構成

外乱  d(t) 、目標値  r(t) が加わる場合、
目標値  r(t) と 観測値  y(t) との差  e(t) = r(t) - y(t) を積算して制御に加える

状態変数線図は下図になる

b
b
A
A
c
c
u(t)
u(t)
+
+
+
+
x'(t)
x'(...
x(t)
x(t)
y(t)
y(t)
f
f
-
-
g
g
+
+
r(t)
r(t)
+
+
-
-
z'(t)
z'(...
z(t)
z(t)
Viewer does not support full SVG 1.1

このシステムの表現は下記になる

 \displaystyle
\begin{aligned}
\dot{x}(t) &= A x(t) + b u(t) + b d(t) \\
y(t) &= c x(t) \\
u(t) &= - f x(t) + g z(t) \\
\dot{z}(t) &= e(t) = r(t) - y(t) = r(t) - c x(t)
\end{aligned}

ここで、 x(t) \rightarrow [ x(t) \quad z(t) ] の拡大系を考えると

 \displaystyle
\frac{d}{dt}
\begin{bmatrix}
    x(t) \\
    z(t)
\end{bmatrix}
=
\begin{bmatrix}
    A - b f   &  b g  \\
    -c  &  0
\end{bmatrix}
\begin{bmatrix}
    x(t) \\
    z(t)
\end{bmatrix}
+
\begin{bmatrix}
    b d(t) \\
    r(t)
\end{bmatrix}

となる

このシステムの固有値がすべて負であれば、 y(t) \rightarrow r(t) に収束することができる

Pythonによる数値シミュレーション

2x2の以下のシステムでのサーボ構成を考える

以下のシステムで考える

 \displaystyle
\begin{aligned}
\frac{d}{dt}
\begin{bmatrix}
  x_1 (t) \\
  x_2 (t)
\end{bmatrix}
&=
\begin{bmatrix}
  0   &  1  \\
  -6  &  -5
\end{bmatrix}
\begin{bmatrix}
  x_1 (t) \\
  x_2 (t)
\end{bmatrix}
-
\begin{bmatrix}
  0 \\
  1
\end{bmatrix}
u(t) \\

x(0)
&=
\begin{bmatrix}
  -1 \\
  0
\end{bmatrix}
\end{aligned}

また、外乱は  d(t) = -1 (t > 0) 、目標値は  r(t) = 1 (t > 0) とする

この場合、拡大系は、

 \displaystyle
\begin{aligned}
\frac{d}{dt}
\begin{bmatrix}
  x_1 (t) \\
  x_2 (t)  \\
  z(t)
\end{bmatrix}
&=
\begin{bmatrix}
  0   &  1   & 0 \\
  -6  &  -5 & 0 \\
  -1  &  0  & 0
\end{bmatrix}
\begin{bmatrix}
  x_1 (t) \\
  x_2 (t)  \\
  z(t)
\end{bmatrix}
-
\begin{bmatrix}
  0 \\
  1 \\
  0
\end{bmatrix}
\begin{bmatrix}
  f_1 &  f_2 &  -g
\end{bmatrix}
\begin{bmatrix}
  x_1 (t) \\
  x_2 (t)  \\
  z(t)
\end{bmatrix} \\

\begin{bmatrix}
  x_1 (0) \\
  x_2 (0) \\
  z(0)
\end{bmatrix}
&=
\begin{bmatrix}
  -1 \\
  0  \\
  0
\end{bmatrix}
\end{aligned}

例13.3 閉ループの極を  -3 の3重根とする

フィードバックゲインは  \lbrace f_1, f_2, g  \rbrace = \lbrace 21, 4, 27  \rbrace

t = [0.0]
x1_arr = [-1.0]
x2_arr = [ 0.0]
z_arr = [ 0.0]

dt = 0.001
for i in range(10000):
    x1_arr += [x1_arr[-1] + (0  * x1_arr[-1] + 1  * x2_arr[-1] + 0 * z_arr[-1] - 0.0 * (21 * x1_arr[-1] + 4 * x2_arr[-1] - 27 * z_arr[-1]) + 0.0) * dt]
    x2_arr += [x2_arr[-1] + (-6 * x1_arr[-1] - 5  * x2_arr[-1] + 0 * z_arr[-1] - 1.0 * (21 * x1_arr[-1] + 4 * x2_arr[-1] - 27 * z_arr[-1]) - 1.0) * dt]
    z_arr  += [z_arr[-1]  + (-1 * x1_arr[-1] + 0  * x2_arr[-1] + 0 * z_arr[-1] - 0.0 * (21 * x1_arr[-1] + 4 * x2_arr[-1] - 27 * z_arr[-1]) + 1.0) * dt]
    t      += [t[-1] + dt]
    y = 1.0 * x1_arr[-1] + 0.0 * x2_arr[-1] + 0.0 * z_arr[-1]
fig = plt.figure(figsize=(5, 4))
ax1 = fig.add_subplot(1, 1, 1)

ax1.plot(t, x1_arr, '-',  label='$x_1$')
ax1.plot(t, x2_arr, '--', label='$x_2$')
ax1.grid()
ax1.legend()
ax1.set_xlim(0, 5)
ax1.set_ylim(-1.2, 3.2)

fig.tight_layout()

目標値に収束できている

例13 演習問題2 .3 閉ループの極を  -3, -3 \pm j2 とする

フィードバックゲインは  \lbrace f_1, f_2, g  \rbrace = \lbrace 25, 4, 39  \rbrace

t = [0.0]
x1_arr = [-1.0]
x2_arr = [ 0.0]
z_arr = [ 0.0]

dt = 0.001
for i in range(10000):
    x1_arr += [x1_arr[-1] + (0  * x1_arr[-1] + 1  * x2_arr[-1] + 0 * z_arr[-1] - 0.0 * (25 * x1_arr[-1] + 4 * x2_arr[-1] - 39 * z_arr[-1]) + 0.0) * dt]
    x2_arr += [x2_arr[-1] + (-6 * x1_arr[-1] - 5  * x2_arr[-1] + 0 * z_arr[-1] - 1.0 * (25 * x1_arr[-1] + 4 * x2_arr[-1] - 39 * z_arr[-1]) - 1.0) * dt]
    z_arr  += [z_arr[-1]  + (-1 * x1_arr[-1] + 0  * x2_arr[-1] + 0 * z_arr[-1] - 0.0 * (25 * x1_arr[-1] + 4 * x2_arr[-1] - 39 * z_arr[-1]) + 1.0) * dt]
    t      += [t[-1] + dt]
    y = 1.0 * x1_arr[-1] + 0.0 * x2_arr[-1] + 0.0 * z_arr[-1]
fig = plt.figure(figsize=(5, 4))
ax1 = fig.add_subplot(1, 1, 1)

ax1.plot(t, x1_arr, '-',  label='$x_1$')
ax1.plot(t, x2_arr, '--', label='$x_2$')
ax1.grid()
ax1.legend()
ax1.set_xlim(0, 5)
ax1.set_ylim(-1.2, 3.2)

fig.tight_layout()

即応性は多少改善したが、振動的になっている

参考文献

この記事は以下の書籍を参考にしましたが、
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください