WOLFRAM

外部データを使う

記録されたデータグラフィックス
リアルタイムの入出力

モデリングプロセスの間には外部データが使いたくなることもある.外部データは,センサーからのリアルタイムの入出力データだったり,記録された測定値だったり,場合によってはCADや画像のような外部ファイルだったりするだろう.このチュートリアルでは,モデルの中で外部データを使う方法について説明する.

このチュートリアルに使用されているモデル
CelsiusToFahrenheit | FreeFloating | ModelAndMeasurements

記録されたデータ

モデルには実験の測定値のように記録されたデータを加えることができる.これは,データフィッティングアプリケーションやプロセスの物理的なモデリングが難しいアプリケーション等では非常に一般的である.Model Centerで自分のデータをCombiTimeTableとして加えてコンパイルされたモデルに入力としてフィードしたり,Wolfram言語で書いた自分のSystemModelに加えたりできる.

CombiTimeTable

自分のエキスペリメントからのカスタムデータはCombiTimeTableコンポーネントを使って簡単にロードできる.このコンポーネントはModelica.Blocks.Sourcesパッケージにある.tableパラメータとして時間と値のペアの配列を指定する.必要に応じて出力を調整するために,時間のスケーリング,滑らかさ,外挿用にはさまざまなオプションがある.

以下で,モデルのパラメータを実験データに対してキャリブレートする.測定値はバネから吊り下げられた物質の高さを示しす.

1.gif

測定データ

測定値をモデルにするために空モデルにCombiTimeTableコンポーネントを加え,後でデータに簡単にアクセスできるようにコネクタが追加されている.

2.gif

CombiTimeTableタイプとRealOutputタイプのコンポーネントで作成されたMeasurementsモデル

elevationDataコンポーネントを選択して測定データを入力し,tableパラメータにデータを加える.

3.gif

CombiTimeTableコンポーネントのtableパラメータに測定データを加える

測定値はシステムに大きな損失があることを示しているので,システムのモデルには質量とバネに加えて減衰も含める必要がある.

4.gif

WorldFixedSpringDamperParallelBodyAbsolutePositionの各タイプのコンポーネントを使って作られたSpringOnMassモデル

モデルパラメータをキャリブレートするためには,測定値とSpringOnMassモデルの両方を含む新しいモデルを作成する.ModelAndMeasurementsに示されているように,パラメーターのキャリブレーションを便利にするためにキャリブレーション用に選択されたパラメーターをトップレベルに上げることができる.

5.gif

ModelAndMeasurementsモデルで設定されたパラメーター値を使用して測定値とシミュレーションの比較を示す進行中のキャリブレーション

関連事項:CombiTable1DvCombiTable2Ds,CreateDataSystemModelModelica CombiTimeTable

シミュレーション入力データ

記録されたデータをコンポーネントとして表すのではなくモデルから分離しておくことが望ましい場合がある.そのような場合はモデルへのトップレベルの入力を介して記録データを提供することが可能である.その場合の実験データは「シミュレーション入力データ」と呼ばれる.

以下ではこの手法を使用して摂氏から華氏へのコンバータに温度データを供給する.

最初のステップはモデルを作成することである.Modelicaライブラリのコンポーネントを次の方法で接続する(摂氏の温度データが提供される最上位のRealInputに注意のこと).

6.gif

RealInputGainConstantAddRealOutputの各タイプのコンポーネントを使って作成されたCelsiusToFahrenheitモデル

次に,モデルのシミュレーションを行う.これでモデルのコンパイルされたバージョンが作成され,接続されていないトップレベルの入力にデフォルトの定数ゼロ軌道が提供される.tempCtempFの結果をプロットする.

7.gif

トップレベル入力にデータをフィードせずにシミュレーションを行う

モデルにシミュレーション入力データを提供するためには,CombiTimeTable形式を使って摂氏温度の読取り値をテキストファイルに保存する.最初の列は時間,2番目の列は温度である.

#1
double tempC(6, 2)
0 5
5 20
10 25
20 25
30 15
40 10

次に,データをトップレベルの入力に接続する.

8.gif

エクスペリメントブラウザ入力変数データファイルセレクタを使う

再度シミュレーションを行う.プロットされる結果の変化に注意のこと.

9.gif

トップレベル入力にフィードされた記録済みデータを使ってシミュレーションを行う.

Wolfram言語では,シミュレーションの入力データはSystemModelSimulate"Inputs"オプションで与えられる.

リアルタイムの入出力

リアルタイムの接続性にはいくつかのアプリケーションがある.ループ内のコントローラアプリケーションあるいはループ内のハードウェアアプリケーションのためにこれを使うことができる.あるいは,センサーデータをプロットして現実世界のシステムを研究することもできる.このセクションでは,現実世界のアプリケーションとインタラクトするいくつかの方法を見てみる.

OPC

OPCUA Modelicaライブラリを使うとシミュレーションモデルを現実世界のアプリケーションに拡張することができる. オープンなOPC Unified Architectureの通信プロトコルを使えば,自分のシミュレーションでさまざまなプラットフォーム上のプロセスやハードウェアとインタラクトすることができる.OPC Classicサーバとの通信のためのOPCClassic ライブラリもあるが,このライブラリについては本チュートリアルでは詳述しない.

以下ではOPC UAプロトコルを使ったデータの読み書きについて示す.

必須事項:instructions in the library documentationに従ってOPCUAライブラリがロードされており,例題サーバが起動されていること

デモンストレーション用のモデルはシミュレーションからサーバへ信号を連続的に送信し,サーバからシミュレーションにこれを読み戻す.

10.gif

ExpSineWriteReadOPCUAServerのタイプのコンポーネントを使って作成されたExpSineOverOPCUAモデル

うまく通信できなければならないパラメータは,nodeIDnodeIDTypenodeNamespaceである.これらはデータの読み書きを行いたいサーバ上のノードを識別する.指定するノードはサーバ上に存在していなければならず,読み書き等の実行したい操作が行えるものでなければならない.expSine.fパラメータに値を与え,writeRealコンポーネントとreadRealコンポーネントを以下のように設定する.

writeRealコンポーネントの設定

readRealコンポーネントの設定

エクスペリメント設定で,Synchronize with real time(リアルタイムと同期)true に,Interval length(区間長)は0.1秒に設定し,モデルのシミュレーションを行って結果をプロットする.

ExpSineOverOPCUAモデルのエクスペリメント設定

14.gif

シミュレーションの結果はOPC UAサーバを迂回すると,0.2秒ごとに連続時間信号の更新された読取り値が与えられることを示している.

ModelPlug

Wolfram ModelPlugライブラリを使うと,Arduinoボード(またはFirmataプロトコルに従う他の任意のボード)を介して自分シミュレーションモデルを現実世界と繋ぐことができる.ModelPlugは,例えばボタン,スイッチ,入力センサ情報,あるいはモータ=やサーボなどのアクチュエータを介して自分のModelicaモデルでインタラクトするさまざまな方法を開く.

以下で,シミュレーションがArduinoボード上のLEDの点滅をどのように制御できるかを示す.

必須事項:ModelPlugライブラリがードされていること,Arduino IDE,Arduinoボード

まず,Firmataコードを自分のボードにアップロードすることでArduinoの準備を行う.このコードはArduino(v1.0.5以降)に例題の一部として含まれている.Arduino IDEを開いてFiles Examples Firmata StandardFirmataと進む(以下の図を参照のこと).sketchを開いてこれを自分のボードにアップロードする.

Arduino IDEでStandardFirmataの例を見付ける

この例題のモデルには3つのコンポーネントしかない.後はコンポーネントの設定だけである.

BooleanPulseDigitalOutputArduinoのタイプのコンポーネントを使って作られたBlinkLedモデル

値(例えば1秒)をbooleanPulse.periodパラメータに与え,arduinoコンポーネントとdigitalOutputコンポーネントを以下のように設定する.

arduinoコンポーネントの設定.Portパラメータの右にあるアイコンをクリックしてSerial Port Selector ウィンドウを開く

digitalOutputコンポーネントの設定.Arduinoボード上のLEDはピン13で制御される

このエクスペリメント設定で,Synchronize with real time(リアルタイムと同期)trueに,Interval length(区間長)を0.001秒に設定し,モデルのシミュレーションを行ってLEDの点滅を注視する.

BlinkLedモデルのエクスペリメント設定

より詳しくはModelPlugのGettingStartedドキュメントを読まれるとよいだろう.

グラフィックス

モデルの中にはアニメーション用のCADオブジェクトやアイコン用の画像のようにグラフィカルアセットが必要なものもある.このセクションでは,これらのタイプのアセットの使い方について説明する.

画像

アイコンを使うことでモデルを情報豊かにすることができる.描画ツールを使ってカスタムデザインを作成することも単純にアイコンビューに画像を加えることもできる(Modelica SpecificationはSVG,PNG,JPEG,BMPをサポートしている).

以下では,車種のモデルがアイコンによって強調されている.まず,車の既存の画像を見付けるかカメラまたは描画ツールで新たに作成するかしてみよう.

20.gif

車の画像

新たなモデルを作ってそのアイコンビューを開くことから始めよう.アイコンビューにアクセスできるのはModelerのユーザに限られるのでご了承いただきたい.

21.gif

角が丸い矩形とコンポーネント名のラベルだけのモデルの初期アイコン

アイコンビューにドラッグアンドドロップすることでアイコンに画像を加える.アイコン内の希望の部分を閉めるように位置やスケールを調整する.自動的に加えられた角が丸い矩形を除くことはできるが,アイコンに枠を付けるのは,特にコネクタがあるモデルの場合は一般に望ましいことである.

22.gif

最終的な車のモデルのアイコン

CAD形状

MultiBodyライブラリからのコンポーネントを使ってCADデータをBodyShapeBodyBoxFixedShape等のコンポーネントに添付できる.

以下では,蝶ナットの形状を使って剛体の動きのアニメーションを作成する.まず,Wolfram言語あるいは他の任意の CADツールを使って蝶ナットのCADモデルを作成することから始める.

23.gif

長ナットのCADモデル

まず,パッケージ構造の中のモデルを作る.例えばCADShapesというような名前の新たなパッケージを作り,FreeFloating という名のモデルをパッケージ内に作る.この場合のモデルは基本的にBodyShapeコンポーネントだけである.

24.gif

WorldBodyShapeのタイプのコンポーネントを使って作成されたFreeFloatingモデル

本体が自由に動くようにモデル化するために,worldコンポーネントのgravityTypeパラメータを変更して重力を無効にする.wingNutの質量を指定して,最終的なアニメーションがよりおもしろくなるように線形速度と角速度の両方を使ってその動きを初期化する.バンドルされているFreeFloatingモデルを参照することができる.

Save in directory structureバリアントを使ってパッケージを保存して,パッケージのトップレベルのディレクトリの「CADShapes」の下に「Resources」という新たなディレクトリを作る.「Resources」ディレクトリの「wingnut.stl」にCADファイルを保存する(外部リソースの適切な整理は本チュートリアルの範囲外である).

Model Centerに戻ってwingNutコンポーネントを選択し,CAD形状をこれに添付する.Modelica URIを使ってアニメーションタブのshapeTypeパラメータがCADファイルを指すようにする.

25.gif

Modelica URIを使ってCAD形状の場所を指定する

最後に,シミュレーションを行ってアニメーションウィンドウでそのシミュレーションを再生し,結果を見る.

26.gif

アニメーションウィンドウで回転する蝶ナットCAD形状

注意深い読者は,剛体の質量と慣性モーメントを正しくパラメータ化するための注意が払われていないことに気付くだろう.Wolfram言語関数CreateSystemModelは,CAD形状に基づいてそのような特性を自動的に計算するために使用でき,CAD形状のアニメーションに使用されるのと同じ座標系に関して特性が表現されることを保証するための堅牢なメカニズムを提供する.この手法は,ブログ投稿「Simulating Zero Gravity to Demonstrate the Dzhanibekov Effect and Other Surprising Physics Models」の蝶ナットやその他の形状に適用されている.