Simulinkの計算エンジン:ソルバー
Simulinkの計算エンジンはMATLABとは異なります。前に言及したとおりMATLABのコードは主にインタプリタ型で実行されています。それとは異なり、各Simulinkブロックには、予めコンパイルされた実行ファイルが用意されており、それをSimulinkのシミュレーション・エンジンがシミュレーションステップごとにコールして動作しています。
シミュレーションステップはソルバーによって決められます。このソルバーは常微分方程式を解くことによって、s領域伝達関数などの連続系システムのシミュレーションを行うことが出来ます。
ソルバーには離散と連続の2つのタイプがあります。デジタル信号処理のような離散システムのみで構成されるシステムのシミュレーションを行う場合は離散ソルバーを選択します。s領域の伝達関数やアナログ・フィルタのように連続状態を含むシステムをシミュレーションする場合は連続ソルバーを選択します。また、離散、連続それぞれには固定ステップと可変ステップのソルバーがあります。連続状態を含むモデルのシミュレーションは、数値積分を行って近似計算が行われており、固定ステップソルバーはその名の通りシミュレーションステップが一定間隔なので近似誤差は保証されていないのに対し、可変ステップソルバーは積分の近似誤差を許容誤差以下に抑えるよう信号の変化に応じてダイナミックにシミュレーションステップを可変させながら計算するため、シミュレーションの精度が保たれます。
固定ステップと可変ステップの違いを確認するために、チャープ信号を伝達関数に入力する連続系システムのシミュレーションを行い、出力信号を表示してみます。
グラフ上段の固定ステップではシミュレーションの時間の刻みが一定であるのに対して、下段の可変ステップでは、信号の変化に応じて時間の刻みが粗くなったり細かくなったりしているのが確認できます。固定ステップでは精度を保つために信号の変化が速い箇所に合わせて、ある程度小さいステップサイズにしておく必要がありますが、可変ステップだと信号の変化が小さいときはステップサイズが大きく、信号の変化が大きいとステップサイズは小さく、自動的に調整してくれます。これにより効率良く高精度なシミュレーションが実現できるのです。
なお、この結果は次のMATLABプログラムからSimulinkモデルを実行して求めました。MATLABプログラムの手順は以下となっています。
- Simulinkモデルをオープン
- 固定ステップソルバー設定後Simulinkシミュレーション実行
- Simulinkで取られたログ(To Workspaceブロック)を可視化
- 可変ステップソルバーに変更後Simulinkシミュレーション実行
- Simulinkで取られたログを可視化
SimulinkはMATLABと密に連携が可能で、MATLABプログラムからSimulinkパラメータを自在に変更し、繰り返しシミュレーションすることができるのです。
%% 可変/固定ステップソルバーの時間刻みの違いを確認するサンプル
open_system('solver_demo')
%% Set Fixed Step Solver
set_param(bdroot, 'solver', 'Ode5') % 固定ステップソルバーに設定
set_param(bdroot, 'FixedStep', '0.05') % ステップサイズの設定
sim(bdroot) % シミュレーション実行
%% Plot
figure
subplot(2,1,1)
plot(simout.time,simout.signals.values,'bo-');hold on
stem(simout.time,simout.signals.values,'bo-');grid on, hold off
xlim([0 2])
title('Fixed Step Solver')
%% Set Variable Step Solver
set_param(bdroot, 'solver', 'Ode45') % 可変ステップソルバーに設定
set_param(bdroot, 'RelTol', '5e-6') % 相対許容誤差の設定
set_param(bdroot, 'AbsTol', '1e-10') % 絶対許容誤差の設定
sim(bdroot) % シミュレーション実行
%% Plot
subplot(2,1,2)
plot(simout.time,simout.signals.values,'bo-');hold on
stem(simout.time,simout.signals.values,'bo-');grid on, hold off
xlim([0 2])
title('Variable Step Solver')
Simulinkモデルのターゲットハードウェア実行
構築したSimulinkモデルからはSimulink CoderやEmbedded Coderを使ってC/C++コード生成、HDL Coderを使ってHDLコード生成を行い、プロセッサやFPGA/ASICに実装することができます。しかし、オプションツールが無くてもSimulinkの標準機能だけで、プロセッサが搭載された廉価ボードをターゲットとして実装することが出来ます。
この機能は「RoTH(Run on Target Hardware)」※1と呼ばれ、Simulinkモデルの設定とメニュー選択だけで、仮想上で行っていた処理を実機上で手軽に走らせることができます。RoTHは、その手軽さ故に簡単な実機でのプロトタイピングや、大学での学生実験などに使うことが出来ると思います。またStudent Version※2も対応していますので、学生が自習用に活用することも出来ます。
※1:RoTH(Run on Target Hardware)
Simulink標準機能で新たに提供し始めたWindows上の組み込みサポート機能のことを指します。Arduino、Raspberry Pi、 LEGO MINDSTORMS NXT、BeagleBoard、PandaBoardなど低価格ハードウェアに実装を行う機能で、アルゴリズム開発から組み込み実装の機能まで利用することが出来ます。
※2:Student Version
学生向けに9390円(大学生協組価)で販売されるStudent Versionは、MATLABとSimulinkに加え、制御システム、信号および画像処理、統計、最適化、および数式処理等の10の製品が含まれます。ハードウェア実装機能RoTH機能にも対応しています。
RoTH機能でArduino※3 Unoを使ってDCモータ制御を行ってみました。ターゲット・ボードを図に示します。ボードは、Arduino Uno、位置センサ(ポテンショメータ)を含むDCモータ(写真ではサーボモータのパッケージが接続されていますが、内蔵の制御回路は予め取り除いてあり、ポテンショメータの端子を引き出してあります)、モータドライバIC(TI SN754410)で構成されています。
Arduino Unoのアナログ入力にはモータ軸に接続されたポテンショメータが接続されており、回転角に応じた電圧値が取得されます。また、ディジタル出力端子はドライバICを介してDCモータに接続されています。このディジタル出力端子はPWM(パルス幅変調)により、アナログ電圧を出力できるようになっており、これでDCモータを駆動します。
次にモデルの構成ですが、「Simulinkを使ったシミュレーション例」で紹介したモータ制御モデルから、コントローラ部分のサブシステムを抽出し、入出力用のブロックを接続してあります。Sine Waveブロックで振幅0~180のSin波信号を生成し、モータの回転角をコントローラの目標値として入力しています。フィードバック信号にはアナログ入力から電圧値を取得するAnalog Inputブロック、出力にはデジタル出力端子からPWM信号を出力するPWMブロックが接続されており、フィードバック制御を行う構成となっています。
なお、これらのデバイスドライバブロックは、対応ボードごとに無償でダウンロードして追加インストールして使用することができます。RoTHでArduino用に提供されているライブラリを示します。Digital/Analog Input/Output, Serial Transmit/Receive, Servo Read/Writeといったブロックが提供されています。
モデルが完成したら[ツール]メニューから[ターゲットハードウェアで実行]⇒[実行]を選択すると、ビルドが行われてボードに実装され、モータが動き始めます。
C言語などのプログラミング言語を記述せずに、Simulinkモデルで記述した制御アルゴリズムをマイコンに実装することができました。
※3:Arduino
ArduinoはAtmelのマイコンが搭載されたボード・シリーズです。ボードは非常に安価で2,500円程度から販売されており、開発環境もフリーで入手できるという初心者でも導入障壁が小さい組み込み開発システムです。
著者紹介
松本 充史(まつもと あつし)
MathWorks Japan
アプリケーションエンジニアリング部
シニアアプリケーションエンジニア
Mathworks JapanではMATLABの中でも特に信号処理やコード生成に関する機能を担当している。
今回の記事で紹介しているMATLABコードやSimulinkモデルのファイルをご要望の方はこちら(marketing-jp@mathworks.co.jp @は小文字にしてください)までお問い合わせ下さい。