【Python】最小構成のMBD事例 第2章 その294【AsamMdf⑭】

【Python】最小構成のMBD事例 第2章 その294【AsamMdf⑭】 事例
【Python】最小構成のMBD事例 第2章 その294【AsamMdf⑭】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回、MDF生成に向けての構成変更を行った。
理由としては物理値変換の仕様をまんべんなく取り込むため。

というわけで、今回はMDF生成の物理値変換含んだシグナル生成の部分のコードを作成

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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

シグナル生成(10msサンプリング)

フクさん
フクさん

じゃ、まずは10msサンプリングのシグナル生成部分のコードを見せよう。

# 無変換のチャネル
sig_t10ms_sin = Signal(
    np.sin(t10ms),
    t10ms,
    name="t10ms_sin",
    unit="V",
    conversion=None,
    comment="t10ms_sin",
)
# y(t)=at+bの物理変換式のチャネル
conversion = {"a": 2, "b": -0.5}
sig_t10ms_Linear = Signal(
    t10ms,
    t10ms,
    name="t10ms_Linear",
    unit="rad",
    conversion=conversion,
    comment="t10ms_Linear",
)
# sin(t)の物理変換式のチャネル
conversion = {"formula": "sin(X)"}
sig_t10ms_LinearToSin = Signal(
    t10ms,
    t10ms,
    name="t10ms_LinearToSin",
    unit="rad/s",
    conversion=conversion,
    comment="t10ms_LinearToSin",
)
# tabular
conversion=dict()
conversion['raw_0']=1
conversion['raw_1']=5
conversion['raw_2']=8
conversion['phys_0']=10
conversion['phys_1']=30
conversion['phys_2']=60

sig_t10ms_table = Signal(
    t10ms,
    t10ms,
    name="t10ms_tabular",
    unit="rad/s",
    conversion=conversion,
    comment="t10ms_tabular",
)
# tabular(with interpolation)
conversion=dict()
conversion['raw_0']=1
conversion['raw_1']=5
conversion['raw_2']=8
conversion['phys_0']=10
conversion['phys_1']=30
conversion['phys_2']=60

conversion['interpolation']="0"
sig_t10ms_table_f = Signal(
    t10ms,
    t10ms,
    name="t10ms_tabular_inp",
    unit="rad/s",
    conversion=conversion,
    comment="t10ms_tabular_inp",
)

# value to text
conversion=dict()
conversion['val_0']=0
conversion['val_1']=1
conversion['val_2']=2
conversion['val_3']=3
conversion['val_4']=4
conversion['val_5']=5
conversion['text_0']='Neutral'
conversion['text_1']='1st'
conversion['text_2']='2nd'
conversion['text_3']='3rd'
conversion['text_4']='Top'
conversion['text_5']='OverTop'
conversion['default'] = 'default key'
sig_t10ms_value_to_text = Signal(
    t10ms,
    t10ms,
    name="t10ms_value_to_text",
    unit="",
    conversion=conversion,
    comment="t10ms_value_to_text",
)

# tabular with range
conversion=dict()
conversion['lower_0']=0
conversion['upper_0']=1.5
conversion['phys_0']=10
conversion['lower_1']=1.5
conversion['upper_1']=2.5
conversion['phys_1']=30
conversion['lower_2']=2.5
conversion['upper_2']=3.5
conversion['phys_2']=60
conversion['default'] = -1
sig_t10ms_tabular_with_range = Signal(
    t10ms,
    t10ms,
    name="t10ms_tabular_with_range",
    unit="",
    conversion=conversion,
    comment="t10ms_tabular_with_range",
)

# value range to text
conversion=dict()
conversion['lower_0']=0
conversion['upper_0']=0.5
conversion['text_0']='Neutral'
conversion['lower_1']=0.5
conversion['upper_1']=1.5
conversion['text_1']='1st'
conversion['lower_2']=1.5
conversion['upper_2']=2.5
conversion['text_2']='2nd'
conversion['lower_3']=2.5
conversion['upper_3']=3.5
conversion['text_3']='3rd'
conversion['lower_4']=3.5
conversion['upper_4']=4.5
conversion['text_4']='Top'
conversion['lower_5']=4.5
conversion['upper_5']=5.5
conversion['text_5']='OverTop'
sig_t10ms_value_range_to_text = Signal(
    t10ms,
    t10ms,
    name="t10ms_value_range_to_text",
    unit="",
    conversion=conversion,
    comment="t10ms_value_range_to_text",
)

シグナル生成(100msサンプリング)

フクさん
フクさん

次は100msサンプリングの方。

# 無変換のチャネル
sig_t100ms_sin = Signal(
    np.sin(t100ms),
    t100ms,
    name="t100ms_sin",
    unit="V",
    conversion=None,
    comment="t100ms_sin",
)
# y(t)=at+bの物理変換式のチャネル
conversion = {"a": 5, "b": -3}
sig_t100ms_Linear = Signal(
    t100ms,
    t100ms,
    name="t100ms_Linear",
    unit="rad",
    conversion=conversion,
    comment="t10ms_Linear",
)
# cos(t)の物理変換式のチャネル
conversion = {"formula": "cos(X)"}
sig_t100ms_LinearToCos = Signal(
    t100ms,
    t100ms,
    name="t100ms_LinearToCos",
    unit="rad/s",
    conversion=conversion,
    comment="t100ms_LinearToCos",
)
# cos(t)の物理変換式のチャネル
conversion = {"formula": "cos(X)"}
sig_t100ms_LinearToCos = Signal(
    t100ms,
    t100ms,
    name="t100ms_LinearToCos",
    unit="rad/s",
    conversion=conversion,
    comment="t100ms_LinearToCos",
)

コードを確認した感想

太郎くん
太郎くん

まぁ基本は10msサンプリングの方が重要ってことだね。

フクさん
フクさん

100msサンプリングの方は複数のDataGroupを定義してみるって目的で入れてるだけだしね。

太郎くん
太郎くん

とりあえず、シグナルの生成の仕方はわかったかな。

まとめ

フクさん
フクさん

まとめだよ。

  • シグナル生成の10msサンプリングと100msサンプリングの部分のコード作成。
    • 10msサンプリングの方に複雑さが寄ってる状態。
      • 各種物理値変換式のパターンを入れ込んでいるため。
    • 100msサンプリングはDataGroupを複数にするために入れている。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました