倒立振子
レールの上を動く台車に立てた振子(倒立振子)を、PID・極配置・LQR のいずれかの制御で倒れないように支えるシミュレーションです。真下に垂れた振子はエネルギー法で振り上げてから立てます。制御周期、エンコーダの分解能、差分からの速度の推定、モータの電圧の上限といった実機の制約も入れてあり、ゲインや装置の値を変えると、立ち方や倒れ方、開ループと閉ループの極がすぐに変わります。振子や台車を押すこともできます。
図と波形を何分の 1 の速さで動かすか。計算の刻みは変わらない
図を押したり、押すボタンで加える力積(力 × 時間)。軽く指で弾くと 0.05 N·s ほど
振り上げるなら真下から始め、エネルギー法で振り上げてから安定化の制御へ切り替える(倒れたらまた振り上げる)。振り上げないなら、真上の近くで手を離したところから始め、倒れたら制御を止める
Q の対角の、台車の位置のずれ [m] の 2 乗に掛ける重み
Q の対角の、振子の角度 [rad] の 2 乗に掛ける重み
入力(電圧 [V] か力 [N])の 2 乗に掛ける重み。大きいほど入力を控えめにし、応答が遅くなる
1 組目の 2 つの極の固有角周波数。極の絶対値で、大きいほど速く戻すが入力が大きくなる
1 未満なら共役な複素数の 2 つの極(振動しながら戻る)、1 以上なら実数の 2 つの極
2 組目の 2 つの極の固有角周波数。極の絶対値で、大きいほど速く戻すが入力が大きくなる
1 未満なら共役な複素数の 2 つの極(振動しながら戻る)、1 以上なら実数の 2 つの極
角度のループ: 目標からの角度のずれに掛ける。倒れる向きへ台車を動かす
角度のループ: 角速度(推定値)に掛ける。振子の揺れを抑える
位置のループ: 位置のずれから角度の目標を作る。目標の方へ振子を傾けて台車を運ぶ
位置のループ: 台車の速度(推定値)に掛け、角度の目標から引く
振り上げないときに、手で立てて離す角度(真上から、右が正)
Q の対角の、台車の速度 [m/s] の 2 乗に掛ける重み
Q の対角の、振子の角速度 [rad/s] の 2 乗に掛ける重み
角度のループ: 角度のずれの積分に掛ける(飽和の向きには積まない)
位置のループ: 位置のずれの積分に掛ける。摩擦で残る位置のずれを消す
振子のエネルギーの不足(mgl を 1 とした値)に掛け、台車の加速度にする。大きいほど少ない往復で振り上げる
振り上げで台車に出す加速度の上限。大きいほど速く振り上げるが、台車が大きく動く
振子が真上からこの角度の内側に入ったら、振り上げから安定化の制御へ切り替える。外へ出たら(この角度 + 10° か 30° の大きい方)倒れたとみなす
公開された資料にある教材の値を入れる(振子・台車・摩擦・駆動)。クーロン摩擦と計測の値は変えない
振り子の棒(と軸の金具)の質量
振子の軸から重心までの長さ。長いほど倒れるのが遅く、立てやすい
台車(載せたおもりを含む)の質量。モータの回転子の慣性は駆動の側で足す
台車が動ける範囲。端では台車が止まり(反発係数 0.2)、その反動が振子にかかる
振子の重心まわりの慣性モーメント(1 kg·cm² = 10⁻⁴ kg·m²)。長さ L の一様な棒なら mL²/12。0 なら重心に質量が集まった振子
台車の速さに比例する摩擦(モータの逆起電力の分は除く)
速さによらない一定の大きさの摩擦。あると台車が止まりやすく、釣り合いの近くで小さく行き来する
振子の軸の、角速度に比例する摩擦トルク [N·m·s/rad]
モータへ出せる電圧(アンプか D/A 変換器の上限)。制御の出力はここで切れる
台車に出せる力。制御の出力はここで切れる
電流あたりのトルク。SI 単位では逆起電力定数 [V·s/rad] と同じ値(7.67 mN·m/A なら 7.67 mV·s/rad)
モータの巻線の抵抗。電圧から電流、電流からトルクを求める(巻線のインダクタンスは無視する)
モータとピニオンの間の歯車の比
台車のラック(またはベルト)を動かす歯車の半径
モータの回転子の慣性モーメント。台車から見ると Kg²Jm/r² の質量になる
計測して入力を決める間隔。入力は次の周期まで同じ値に保つ
角度と位置の差分から速度を推定する 2 次の低域通過フィルタ(減衰比 0.9)の遮断周波数。高いほど遅れが小さく、量子化の雑音が増える
振子の角度のエンコーダの 1 回転のカウント数(4 逓倍の後)。4096 で 1 カウント 0.088°
位置のエンコーダの 1 カウントの長さ。位置はこの刻みでしか分からない
角度の計測に足す正規分布の雑音の標準偏差(エンコーダなら 0、ポテンショメータなどで生じる)
位置の計測に足す正規分布の雑音の標準偏差
- 整定時間 ts
- 振り上げの時間 tup
- 最大の力 |F|max
- 台車の最大の変位
- 開ループの不安定な極 p+
- 閉ループの極
- 状態フィードバックのゲイン K
動作原理と式
台車と振子
レールの上を動く台車に軸を付け、振子を下げます。ラグランジュの方程式から、次の運動方程式が出ます[1]。
- 台車の質量
- 振子の質量
- 軸から振子の重心まで
- 振子の重心まわりの慣性モーメント
- 台車の位置。右が正
- 振子の角度。真上から測り、先端が右へ傾くと正
- 台車を押す力
- 台車の粘性摩擦とクーロン摩擦
- 軸の粘性摩擦
駆動
台車は DC モータが減速の歯車とピニオンで動かします。巻線のインダクタンスを無視すると、電圧 から力 は下の式になります。
- 逆起電力は、速さに比例する制動として働く
- 回転子の慣性は、台車の質量に足した等価質量 として入る
入力 は電圧か力です。力で駆動するときは です。どちらも、入力は上限で切ります。
線形の模型
真上()の近くで 、 とし、 とクーロン摩擦を落とします。すると、状態 の線形の模型になります[1]。
の固有値のうち正の 1 つ が、振子が倒れていく速さです。これが開ループの不安定な極です。台車が振子よりずっと重く なら、 に近づきます。固有値は、ヘッセンベルク化と QR 法で求めます[2]。
状態フィードバック
入力 1 つで 4 つの状態をすべて動かせる(可制御)のは、可制御性行列 の階数が 4 のときです[1]。振子と台車ではいつも可制御です。そのため、状態フィードバック によって閉ループの極、つまり の固有値をどこへでも置けます。
極配置
固有角周波数 と減衰比 の 2 組で、4 つの極を決めます。その特性多項式 から、アッカーマンの式でゲインを求めます[3]。
LQR
LQR は、状態のずれと入力の大きさの重み付きの和 を最小にするゲインです[1][4]。重み と から、代数リカッチ方程式の解 を求めます。
リカッチ方程式の解き方
- ハミルトン行列
- 符号関数 行列式で尺度を合わせたニュートン法
- 解 を 4 行ずつに分けた区画 の連立方程式を最小二乗で解く
PID
PID は 2 つのループを重ねます。
- 外の位置のループ: 台車の位置のずれから、振子の角度の目標 を作る。 は ±10° で切る
- 内の角度のループ: 振子をその角度に保つ入力を出す
台車を右へ運ぶには、まず振子を右へ傾ける必要があるからです。初めに台車が逆へ動く、不安定な零点の性質です。積分がなければ、これは状態フィードバックと同じ形です。
今の値を代入した式
振り上げ
振り上げは Åström・Furuta のエネルギー法です[7]。振子のエネルギー は、台車の加速度 を通してだけ変わります。 と逆の向きに加速すればエネルギーが増え、目標に近づくと加速をやめます。
は、直立して止まっていると 0、真下で止まっていると です。
このツールで足したこと
この式に、このツールで次の 4 つを足しています。
- 目標を直立より少し上の にする
- が小さい間、つまり直立の近くでは、加速を に比例して弱める。下限は 0.2
- 台車をレールの中央へ寄せる項を足す。固有角周波数は 1.5 rad/s
- 加速度から入力へ直すときに、逆起電力と台車の摩擦を補う
安定化との切り替え
- 振り上げ
- 真上から の内側に入る安定化の制御へ切り替える
- 安定化
- の外へ出る倒れたとみなし、振り上げに戻る
振り上げないときは、入力を 0 にします。
計測と制御周期
制御は実機と同じく離散時間で動きます。制御周期 ごとに、次の順に処理します。
- 角度と位置を読むエンコーダの 1 カウントの刻みに丸め、雑音を足す
- 速度を推定する差分から
- 入力を決める
- 入力を保つ次の周期まで
速度の推定は、微分に 2 次の低域通過フィルタを掛けたもの を、双一次変換で離散化しています。減衰比 は 0.9 です。一定の速さを正しく読むよう、周波数を合わせる補正はしません。
制御器は連続時間の線形の模型で設計します。そのため、制御周期が長いほど、またフィルタの遅れが大きいほど、設計した閉ループの極からずれて、ついには倒れます。
運動の計算
- 解き方: 0.25 ms 刻みの 4 次のルンゲ・クッタ法
- クーロン摩擦: で滑らかにする
- レールの端: 台車が当たると、反発係数 0.2 で跳ね返る。そのとき台車が受ける撃力で、振子の角速度も変わる
押したとき
図やボタンで押したときは、押した点にかかる水平の力積 から、質量行列 を通して速度の変化を求めます。 は軸から押した点までです。台車を押したときは、右辺の第 2 成分が 0 です。
整定時間
出来事から、角度 ±1° と位置 ±10 mm の範囲に入って 1 s 留まるまでの時間です。出来事は、振り上げて切り替えた、押した、初めの状態から離した、のどれかです。
教材の値
教材の値は、次の 2 つから取りました。
- Quanser の IP02 と SIP の設定ファイル[8]: 台車・おもり・粘性摩擦・モータ・歯車・ピニオン・台車が動ける範囲 814 mm・エンコーダの分解能・D/A の上限 10 V・振子・LQR の重みの初期値
- Control Tutorials for MATLAB and Simulink の Inverted Pendulum: System Modeling[9]
おもりを載せた台車・粘性摩擦・モータ・歯車・ピニオン・長い振子の値は、Bates の論文の付録の表 1 にもあります[10]。ただし、振子の慣性モーメントだけは表 1 と異なります。
このツールで決めたこと
- 振り上げに足した 4 つの工夫とその値
- クーロン摩擦の初期値
- 速度のフィルタの遮断周波数の初期値。Quanser の SIP の設定は 10 Hz
- PID と極配置の初期値
- レールの端の反発係数
- 押す強さ
出典
- 台車と振子の模型、可制御性、状態フィードバック、LQRK. J. Åström and R. M. Murray, Feedback Systems: An Introduction for Scientists and Engineers, 2nd ed., Princeton University Press, 2021
- 固有値を求めるヘッセンベルク化と QR 法W. H. Press et al., Numerical Recipes in C, 2nd ed., Cambridge University Press, 1992, 11.5・11.6 節
- アッカーマンの式、極配置K. Ogata, Modern Control Engineering, 5th ed., Prentice Hall, 2010
- LQRR. E. Kalman, “Contributions to the theory of optimal control,” Boletín de la Sociedad Matemática Mexicana, vol. 5, pp. 102–119, 1960
- 符号関数によるリカッチ方程式の解法J. D. Roberts, “Linear model reduction and solution of the algebraic Riccati equation by use of the sign function,” Int. J. Control, vol. 32, no. 4, pp. 677–687, 1980
- 符号関数によるリカッチ方程式の解法R. Byers, “Solving the algebraic Riccati equation with the matrix sign function,” Linear Algebra Appl., vol. 85, pp. 267–279, 1987
- 振り上げのエネルギー法K. J. Åström and K. Furuta, “Swinging up a pendulum by energy control,” Automatica, vol. 36, no. 2, pp. 287–295, 2000
- 教材の値Quanser Consulting, IP02 と SIP の設定ファイル(config_ip02.m・config_sp.m・setup_ip02_sip.m)
- 教材の値Control Tutorials for MATLAB and Simulink, Inverted Pendulum: System Modeling, University of Michigan ほか
- 教材の値と同じ値(付録の表 1)D. Bates, “A Hybrid Approach for Reinforcement Learning Using Virtual Policy Gradient for Balancing an Inverted Pendulum,” arXiv:2102.08362, 2021