バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
FMULibrary経由で内部パラメータを変更する方法は大体わかってきた。
fmi2_import_set_realを使用して、modelDescription.xmlに記載されているvalueReferenceを指定すれば狙ったパラメータが変更できそうである。
今回は実際にパラメータ変更をするコードを確認してみる。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
修正コードは出来たか?
fmi2_import_cs_testを修正して、FMUの内部パラメータを変更できるコードを用意するって言ってたけど。
できた?
一応できたよ。
まぁある程度汎用性を確保するためそこそこ前回提示したコードに付け足しした感じにはなったけど。
ほー。
じゃー、見せてもらおう。
(なぜ、そんな偉そうな態度になってるんだ?)
修正コード
コードの追加部分は
fmi2_import_enter_initialization_mode
と
fmi2_import_exit_initialization_mode
を呼び出しているところの間に入れる。
イニシャルモード中ってやつだね。
こんな感じのコードになる。
const fmi2_value_reference_t vrTmp[] = { 0,1,2,3,};
fmi2_real_t iniTmp[sizeof(vrTmp) / sizeof(vrTmp[0])];
fmistatus = fmi2_import_get_real(fmu, vrTmp, sizeof(vrTmp) / sizeof(vrTmp[0]), iniTmp);
if (fmistatus != fmi2_status_ok) {
printf("fmi2_import_set_real failed.err code=%d\n", fmistatus);
do_exit(CTEST_RETURN_FAIL);
}
printf("Initial Parameters.\n");
for (k = 0; k < sizeof(vrTmp) / sizeof(vrTmp[0]); k++) {
printf("vr:%d,iniTmp is %lf\n", vrTmp[k], iniTmp[k]);
}
iniTmp[0] = 2.0;
fmistatus = fmi2_import_set_real(fmu, vrTmp, sizeof(vrTmp) / sizeof(vrTmp[0]), iniTmp);
if (fmistatus != fmi2_status_ok) {
printf("fmi2_import_set_real failed.err code=%d\n", fmistatus);
do_exit(CTEST_RETURN_FAIL);
}
printf("Modified parameters.\n");
for (k = 0; k < sizeof(vrTmp) / sizeof(vrTmp[0]); k++) {
printf("vr:%d,iniTmp is %lf\n", vrTmp[k], iniTmp[k]);
}
修正コード解説
予想以上にいろいろ追加してるなー。
まぁそんなに複雑はことはしていない。
まず以下で使用するvalueReferenceを定義する。
ここでは0,1,2,3の4つで、
- HIGHT:ボールの初期の高さ\([m]\)
- HIGHT_SPEED:ボールの初速度\([m/s]\)
- BOUNCE_COF:ボールの反発係数
- HIGHT_ACC:ボールの初期加速度\([m/s^2]\)
const fmi2_value_reference_t vrTmp[] = { 0,1,2,3,};
そしてfmi2_import_get_realでFMU内部で設定されてる初期値を取得して、printfで表示。
iniTmpに値が格納されるので、
valueReference=0のHIGHTを\(1[m]\)から\(2[m]\)に変更
iniTmp[0] = 2.0;
そして、iniTmpをfmi2_import_set_realで書き戻す。
って感じで説明としては以上だ。
一応、読み出しもしてたわけね。
しかも配列で一気に取得と設定ができるのか。
一個ずつ制御するのかと思ってた。
ここらへんの考え方は数値解析ツール由来のベクトルの性質が強いね。
渡せるパラメータはベクトルで一気に渡すって文化だ。
MATLABとかもそんな感じだよね。
次回はこれを実際に動かしてみよう。
まとめ
まとめだよ。
- 修正コードができたので確認。
- 内容の詳細説明。
- 読み出すvalueReference群の定義。
- fmi2_import_get_realで一気に読み出し。
- ボールの初期の高さだけ変更。
- fmi2_import_set_realで一気に書き戻し。
- 数値解析ツール由来のベクトルで一気に制御する方式になっている。
バックナンバーはこちら。
コメント