測って、ずれを直す制御
フィードバック制御は、センサーで今の値を測り、目標とのずれを見て、動かし方を直す仕組みです。比例制御は、ずれの大きさに比例した量だけ動かす、いちばん簡単な方法です。
このレッスンでは、1つの関節を目標の角度へ近づける動きを、シミュレーションで調べます。
このレッスンのゴール
メモ
比例制御を1ステップずつ計算し、ゲインによる動きの違いとオーバーシュートを説明できる。
キーワード
| ことば | いみ |
|---|---|
| センサー | 今の角度などを測る部品 |
| 誤差 | 目標から今の値を引いた、ずれ |
| 比例制御 | 誤差に比例した量だけ動かす制御 |
| ゲイン | 誤差にかける数。大きいほど強く動く |
| オーバーシュート | 目標をこえて行きすぎること |
学生が入力するセルは、このプレビューでは空白です。
センサーの読み値には細かさの限りがある
関節の角度を測るセンサーは、決まった細かさ(きざみ)でしか読めません。きざみが 0.5 度なら、読み値は 37.0、37.5、38.0 のどれかです。
本当の角度に、いちばん近いきざみの値が読み値になります。きざみより細かいずれは、見えません。
37.3度をきざみ0.5度で読む
docker exec jupyter python3 -c "print(round(37.3 / 0.5) * 0.5)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
誤差に比例して、1ステップずつ動かす
1ステップごとに、まず誤差を「目標 − 今の位置」と求めます。次に、位置を「ゲイン × 誤差」だけ動かします。
これをくり返すと、位置は目標へ近づきます。ゲインが 0.5 なら、1回ごとに残りの半分だけ進みます。
例: 目標 10、ゲイン 0.5、最初は 0
| ステップ | 誤差 | 動く量 | 位置 |
|---|---|---|---|
| 1 | 10 | 5 | 5 |
| 2 | 5 | 2.5 | 7.5 |
| 3 | 2.5 | 1.25 | 8.75 |
| 4 | 1.25 | 0.625 | 9.375 |
学生が入力するセルは、このプレビューでは空白です。
比例制御を Python で
# 角度 0 の関節を、目標 10 へ近づけます。ゲインは 0.3 です。
position = 0.0
target = 10
gain = 0.3
for step in range(1, 6):
error = target - position
position = position + gain * error
print(step, round(position, 3))
# gain を 1.5 に変えて、もう一度実行します。
# 位置は目標の 10 をこえますか。
ゲインが大きすぎると行きすぎる
ゲインが 1 なら、1回で目標に着きます。1 より大きいと、目標をこえて行きすぎます。これがオーバーシュートです。
ゲインが 2 になると、行ったり来たりのふれ幅が小さくならず、2 より大きいと、ふれ幅が大きくなっていきます。
例: 目標 10、最初は 0 の5ステップ
| ゲイン | 5ステップの位置 | 様子 |
|---|---|---|
| 0.5 | 5、7.5、8.75、9.375、9.6875 | なめらかに近づく |
| 1 | 10、10、10、10、10 | 1回で着く |
| 1.5 | 15、7.5、11.25、9.375、10.3125 | 行きすぎて、落ち着く |
| 2 | 20、0、20、0、20 | ずっと行ったり来たり |
学生が入力するセルは、このプレビューでは空白です。
ゲイン 1.6 の5ステップ
docker exec jupyter python3 -c "import numpy as np; print(np.round(10 * (1 - (1 - 1.6) ** np.arange(1, 6)), 2))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
ゲインは大きいほど速く目標に着くと考えがちです。実際は、1 をこえると行きすぎ、2 をこえると不安定になります。速さと落ち着きの、ちょうどよいところを探します。