Upgrade to Pro — share decks privately, control downloads, hide ads and more …

マイクロマウスのためのMATLAB講座 第3回

マイクロマウスのためのMATLAB講座 第3回

2019/5/25に開催したマイクロマウスのためのMATLAB講座の第3回資料です。テーマは「速度制御のためのシステム同定とコントローラ設計」です。ゴールはMATLABを使ってより高性能なPIDコントローラを設計することです。そのために必要な以下の3つの項目について実習を交えつつ解説を行いました。
1. 制御対象のモデリング
2. MATLABでのPIDコントローラの調整とシミュレーション
3. 簡単なシステム同定によって制御対象のモデルを得る方法

idt12312

May 25, 2019
Tweet

Other Decks in Technology

Transcript

  1. 制御対象の入出力関係を記述する どのように入出力関係を記述すべきか • 数学の言葉を使って記述したい • ある瞬間の入出力関係ではなく、過去の入力も踏まえた入力出力関係を考えたい • 一瞬1Vを入力した場合と、長時間1Vを入力した場合では出力速度は違うはず ゴール:目の前にある制御対象を制御すること 今日の制御対象

    制御工学的アプローチ • まず制御対象がどういう動きをするのかを知ろう • ある入力に対してどんな出力が出てくるのかが分かればひとまずOK マウス 入力 出力 モーター電圧 並進速度 入出力関係を微分方程式で記述しよう 5
  2. 制御対象の入出力関係を記述する 1. 第一原理モデリング 2. システム同定 • 物理的な関係式から制御対象をモデリング • 運動方程式, 回路方程式,

    化学方程式… • モデル内部で何が起こっているかの本質が分かる • まずはここから始める • 入出力データから制御対象をモデリング • モデリング対象の内部が不明なときに有用 • 第一原理モデリングをしてもパラメータが不明な時にも有用 • 入出力関係は分かるが内部の仕組みは分からない は何とかして計測する に色々突っ込む を計測する 7
  3. モデルを扱ってみよう 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
  4. モデルを扱ってみよう 実習 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
  5. コントローラ設計の一般論 なぜコントローラを作るのか(制御をするのか) ちゃんとした制御系設計は難しいので割愛 • MATLABを使って設計しよう • 制御理論がよくわからなくても雰囲気で • PIDコントローラは専用ツールを使うと簡単に調整可能 •

    制御対象の性能を向上させたい • 目標値に速く収束させる • 外乱の影響を受けにくくする • 不安定なものを安定にしたい 制御対象 制御器 要求を満たすコントローラを設計&制御系を解析するのが制御工学 16
  6. PID Tunerを使う 実習 1. Simulinkでモデルを作成 2. PID Tunerを起動 実習3: PID

    Tunerを使ってみよう PID Tunerを使ってPIDコントローラを調整する 18
  7. 現実的な要素を追加する 今までは • 連続時間(制御周期が無限に小さい) • センサーの分解能は無限に細かい • 計測した瞬間に値が得られ、出力に反映できる • 有限の制御周期

    • センサーにはlatencyと有限の分解能がある • センサー・アクチュエータに飽和がある 現実世界で実装するときには コントローラは離散時間で動くが 制御対象は連続時間で動く A/D(センサ), D/A(アクチュエータ)で 連続時間と離散時間の変換が実装される Note 23
  8. 離散時間と連続時間 微分方程式 差分方程式 連続時間 ラプラス変換 Z変換 伝達関数 パルス伝達関数 有限の制御周期 無限の制御周期

    マイクロマウスではぎりぎりまで速くしたくなるので コントローラは離散時間モデルで考えた方がいい 制御系の速さよりも十分に制御周期が速ければ コントローラ設計を連続時間のまま考えても問題ない 離散時間 24
  9. 現実世界の色々を盛り込む 実習 • 飽和や量子化はPIDTunerでは考慮されない • 非線形要素なので • フィルターや遅延はPIDTunerで考慮される • 線形要素なので

    現実的な要素をいれてシミュレーションをしてみよう tap数Nの移動平均は 実習6:色々盛り込んでシミュレーションする 29
  10. コントローラをプログラムで実装する 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
  11. 同定実験の詳細 ステップ応答の計測方法 • サンプリング周期は制御周期と同じで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を 入力している状態
  12. 同定実験の詳細 ポイント • 入力は一定値ならどの大きさでもよい • 小さすぎてちゃんと走らない、大きすぎてスリップしすぎるのはNG • 左右のモーターのDutyは異なっていてもよい(左右の和と差しか使わない) • 速度フィードバックをしない

    • 一定の電圧をモーターにかけるだけでよい • 車体は地面に置いて走らせる (空中でタイヤを空転させるのはNG) • モーターではなく、車体の動きを同定するため • 速度の計測値は生データではなく本番で使う値を使うのがおススメ • 制御にフィルタ後のデータを使う場合はフィルタ後のデータを同定にも使う • フィルタの特性を含めて同定することができるので楽 35
  13. 配布データについて パラメータ 値 外形 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 並進速度, 回転速度
  14. 配布データについて 実習 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
  15. PIDTunerで同定する 実習 3. 実験時の入出力データを読み込ませる 入力の大きさは左右のモーター電圧の和 Duty x バッテリー電圧 x 2(左右)

    並進速度の入った配列を指定する ステップ応答の入出力を読み込ませるモード 2ms 実習8: PID Tunerで同定する 39
  16. PIDTunerで同定する 実習 4. 実験データと伝達関数をすり合わせる Preprocess: 入出力データの前処理 データにフィルタをかけたりできる Structure: システムの構造(次数・共振するか)の設定 今回はたぶん1次(one

    pole)で十分 EditParameters: 伝達関数のパラメータを直接いじれる AutoEstimate: Structureの設定の範囲で自動調整 とりあえず押してみよう 見た感じ応答があっていそうなもののうち、 最小の次数であるものを選ぶとよい 実習8: PID Tunerで同定する 40
  17. 一連の流れ マイクロマウスの速度制御のためのフロー 1. ステップ応答を得る実験をする 2. MATLABでシステム同定をして伝達関数を得る 3. Simulinkで制御系のモデルを作成する 4. PID

    Tuner でPIDコントローラのパラメータを調整する 5. Simulinkでシミュレーションをして検証する 6. マイコンに実装して実機テスト 43
  18. 今日やったこと 1. 制御対象の数理モデルを扱う • 概念を知る • Simulinkでシミュレーションをする 2. PIDコントローラを設計する •

    PID TunerでPIDコントローラの調整をする 3. システム同定をする • ステップ応答から伝達関数を同定する 45
  19. 離散時間, 連続時間モデルの変換 c2dで変換できる Step応答を連続時間モデルと比較する % サンプリング周波数(制御周期) Ts = 0.001; %

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