Slide 1

Slide 1 text

マイクロマウスのための MATLAB講座 第3回 講師: @idt12312 速度制御のためのシステム同定とコントローラ設計

Slide 2

Slide 2 text

目標 PID制御のパラメータを自信をもって決定できるようになる • MATLABのPIDコントローラの調整機能を使えるようになる • 制御のシミュレーションをできるようになる • 制御対象のモデルをシステム同定によって得られるようになる そのために 2

Slide 3

Slide 3 text

今日の大まかな流れ 1. 制御対象の数理モデルを扱う 2. PIDコントローラを設計する 3. システム同定をする • 制御理論の詳細には触れない • 難しいことはMATLAB/Simulinkに任せる • 制御理論を勉強するきっかけをつくる 方針 3

Slide 4

Slide 4 text

1.制御対象の数理モデルを扱う

Slide 5

Slide 5 text

制御対象の入出力関係を記述する どのように入出力関係を記述すべきか • 数学の言葉を使って記述したい • ある瞬間の入出力関係ではなく、過去の入力も踏まえた入力出力関係を考えたい • 一瞬1Vを入力した場合と、長時間1Vを入力した場合では出力速度は違うはず ゴール:目の前にある制御対象を制御すること 今日の制御対象 制御工学的アプローチ • まず制御対象がどういう動きをするのかを知ろう • ある入力に対してどんな出力が出てくるのかが分かればひとまずOK マウス 入力 出力 モーター電圧 並進速度 入出力関係を微分方程式で記述しよう 5

Slide 6

Slide 6 text

制御対象の入出力関係を記述する 前回のモーターの例 (伝達関数表現) 前回の車体制御の例 (状態空間表現) 制御対象 入力 出力 生の微分方程式はまだ扱いづらい 制御で扱いやすい 統一的な表現へ 1. 伝達関数表現 2. 状態空間表現 6

Slide 7

Slide 7 text

制御対象の入出力関係を記述する 1. 第一原理モデリング 2. システム同定 • 物理的な関係式から制御対象をモデリング • 運動方程式, 回路方程式, 化学方程式… • モデル内部で何が起こっているかの本質が分かる • まずはここから始める • 入出力データから制御対象をモデリング • モデリング対象の内部が不明なときに有用 • 第一原理モデリングをしてもパラメータが不明な時にも有用 • 入出力関係は分かるが内部の仕組みは分からない は何とかして計測する に色々突っ込む を計測する 7

Slide 8

Slide 8 text

モデルがあるとできること シミュレーションができる 制御工学に基づいて制御系設計ができる • 入出力関係が数学的に表現できているのでプログラムでシミュレーションできる • 前回Simulinkでやったようなことができる • パラメータを変えては実機で動かして…のサイクルをPC上で完結できる • 実機でのトライアンドエラーによるパラメータ調整を卒業できる • なぜそのパラメータが適しているかの理由が考えられる モデルベース制御?? 8

Slide 9

Slide 9 text

マイクロマウスのモデリング マウス機体の速度の制御を考える 入力を工夫すると 並進方向と回転方向に分解可能 左モーター電圧 右モーター電圧 並進速度 回転速度 2入力2出力で難しい 以降もこの考え方を使う 9 今回は2輪DCマウスに限定

Slide 10

Slide 10 text

モデルを扱ってみよう マイクロマウスの並進方向のモデル 入力:左右のモーター電圧の和 出力:機体の並進速度 具体例としてInouの並進方向のモデルを扱う 実習 この伝達関数はシステム同定によって得た 実習1: Simulinkでシミュレーションする Inouのモーター電圧の和→並進速度のモデルを Simulinkを使ってシミュレーションする 10

Slide 11

Slide 11 text

モデルを扱ってみよう 実習 Transfer Fcn Scope Step 1. Simulinkでモデルを作成 Transfer Fcnブロックの設定 実習1: Simulinkでシミュレーションする 11

Slide 12

Slide 12 text

モデルを扱ってみよう 実習 4. いろんな入力をいれてみよう 3. シミュレーションを実行 & Scopeを表示 左右のモーターにそれぞれ0.5Vかけた時の 並進速度の応答 Stepブロックを Simulink/Sourceにあるブロックに置き換える 実習1: Simulinkでシミュレーションする 12

Slide 13

Slide 13 text

モデルを扱ってみよう 1. 伝達関数オブジェクトを生成 実習 % 分子多項式の係数 num = [5400]; % 分母多項式の係数 den = [1, 3100, 12000]; % 伝達関数生成 G_inou = tf(num, den); % 伝達関数を表示 G_inou 2. Step応答をシミュレーション & plot figure; step(G_inou); grid on; は tf([1,0], [2,3])で生成できる Tips 実習2: MATLABでシミュレーションする 13

Slide 14

Slide 14 text

モデルを扱ってみよう 実習 3. 任意の入力に対する応答をシミュレーション % 時刻列を生成 % 0~10秒を0.01秒刻みで t = 0:0.01:10; % 入力を生成 u = zeros(size(t)); u(200:300) = 1; u(500:700) = 2; % 応答をシミュレーション y = lsim(G_inou, u, t); % 入力と応答を重ねてplot figure; plot(t, u); hold on; grid on; plot(t, y); xlabel('Time [s]'); legend('input', 'output'); 入力uには任意のデータ列を設定可能 複雑な関数から生成, ファイルから読み込む 実習2: MATLABでシミュレーションする 14

Slide 15

Slide 15 text

2.PIDコントローラを設計する

Slide 16

Slide 16 text

コントローラ設計の一般論 なぜコントローラを作るのか(制御をするのか) ちゃんとした制御系設計は難しいので割愛 • MATLABを使って設計しよう • 制御理論がよくわからなくても雰囲気で • PIDコントローラは専用ツールを使うと簡単に調整可能 • 制御対象の性能を向上させたい • 目標値に速く収束させる • 外乱の影響を受けにくくする • 不安定なものを安定にしたい 制御対象 制御器 要求を満たすコントローラを設計&制御系を解析するのが制御工学 16

Slide 17

Slide 17 text

MATLABの便利ツール • GUIで簡単に調整できる • 応答を見ながらパラメータをいじれる • 制御対象はシステムオブジェクトで渡す • 先の実習で出てきた伝達関数になってればOK • Simulinkと協調動作することも可能 PID Tuner 17

Slide 18

Slide 18 text

PID Tunerを使う 実習 1. Simulinkでモデルを作成 2. PID Tunerを起動 実習3: PID Tunerを使ってみよう PID Tunerを使ってPIDコントローラを調整する 18

Slide 19

Slide 19 text

PID Tunerを使う 実習 制御対象はSimulinkモデルを元に解析され、 自動的に取り込まれる 3. パラメータを調整する PIDパラメータが表示される この辺りをいじる Simulinkのモデルに反映 実習3: PID Tunerを使ってみよう 19

Slide 20

Slide 20 text

PID Tunerを使う 実習 • 応答が速くなっている • 目標値である1に収束している 4. パラメータの反映を確認する 5. シミュレーションを実行する 実習3: PID Tunerを使ってみよう 20

Slide 21

Slide 21 text

PID Tunerを使う 実習 外乱用のstepブロックを追加する 外乱が入ってもすぐに収束する 実習4:外乱を入れてみる 外乱を入れてシミュレーションする コントローラなしと比較してみよう 21

Slide 22

Slide 22 text

PID Tunerを使う Tuneボタンを押したときに起こること • PIDブロックを含む1巡ループの伝達が計算され、PIDTunerに取り込まれる • ループ状に複数のブロックがあると全てが考慮される • 非線形なブロックは無視or線形近似される 極端な例 このループ上のものだけ 考慮される 22

Slide 23

Slide 23 text

現実的な要素を追加する 今までは • 連続時間(制御周期が無限に小さい) • センサーの分解能は無限に細かい • 計測した瞬間に値が得られ、出力に反映できる • 有限の制御周期 • センサーにはlatencyと有限の分解能がある • センサー・アクチュエータに飽和がある 現実世界で実装するときには コントローラは離散時間で動くが 制御対象は連続時間で動く A/D(センサ), D/A(アクチュエータ)で 連続時間と離散時間の変換が実装される Note 23

Slide 24

Slide 24 text

離散時間と連続時間 微分方程式 差分方程式 連続時間 ラプラス変換 Z変換 伝達関数 パルス伝達関数 有限の制御周期 無限の制御周期 マイクロマウスではぎりぎりまで速くしたくなるので コントローラは離散時間モデルで考えた方がいい 制御系の速さよりも十分に制御周期が速ければ コントローラ設計を連続時間のまま考えても問題ない 離散時間 24

Slide 25

Slide 25 text

離散時間モデルのシミュレーション 1. 離散時間コントローラのためにモデルを修正する 実習 ZeroOrderHold 離散時間モデルでは微分・積分は近似になる 制御ではBackword Eulerを使うのがおススメ 実習5:離散時間コントローラを導入 離散時間コントローラを使ってSimulinkで 調整&シミュレーションをする 25

Slide 26

Slide 26 text

離散時間モデルのシミュレーション 実習 2. コントローラを調整する 制御周期が応答より十分に速いと離散時間感がない 応答を早くしていくと離散時間感が出てくる 実習5:離散時間コントローラを導入 26

Slide 27

Slide 27 text

離散時間モデルのシミュレーション 3. コントローラ出力(制御対象への入力を確認する) 実習 コントローラの出力はモーター電圧の和 目標値(制御対象の出力)は並進速度 バッテリー電圧を4Vとすると、 コントローラ出力は8V以内である必要がある 実習5:離散時間コントローラを導入 27 速い応答を実現するために 大きな入力を入れようとしてしまう

Slide 28

Slide 28 text

現実世界の色々を盛り込む センサーの分解能 無駄時間 フィルタの遅れ 飽和 マウスで発生する重要な現実要素 最小分解能を設定 上下限値を設定 デジタルフィルタの伝達関数を設定 左の例は移動平均フィルタ(N=4) 28

Slide 29

Slide 29 text

現実世界の色々を盛り込む 実習 • 飽和や量子化はPIDTunerでは考慮されない • 非線形要素なので • フィルターや遅延はPIDTunerで考慮される • 線形要素なので 現実的な要素をいれてシミュレーションをしてみよう tap数Nの移動平均は 実習6:色々盛り込んでシミュレーションする 29

Slide 30

Slide 30 text

現実世界の色々を盛り込む • 非線形要素(飽和・量子化など)による影響はシミュレーションして確認するしかない • PIDTunerではステップ目標値に対する応答しか見られない • パラメータは実際にコントローラに入力する目標値に追従できればよい • マイクロマウスの速度制御では速度目標値は台形であることがおおい • ステップ目標値で大きく振動的になるパラメータでも、台形目標値では問題ないこともある コントローラのパラメータ調整のポイント PID Tunerでの目標値 マウス運用時の速度目標値 変化が急 変化が緩やか 30

Slide 31

Slide 31 text

コントローラをプログラムで実装する r : 目標値 y : 計測値 u : コントローラ出力 // 前回から引き継がれる状態 // e_sum, e_prev, ud_prev e = r-y; e_sum = e_sum + I*Ts*e; up = P*e; ui = e_sum; ud = (ud_prev + D*N*(e-e_prev))/(1+N*Ts); u = up + ui + ud; e_prev = e; ud_prev = ud; 以下の形のコントローラに対する パラメータを求めることができた プログラムの雰囲気 プログラムで 実装しよう 31

Slide 32

Slide 32 text

3.システム同定をする

Slide 33

Slide 33 text

システム同定の手順 マイクロマウス速度制御用簡単バージョン 1. ステップ応答を計測する • モーターに一定電圧をかけ続け、機体速度の変化を計測する • 並進方向と回転方向の2回行う 2. 同定を行う • MATLABのPID Tunerについてくるツールを使用する • ステップ応答から伝達関数を求めることが可能 33

Slide 34

Slide 34 text

同定実験の詳細 ステップ応答の計測方法 • サンプリング周期は制御周期と同じでOK • 並進方向と回転方向の2回実験を行う • 値が収束するまでデータを取る(右のグラフくらい) 例1 並進方向を同定するとき バッテリー電圧 : 3.9V 右モーターのPWM Duty : 0.21 左モーターのPWM Duty : 0.19 3.9V*(0.21+0.19)=1.56Vを 入力している状態 例2 回転方向を同定するとき バッテリー電圧 : 3.9V 右モーターのPWM Duty : 0.3 左モーターのPWM Duty : -0.3 34 真っ直ぐ走らせるためにDutyに差をつけるのはアリ 3.9V*(0.3+0.3)=2.34Vを 入力している状態

Slide 35

Slide 35 text

同定実験の詳細 ポイント • 入力は一定値ならどの大きさでもよい • 小さすぎてちゃんと走らない、大きすぎてスリップしすぎるのはNG • 左右のモーターのDutyは異なっていてもよい(左右の和と差しか使わない) • 速度フィードバックをしない • 一定の電圧をモーターにかけるだけでよい • 車体は地面に置いて走らせる (空中でタイヤを空転させるのはNG) • モーターではなく、車体の動きを同定するため • 速度の計測値は生データではなく本番で使う値を使うのがおススメ • 制御にフィルタ後のデータを使う場合はフィルタ後のデータを同定にも使う • フィルタの特性を含めて同定することができるので楽 35

Slide 36

Slide 36 text

配布データについて パラメータ 値 外形 60mm x 35mm 重さ 14g バッテリー電圧 4.0V(1cell 実験時の電圧) 機体の情報 データについて • 並進方向のステップ応答、回転方向のステップ応答の測定結果が入っている • 並進方向の実験 trans1.csv, trans2.csv • 回転方向の実験 rot1.csv, rot2.csv • 並進速度(m/s)はエンコーダ、回転速度(rad/s)はジャイロから計算 • 2ms周期でサンプリング • 各実験時のモータのDuty 並進方向 回転方向 左 0.3 右 0.3 左 -0.2 右 0.2 36 並進速度, 回転速度

Slide 37

Slide 37 text

配布データについて 実習 plotFileName = 'trans1.csv'; rawData = load(plotFileName); vTrans = rawData(:, 1); vRot = rawData(:, 2); Ts = 0.002; N = length(rawData); t = 0:Ts:(N-1)*Ts; figure; subplot(1,2,1); plot(t, vTrans); grid on; xlabel('Time [s]'); ylabel('Translation Velocity [m/s]'); subplot(1,2,2); plot(t, vRot); grid on; xlabel('Time [s]'); ylabel('Rotational Velocity [rad/s]'); sgtitle(plotFileName); 事前に配布したサンプルデータを読み込み、 並進速度と回転速度を並べたグラフを作ろう 実習7: 配布データを読み込んでplotしよう 37

Slide 38

Slide 38 text

PIDTunerで同定する 実習 1. MATLABからPIDTunerを起動する pidTuner 2. 同定ツールを起動する サンプルデータを使って モーター電圧の和→並進速度の伝達関数を同定しよう 実習8: PID Tunerで同定する 38

Slide 39

Slide 39 text

PIDTunerで同定する 実習 3. 実験時の入出力データを読み込ませる 入力の大きさは左右のモーター電圧の和 Duty x バッテリー電圧 x 2(左右) 並進速度の入った配列を指定する ステップ応答の入出力を読み込ませるモード 2ms 実習8: PID Tunerで同定する 39

Slide 40

Slide 40 text

PIDTunerで同定する 実習 4. 実験データと伝達関数をすり合わせる Preprocess: 入出力データの前処理 データにフィルタをかけたりできる Structure: システムの構造(次数・共振するか)の設定 今回はたぶん1次(one pole)で十分 EditParameters: 伝達関数のパラメータを直接いじれる AutoEstimate: Structureの設定の範囲で自動調整 とりあえず押してみよう 見た感じ応答があっていそうなもののうち、 最小の次数であるものを選ぶとよい 実習8: PID Tunerで同定する 40

Slide 41

Slide 41 text

PIDTunerで同定する 実習 5. 同定結果を表示する 伝達関数を表示 伝達関数をMATLAB workspaceにexport 実習8: PID Tunerで同定する 41

Slide 42

Slide 42 text

同定したモデルを利用する フィルタなどもまとめて同定した場合は Simulinkモデルから削除する 同定結果を反映 同定した伝達関数を使ってコントローラ設計と Simulinkでのシミュレーションをしよう 実習9:同定したモデルをSimulinkモデルに反映する 42

Slide 43

Slide 43 text

一連の流れ マイクロマウスの速度制御のためのフロー 1. ステップ応答を得る実験をする 2. MATLABでシステム同定をして伝達関数を得る 3. Simulinkで制御系のモデルを作成する 4. PID Tuner でPIDコントローラのパラメータを調整する 5. Simulinkでシミュレーションをして検証する 6. マイコンに実装して実機テスト 43

Slide 44

Slide 44 text

まとめ

Slide 45

Slide 45 text

今日やったこと 1. 制御対象の数理モデルを扱う • 概念を知る • Simulinkでシミュレーションをする 2. PIDコントローラを設計する • PID TunerでPIDコントローラの調整をする 3. システム同定をする • ステップ応答から伝達関数を同定する 45

Slide 46

Slide 46 text

参考資料 書籍 制御理論の入り口となるバイブル的な本 システム同定はどういう流れで行うのか、 なぜシステム同定ができるのかが分かる 46

Slide 47

Slide 47 text

参考資料 ブログ • id研/マイクロマウスの機体を同定する http://idken.net/posts/2017-06-02-systemident/ • MATLABでマイクロマウスの機体をシステム同定してPIDチューニングする. http://utcb.ikiu.me/MATLABSystemIdentification.html @dango_bot 47

Slide 48

Slide 48 text

Appendix

Slide 49

Slide 49 text

PIDTunerを使う(MATLAB) コマンドから起動 GUIなしで設計 pidTuner; pidTuner(G_inou); % 閉ループ系のゲイン交差周波数 wc = 0.1; [C Info] = pidtune(G_inou, ‘pid’,wc); 49 制御対象を与えて起動

Slide 50

Slide 50 text

離散時間, 連続時間モデルの変換 c2dで変換できる Step応答を連続時間モデルと比較する % サンプリング周波数(制御周期) Ts = 0.001; % 連続時間モデル->離散時間モデルに変換 Gd_inou = c2d(G_inou, Ts); % パルス伝達関数を表示 Gd_inou 変数zを使ったパルス伝達関数で出てくる 拡大すると違いが見える c2dはデフォルトでは0次ホールドによる変換が行われる c2d(sys, Ts, ‘tustin’)のようにすると双一次変換が行われる 50