Skip to content

22_P制御

tetsu00 edited this page Apr 9, 2020 · 19 revisions

はじめに

フィードバック制御の入門としてON-OFF制御に引き続き比例制御、またの名をP制御を体験しましょう。
P制御は目標値と制御量との偏差に比例して操作量を決める制御法です。

用語説明

用語 説明
出力 制御量とも。これを制御したい。
入力 操作量とも。
目標値 制御量に追従させたいもの。今回ならラインや壁との保ちたい距離などのこと。
偏差 目標値と現状の制御量との差。
制御器 偏差に基づき操作量を決めるもの。
これを考えて決める。
外乱 システムに意図せぬ影響を与える外的な作用。
今回ならセンサの値の誤差など。
比例ゲイン(Kp この値を決めることがP制御では制御器を決めることになる。

P制御してみよう

とりあえずP制御を体験してみましょう。

ロボット

今回もライントレースをします。ロボットに光センサを5つ搭載したいので次のようにrobot.mの中身を変更しましょう。

list_light_sensor = [100 60; 100 30; 100 0; 100 -30; 100 -60];

robot

制御器

controller.mの中身を変更を変更しましょう。順に説明していきます。

e = 0;
Ne = ones(1,5)*(value_light_sensor(:,1) < 50);
if Ne > 0
    e = [-2 -1 0 1 2]*(value_light_sensor < 50) / Ne;  % 偏差
end
Kp = 0.05;  % Pゲイン
u = [0.3; 0.3] + [-1; 1]*Kp*e;  % 入力
  • 偏差e ロボットの中心にラインがくるようにしたいので、
    (ラインと真ん中にあるセンサとの距離)=0
    が目標値となります。
    そして偏差eは目標値と制御量との差なので、
    例えば[100 60]のセンサの位置にラインがあるとき偏差は-60になります。 ここではわかりやすくするために各光センサでの偏差を-2 ~ 2で表します。
    value_light_sensor < 50は各センサの値が50以下かどうか、すなわちライン上にセンサがあるかを判定しており、50以下なら1それ以外は0が返ってきます。
    Neはライン上にある光センサの個数です。Neで割ることにより複数の線をまたぐときはその中間にラインがあるような偏差が得られます。

on_the_line

よって図のようなときは
e =

matrix

= 2

  • PゲインKp 偏差の一次関数としたときの比例定数がKpです。

  • 入力u

[0.3; 0.3]

は皆さまご存知の通りまっすぐ進めという命令です。
これに加えてロボットの中央にラインがくるように移動するという命令が

+ [-1; 1]*Kp*e

となります。
e=2のときKp=0.05とすると、[-0.1; 0.1]が加わり入力はu=[0.2; 0.4]となるので、ロボットの左側にラインがあるので右モータを速くして左モータを遅くしたいという制御が実現されました。

グラフ

ロボットの初期位置をinit_state = [200; 550; 0];と少しずらして実行してみました。
Kp=0.01で他は上と同じ条件です。

p_control_angle

p_control_y

前のページ | 次のページ

Clone this wiki locally