こちらの記事の続きです。
プラントモデルを作成するため、まずは状態方程式を考えました。次は立てた状態方程式をモデルに落としていきます。
完成モデル
まずは完成形です。状態方程式からこのように作成してみました。
モーターによる駆動力
まずはモーターの駆動力ですが、状態方程式は以下の通りです。
\(モーターの駆動力=\frac{モーターのトルク}{タイヤの半径}\)これをモデルにすると以下のようになります。
モータトルクはコントローラーからやってくる想定なのでInportブロックとしています。
また定数DIAMETERにはタイヤ径を設定するようにしています。必要なのは半径なので1/2した値でモータのトルク値を割っています。
重力
重力による坂道を下がっていく力の状態方程式は、角度をθすると以下の通りです。
\(ずり下がる力=物体の重さ{\times}重力加速度{\times}sinθ\)これをモデルにすると以下のようになります。
定数WEIGHTには制御対象物の重さをkgで設定するようにしています。また、重力加速度は9.8としました。
角度はシミュレーションの途中で変更できるよう定数ではなくPulse Generatorブロックとしました。
どのブロックを使って角度を与えるかは特にルールもないので好きなものを使えばよいかと思います。
今回はPulse Generatorブロックを以下の設定にしてシミュレーション開始後から坂の角度が10度となるようにしました。
角度からsin値への変換ですが、Simulinkにsineブロックというものが用意されているのでこれを使用しました。
入力値ですが、360を1、0を0とする割合値を入れます。例えば45度に設定したいのであれば45/360で0.125を入力します。
外乱
外乱は本当に何でも良いのですが、ここでは角度と同じくPulse Generatorブロックを使用しました。
設定はシミュレーション開始7秒後に1Nの力が外乱としてかかるようにしました。
加速度と速度の算出
まずはモーターの駆動力から重力と外乱を引くことで、制御対象物にかかる力[単位:\(N\)]を出し、その力を重量で割ることで加速度[単位:\(m/s^2\)]を算出しました。
加速度が求まった後は速度を算出します。
今回ですが、シミュレーションのサンプル時間を1ミリ秒としています。1ミリ秒毎に値を測定しに行くというイメージです。
例えば加速度が\(10m/s^2\)だとすると、1秒後には今の速度から10m/s(時速換算すると2.8km/hくらい)だけ速度が上昇します。
ということは、今から1ミリ秒後にはその1/1000、0.01m/sだけ速度が上昇しているはずなので、前回測定した速度から加速度の1/1000を足せば、今の速度になると考えられます。
それを行っているところが以下です。
要は加速度を積分して速度にしているのでIntegratorブロックを使用しても結果は同じなのですが、加速度を積分するというイメージをしてもらいやすいかと思い、このように作成してみました。
ちなみに積分をするIntegratorブロックを使った場合は以下の通りです。
このようにサンプル時間を気にすることも前回値に足す必要もなく簡単になります。
単位変換
積分することで速度が求まりましたが、求まった速度の単位が\(m/s\)なのでしっくりきません。そのため馴染みのある\(km/h\)に変換します。
また、モーターの回転数も知りたいので速度から回転数に変換します。
時速と回転数が求まったら、あとはそれを外に出し、Scopeにつないで値を見たり、必要であればコントローラーに渡したりします。
モータートルク
今回はプラントモデルを作成したのでコントローラーは作っていません。
なので好きなトルク指示値を出しても良いのですが、せっかくなので現実にありそうな値にしてみたいと思います。
モーターはT-N特性と呼ばれる特性を持っており、ざっくり説明するとモーターが回転し始めた瞬間が一番トルクが高く(起動トルク)、一番早く回転する状態ではトルクが0となります。
参考:https://micro.citizen.co.jp/tec/characteristic.html
ということで、これを再現してみることにします。
方法は簡単で、以下のようにLookupTableブロックを使用します。今回はこれを暫定のコントローラーモデルとしました。
入力はプラントモデルで算出した回転数で、出力は回転数に応じたモータートルクとなるようにします。
また、モーターの特性ですが、起動トルクは0.1N、無負荷時の回転数は5000rpmと仮定しました。だいたいミニ四駆に使われるような規模のモーターのイメージです。
これを再現するため、LookupTableの設定を以下のようにしました。
定数値の設定
シミュレーションの前に制御対象物の重さを表す定数WEIGHTとタイヤ径を表す定数DIAMETERに値を設定する必要があります。
モーターがミニ四駆に使われる程度のトルクとしたので、重さ、タイヤ径もミニ四駆程度のものを想定し、それぞれ0.15kg(150g)、0.03m(30mm)としました。
また、以下のようにmファイルに設定値を書いておき、このmファイルを実行することでシミュレーション時に値を使用できるようにします。
シミュレーション
ようやく準備が全て揃ったので、それでは実際にシミュレーションをしてみたいと思います。
このようにプラントモデルに入ってくる入力値と出力値をScopeブロックにつないでモニターできるようにします。
シミュレーションした結果は以下のようになりました。
グラフは左上がモーターのトルク、左中が傾斜角、左下が外乱、右上が速度、右中がモーターの回転数です。
最初は回転数が0の状態なので開幕はモーターは最大トルクの0.1Nmを出力しており、モーターの力で速度が上がっていきます。
速度が上がるとだんだんモーターのトルクが落ちてきて、最終的に最大回転数に到達してトルク0となり速度が一定となります。
3秒からは傾斜角が10度となります。進む方向と逆の力が発生するので速度が落ちているのですが、速度が落ちることでモーターの回転数が下がりトルクが上がります。
そしてあるところでモーターのトルクと傾斜により下がろうとする力が釣り合い、速度が再び一定となります。
7秒からはさらに謎の外乱が発生し、また速度が落ちます。しかし、やはりあるところでモーターのトルクと傾斜+外乱の力が一致し、速度が一定となります。
プラントモデル作成方法まとめ
今回はプラントモデルの具体的な作成方法をご紹介しました。
今回作成したプラントモデルは本当にざっくりしたもので、色々考慮していないところがありますが、それでもある程度のコントローラーの動きを確認するのには使えるのではないかと思います。
まずはこのくらい簡単に作ってみて、コントローラーの確からしさを検証するのにもう少し詳細が必要であれば機能を加えていけばいいのではないでしょうか。
コメント