Simulink Test によるテスト駆動モデリングのすすめ
本日は,いまや “Simulink の中の人” として爆発的な人気を誇る toshi さんより Simulink Test についての記事です.ハンズオン形式なので皆さんも一緒に手を動かしながら読んでみてください.
こんにちは。toshi | Simulink の中の人です。
皆さん、Simulink でモデルを作ってますでしょうか? 最近は Twitter や YouTube などで Simulink の便利機能をたくさん紹介しているのですが、今回はその中でも、間違いなく業務効率と成果物品質の向上に繋がる、とっておきのテクニックを紹介したいと思います。
このテクニックを身に着けた時、あなたは Simulink の真の価値を理解できるようになります😎
目次
1. Simulink Test とテストハーネス
2. 準備
3. テスト駆動モデリングを体験
3.1. テストハーネスをサブシステムに対して作成する
3.2. 実行しながら作る
3.3. ブロックの機能を調べる
3.4. 機能を完成させる
4. まとめ
1. Simulink Test とテストハーネス
Simulink Test とは、Simulink を使って構築したモデルをテストする際に、その業務を効率化するツールボックスになります。
Simulink Test にはたくさんの機能がありますが、その中でも今回は「テストハーネス」という機能を紹介します。テストハーネスは、モデルやサブシステムに対して「テストを行うための独立したモデルファイル」を作り、それを管理する機能になります。
Simulink Test は、残念ながら Home ライセンスには入っておらず、主に企業の量産開発部署で使われており情報が表に出にくい(?)ため、ご存知ない方も多いのではないでしょうか。実はこの Simulink Test は、Stateflow, Simscape と並ぶ、Simulink に必須の汎用機能拡張ツールなのです。
テストハーネスを使うと、Simulink モデルを部分ごとに独立して実行することができるようになります。それにより、ちょっと作っては実行して確認し、修正しては実行して確認し、を繰り返して機能を構築していくことができます。このモデリング手法をここでは「テスト駆動モデリング」と呼んでいます(私の造語です)。
これの威力は、体感した人でないと分からないと思いますので、今回は、そのワークフローを初心者の方にも分かりやすく、事例を交えて紹介します。
2. 準備
今回はせっかくなので、皆さんにも手を動かして体験していただこうと思い、コンテンツを用意しています。ただし、体験していただくためには以下のツールボックスが必要になります。ツールボックスがない、もしくは読むだけでいいよ、という人は、3. テスト駆動モデリングを体験に飛んでくださって大丈夫です。
バージョン:R2022a
必要なツールボックス:MATLAB, Simulink, Stateflow, Simscape, Simscape Multibody, Control System Toolbox, Model Predictive Control Toolbox, Simulink Test
2.1. カスタムタブをダウンロードして有効化
GitHubにある、カスタムタブを用いた Simulink のモデリング業務効率向上というデモモデルをクローン、もしくはダウンロードしてください。
ReadMeに書かれている指示に従って、カスタムタブを有効化してください。Simulinkモデルを開いた時に「ACCEL」というタブが表示されていればOKです。
2.2. 「オンライン推定モデルを利用した適応MPCの設計」をダウンロードして開く
GitHubにある、オンライン推定モデルを利用した適応MPCの設計というデモモデルをクローン、もしくはダウンロードしてください。
「rls_mpc_ball_control.prj」をダブルクリックしてプロジェクトを起動します。その後、自動的に開かれる「RLS_MPC_index.mlx」にて、「適応MPCによる軌道追従制御」をクリックします。
開いた「design_trajectory_control_MPC.mlx」の14行目をコメントアウトします(Ctrl + Rでコメントアウトできます)。
その後、ライブスクリプトを実行します。途中、Mechanics Explorer が開いてボールがくるくるしていると思いますが、終わるまで待ちます。
実行完了後、「BallAndPlate_AMPC_Controller.slx」を開きます。以下のように2行目の文字を右クリックし、「”~~”を開く」をクリックすると素早く開くことができます。
最後に、「RLS_offset_free」というサブシステムを削除します。
この状態でモデルを保存しておいてください。
3. テスト駆動モデリングを体験
今、台の上に乗ったボールのXY位置制御を、モデル予測制御(MPC)で設計し、Simulink モデルに実装しています。円を描く軌道を指令値として与え、それに追従させようとしています。ところが、以下のプロットのように、指令値に対してオフセットが生じています。
ここで、「pos」はボールの位置(制御量)、「ref」は指令値、「angle」はMPCが出力する操作量です。一番上の波形はXYプロットになります。
ではここから、このオフセットを除去する処理を構築しようと思います。「pos」は「ref」に比例して増減することが分かっていますので、「ref」を追加で増減させることによって「pos」を「ref」に一致させることができると考えられます。作ろうとしている機能はざっくり言って以下のような感じです。
3.1. テストハーネスをサブシステムに対して作成する
では早速作っていきましょう。「BallAndPlate_AMPC_Controller.slx」に以下のようにサブシステムを追加し、ポートを作成し、繋ぎます。名前を「offset_free」と付けました。
ところで、この状態ではこの offset_free サブシステムを動作確認する際に、モデル全体を実行しないといけないですよね。2. 準備を行った方は分かると思いますが、モデル全体の実行にはそれなりに時間がかかります。動作を確かめるために何度も実行したくないですよね? そうであれば、取る手段は以下のどちらかです。
- モデルを実行せずに機能を最後まで作りきる。その後実行して確かめる。
- offset_free サブシステムを別ファイルに持っていき、そこで適当な入力を入れて実行できるようにして作る。
1番はとても良くないです。作りきった後に実行して、何かの間違いに気づいても、修正箇所の特定に時間がかかることがよくあります。2番は良いのですが、いちいちテスト用の環境を作るのが手間ですね。多くの人が億劫になって避けてしまうことだと思います。そこで Simulink Test の出番です。テストハーネスを使えば、この2番で行う定型作業を極限にまで少なくできるのです。そのための拡張ツールとして、カスタムタブを導入しましたので、それを駆使して進めましょう。
offset_free サブシステムを選択し、ACCELタブをクリックし、「作成 / 開く」をクリックします。
これにより、自動的にテストハーネスが作成されます。
このテストハーネスは、元のモデルとは独立したモデルファイルになっており、対象のサブシステムにテスト信号を入力して実行するためのインターフェースを備えています。テストハーネスは元のモデルファイルの中に保存されており、消さない限り残り続けます。テストハーネス上で対象のサブシステムの内部を変更すると、元のモデルの方にも自動的に反映されます。
では、このテストハーネスを使ってモデルを作ってみましょう。以降は、全部の作業を説明すると長くなりますので、ポイントを絞って解説していきます。
3.2. 実行しながら作る
指令値と制御量の差分を計算する機能を作ります。それぞれXY位置のベクトルであるため、ベクトル同士の大きさの差を取ります。”Dot Product” ブロックを使うと内積を計算できるので、以下のようにしました。
この時点で、正しく計算できているかを確認します。上の階層(offset_free_harness)に戻り、テスト用の入力信号を入れてみます。
ということで、合ってますね。
3.3. ブロックの機能を調べる
続けてモデリングをしていきます。次にこの差分を積分したいと思っています。この時 “Discrete-Time Integrator” というブロックが使えそうです。ここでふと「このブロックは本当に思った通り動いてくれるのだろうか」と思ったことはないでしょうか? 私は Simulink マスターなので、もちろん “Discrete-Time Integrator” の特性は熟知しているのですが、皆さんの中には初めての人もいると思います。そんな時にもテストハーネスを使いましょう。
R2022a時点では、テストハーネスは1個のブロックに対して作成することはできないので、カスタムタブのスクリプトにある細工をしておきました。以下のようにブロックに対して「作成 / 開く」をクリックすると、
参照サブシステムを介してテストハーネスを作成します。
少し解説します。1個のブロックに対してはテストハーネスを作れないため、そのブロックだけを含むサブシステムを作成し、それを参照サブシステムにより別ファイルに分けた上で、テストハーネスを作りました。
ややこしくて申し訳ないですが、こうした方が安全ですので、そうしています。このファイル同士の関係性が分からなくても大丈夫です。「Discrete_Time_Integrator__s_harness.slx」にて、ブロックの動作を確認し、終わったらウィンドウを閉じるだけでよいです。
確認し終わったら、もうこのテストハーネスはいらないと思います。元のモデルに戻り、「Discrete_Time_Integrator__s」参照サブシステムを削除して、Discrete-Time Integratorブロックに戻します。この時、クリック一つで戻せるようにカスタムタブのボタンを用意しておきました。以下のようにしてみてください。
ただし、現在のフォルダーに「Discrete_Time_Integrator__s.slx」という参照サブシステムファイルは残っています。残っていても問題はありませんが、気になる場合は削除しておいてください。
3.4. 機能を完成させる
続けてモデリングし、機能を完成させます。最終的には以下のようにします。
実はrefは、予測ホライズンと同じ長さの、30ステップ分の2次元ベクトルがまとめて入力されるので、実際は 2×30 の行列になっています。差分を計算するのはref行列の中の(1,1), (2,1)要素のみとして、かつ得られた調整量はrefの全体にかけるようにします。上記を作成する際には、是非「作っては実行」を心掛けてみてください。少しでも不安を感じたらすぐに実行して確認、です。
(”offset_free_I_gain”はデフォルトでは0になっているので注意してください。)
問題ないことを確認したら、モデルを保存し、テストハーネスを閉じます。”offset_free_I_gain”を0.01に設定し、最上位階層の「BallAndPlate_system.slx」を実行すると、以下のようになりました。
平均的にはオフセットを取り除くことができています。
4. まとめ
いかがでしょうか。皆さんはこれまで、ブロック1個単位や、1箇所の設定変更に対して、すぐに動かして試して、というモデリングをあまりやっていなかったのではないでしょうか。やろうと思っても、新しくモデルを作成したりする作業が億劫でやらなかった、というケースもあったと思います。
しかし、Simulink Test があれば状況は一変します。どんな細かい動作確認も、テストハーネスを使えばすぐにできます。皆さんの実業務でも是非お試しください。やってみると、このテスト駆動モデリングが如何に効率的であるかが分かると思います。
また、今回説明していませんでしたが、きちんとテストシナリオを作っておくと、テストマネージャーというアプリを使って管理できます。そうすると、モデルの変更があった時、問題が無いか確認するために、一括で自動実行と結果の合否判定ができるようになります。
ちなみに、コードベースの開発における「テスト駆動開発」と、考え方は同じですので、そう呼んでも良いのですが、ソフトウェアの領域に留まらない、また Simulink ならではの技法ですので、敢えて別の呼び方をさせていただきました。
最後に、最近アップロードしています、モデリングの参考になるテクニック動画集を以下に紹介させていただきます。
Simulink開発の必須テクニック ~テスト駆動開発とグラフィカル表現~
Simulinkで開発を行うための必須テクニック ~エディタ便利機能とショートカット~
- 범주:
- Simulink Test
댓글
댓글을 남기려면 링크 를 클릭하여 MathWorks 계정에 로그인하거나 계정을 새로 만드십시오.