QuarterCar_微分方程式+機械力学/動力学の定番例題

 本記事は この記事 を大幅改訂,チュートリアル記事化したもの.
 例題は機械力学/動力学で初めに定番として取り扱われるものであり,目的は下記.
  • 評価目的に応じて,シミュレーションに含める現象を絞り,簡略化する手順を学ぶ.
  • 機械力学の振動現象を1Dモデルに置換えて捉える手順を学ぶ.
  • Modelica Standard LibraryのMechanics.Translationalの使い方の基礎を学ぶ.
  •  過渡応答を含む,多階微分方程式の問題を解くことになる.

手書きスケッチと作成対象物の整理

 モデリング対象は自動車の運動.その中でも,路面状態が変化(段差など)した際の車体の運動を予測する.
 自動車はタイヤを介して地面と接触している,そして,そのタイヤは弾力を持ち,また理想バネと異なり,抵抗による運動の減衰も伴う.
 さらに,タイヤと車体の間にはサスペンションと呼ばれる,タイヤからの力を受け止め,車体に伝わる衝撃を弱める機構が入っている.バネと運動エネルギを減衰させるダンパーから成る.
  

  
 これを,機能・現象に分解して抽象的な図に置き換えると下図のようになる.
 タイヤを質点,車体を前後に質量を分配した質点とピッチ方向の回転慣性を持つ剛体に置き換え,サスペンションとタイヤは共にバネとダンパを並列に繫いだもので代表する.
 そして,タイヤの下側が境界条件であり,変位(=路面の鉛直方向の変化)を入力する.
*工学書の例題では,タイヤはバネのみで代表されている事が多い.
*下図ではModelica Standard Libraryの区分けに合わせて敢えて車体を上下直線運動をする2つの質点とピッチ運動をする回転剛体に分けたが,殆どの例題では車体を質量と回転慣性を併せもつ1つの剛体で代表させている事が一般的である.
  

  
 そして,今回はそこから更に簡略化を進め,ピッチ運動を無視して車両の鉛直方向の動きだけに注目する.
 従って,車体とタイヤはそれぞれ1つの質点のみに置き換え,サスペンションとタイヤのバネ・ダンパもそれぞれ1つずつで代表する.すると,機能だけを表すよう抽象化されたモデルは下図のようになる.
  
 上記のモデル化を受け,モデルに内包させる物理現象,ものの機能,境界条件(システムへの入力),解析後に注視する出力をまとめる.

model(とpackage)ファイルの作成

 この連載の各記事でも述べているように、必須ではないが、利便性のために演習例題用のpackageは作成することを奨励する。過去記事の例で既に作成済みなら、そのpackageにmodelを作成すればOK。

コンポーネントの配置

 下図の通りにコンポーネントを配置、接続する。
 Modelica Standard Library内の1次元併進運動ライブラリを使う.
 インスタンス名はコンポーネントを配置する際に自動で命名される(標準設定では名前を尋ねるウィンドウが出てくる)が、筆者は適宜、名前をつけた方が後々判りやすいものには命名している。下図のものだと解りにくければ、解りやすいように名前を変えてくれて構わない。

 diagramは前項の概念図と同じで,質量コンポーネントと,バネ・ダンパのセットが直列に連なっているだけである.下端には変位を与える境界条件コンポーネントと信号を出力するsourceコンポーネントを配置する.
 step信号コンポーネントの上に2つsourceコンポーネントを置いているが,これらはrampと台形信号を生成するもの.後ほど,境界条件コンポーネントに接続する信号コンポーネントをこれらに入れ替えた計算も実施する.規模が大きく,コンパイルに時間を要するモデルであれば,コンパイル後のparameter設定で3つのsourceのどの信号を境界条件コンポーネントに入力するかを切り替えできるようにしておく事が望ましい.しかし本例題のモデルはコンパイルはごく短時間で完了するので,入力信号の切り替えはdiagramの繋ぎ変えで行う.(プログラミングであればソースコードの書き換えにあたる改変をこのように手軽に行えるのはGUI上でモデルを組み立てる解析プラットフォームの便利な点.)

    使用コンポーネントリスト

     必要なコンポーネントを見つけるのは慣れていないと意外と苦労する作業なので、総てのコンポーネントをリストアップしておく。概要についてはこのページを随時更新していくのでそちらを参照されたい.
    1. Modelica.Mechanics.Translational.Sources.Position
    2.   
    3. Modelica.Mechanics.Translational.Components.Mass
    4.   
    5. Modelica.Mechanics.Translational.Components.SpringDamper
    6.   
    7. Modelica.Blocks.Sources.Ramp
    8.   
    9. Modelica.Blocks.Sources.Step
    10.   
    11. Modelica.Blocks.Sources.Trapezoid
    12.   

parameterの設定

 各コンポーネントのparameter設定を示す。コンポーネントを右クリックしてparametersを選択するか、ダブルクリックするとparametersウィンドウが現れるので、必要箇所に値を設定する。
 尚、デフォルト設定のままにしておいて済むコンポーネント、parameterは記載を省略する。また、parameterの意味もparameterウィンドウ上の記載から意味が理解可能なものは省略/簡潔に済ます。
  1. massCarBody
    1.   
    2. Parameters, m: 240 [kg]
    3. Parameters, L: 0.1 [m]
    4. Initialization, s.start: massTire.L+massCarBody.L/2+0.05 [m]
  2. Suspension
    • Generalタブ
      1.   
      2. Parameters, c: 1.6*10^4 [N/m]
      3. Paramerers, d: 98 [N*s/m]
      4. Paramerers, s_rel0: 0.05 [m]
    • Advancedタブ
      1.   
      2. Parameters, stateSelect: StateSelect.default
  3. massTire
    1.   
    2. Parameters, m: 36 [kg]
    3. Parameters, L: 0.1 [m]
    4. Initialization, s.start: massTire.L/2 [m]
  4. tire
    • Generalタブ
      1.   
      2. Parameters, c: 1.6*10^4 [N/m]
      3. Parameters, d: 5 [N*s/m]
      4. Parameters, s_rel0: 0 [m]
    • Advancedタブ
      1.   
      2. Parameters, stateSelect: StateSelect.default
  5. roadSurface
    1.   
    2. Parameters, exact: true
  6. road_step
    1.   
    2. height: 0.05
    3. offset: 0
    4. startTime: 10 [s]
  7. road_ramp
    1.   
    2. height: 0.5
    3. duration: 10 [s]
    4. offset: 0
    5. startTime: 10 [s]
  8. road_trapezoid
    1.   
    2. amplitude: 0.05
    3. rising: 0.01 [s]
    4. width: 0.05 [s]
    5. falling: 0.01 [s]
    6. period: 10 [s]
    7. nperiod: 1
    8. offset: 0
    9. startTime: 10 [s]

ソースコード

 上記までを行うとOpenModelicaがソースコードを自動生成してくれている。エラーが生じた場合の比較のために、本モデルの完成状態のソースコードを示す。

    完成状態のソースコード(チェック用)

     コンパイルエラーや、計算結果が意図通りのものとならないような場合に比較・チェック用に参照して欲しい。尚、annotation()の部分はGUI上の配置位置や向きで値が変わるものなので、比較する必要は無い。
    ——————————————————————————-
    model quarterCar
      extends Modelica.Icons.Example;
      //-----
      Modelica.Mechanics.Translational.Components.Mass massTire(L = 0.1, a(fixed = false), m = 36, s(start = massTire.L / 2), v(fixed = false)) annotation(
        Placement(visible = true, transformation(origin = {50, 10}, extent = {{-10, -10}, {10, 10}}, rotation = 90)));
      Modelica.Mechanics.Translational.Components.SpringDamper tire(c = 1.6*10^5, d = 5, s_rel(start = 0.0), s_rel0 = 0, stateSelect = StateSelect.default, v_rel(fixed = false)) annotation(
        Placement(visible = true, transformation(origin = {50, -20}, extent = {{-10, -10}, {10, 10}}, rotation = 90)));
      Modelica.Blocks.Sources.Step road_step(height = 0.05, offset = 0, startTime = 10) annotation(
        Placement(visible = true, transformation(origin = {-30, -70}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
      Modelica.Mechanics.Translational.Sources.Position roadSurface(exact = true, useSupport = false, v(fixed = false)) annotation(
        Placement(visible = true, transformation(origin = {30, -50}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
      Modelica.Mechanics.Translational.Components.Mass massCarBody(L = 0.10, a(fixed = false), m = 240, s(start = massTire.L + massCarBody.L / 2 + 0.05), v(fixed = false)) annotation(
        Placement(visible = true, transformation(origin = {50, 70}, extent = {{-10, -10}, {10, 10}}, rotation = 90)));
      Modelica.Mechanics.Translational.Components.SpringDamper Suspension(c = 1.6*10^4, d = 98, s_rel(start = 0.0), s_rel0 = 0.05, stateSelect = StateSelect.default, v_rel(fixed = false)) annotation(
        Placement(visible = true, transformation(origin = {50, 40}, extent = {{-10, -10}, {10, 10}}, rotation = 90)));
      Modelica.Blocks.Sources.Ramp road_ramp(duration = 10, height = 1, offset = 0, startTime = 10)  annotation(
        Placement(visible = true, transformation(origin = {-30, -30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
      Modelica.Blocks.Sources.Trapezoid road_trapezoid(amplitude = 0.05, falling = 0.01, nperiod = 1, period = 10, rising = 0.01, startTime = 10, width = 0.05)  annotation(
        Placement(visible = true, transformation(origin = {-30, 10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
    equation
      connect(Suspension.flange_b, massCarBody.flange_a) annotation(
        Line(points = {{50, 50}, {50, 50}, {50, 60}, {50, 60}}, color = {0, 127, 0}));
      connect(massTire.flange_b, Suspension.flange_a) annotation(
        Line(points = {{50, 20}, {50, 20}, {50, 30}, {50, 30}}, color = {0, 127, 0}));
      connect(tire.flange_b, massTire.flange_a) annotation(
        Line(points = {{50, -10}, {50, -10}, {50, -10}, {50, -10}, {50, 0}, {50, 0}, {50, 0}, {50, 0}}, color = {0, 127, 0}));
      connect(roadSurface.flange, tire.flange_a) annotation(
        Line(points = {{40, -50}, {50, -50}, {50, -30}}, color = {0, 127, 0}));
      connect(road_trapezoid.y, roadSurface.s_ref) annotation(
        Line(points = {{-18, 10}, {6, 10}, {6, -50}, {18, -50}}, color = {0, 0, 127}));
    equation
    
      annotation(
        uses(Modelica(version = "3.2.2")),
        experiment(StartTime = 0, StopTime = 60, Tolerance = 1e-06, Interval = 0.01),
        __OpenModelica_simulationFlags(lv = "LOG_STATS", s = "dassl"),
      Diagram);
    end quarterCar;
    
    ——————————————————————————-

シミュレーション実行&結果評価

 それでは、観たいvariableの値や動きを評価してゆこう。
 本連載はOpenModelicaでモデルを組む演習が主目的なので,詳しく結果を評価してゆくのは省略する。しかし,実用としてModelica,1DCAEを実物/試験を再現したり、設計予測に使えるようになったら、本来はこの段階の考察が最も重要かつ時間をかけるべきところであり,その点は憶えておいて頂きたい。
 *境界条件(路面位置)の入力の仕方で下記3通りのシミュレーションを実施する.
  • ステップ入力:段差に乗り上げて進む動作に相当.
  • ランプ入力:斜面を登る動作に相当
  • 台形入力:短時間に路面位置を上昇,下降させる.石のような突起物を踏み越える動作に相当.またインパルス入力の近似でもあり,応答は,システムが平衡から外れたところからどのように平衡状態へと向かうかを示す挙動の近似である.
 *今回はinputの確認表示はoutputと重ねて図示する.

    step入力(段差に乗り上げて進む動作)

      

    Output

    1. massCarBody.s: 車体重心の変位
    2.  *赤い線が路面の鉛直方向位置の時間変化,青い線が車体重心の時間変化.
        
    3. massCarBody.v: 車体重心の鉛直方向速度
    4.   
    5. massCarBody.a: 車体重心の鉛直方向加速度
    6.   
    7. massCarBody.a: 車体重心の鉛直方向加速度(過渡応答開始直後を拡大)
    8.   
    9. massTire.s: タイヤ重心変位
    10.  *赤い線が路面の鉛直方向位置の時間変化,青い線がタイヤ重心の時間変化.
        
    11. massTire.s: タイヤ重心変位(過渡応答開始直後を拡大)
    12.   
    13. massTire.v: タイヤ重心の鉛直方向速度
    14.   
    15. massTire.v: タイヤ重心の鉛直方向速度(過渡応答開始直後を拡大)
    16.   
    17. massTire.a: タイヤ重心の鉛直方向加速度
    18.   
    19. massTire.a: タイヤ重心の鉛直方向加速度(過渡応答開始直後を拡大)
    20.   

    ramp入力(斜面を登る動作)

      

    Output

    1. massCarBody.s: 車体重心の変位
    2.  *赤い線が路面の鉛直方向位置の時間変化,青い線が車体重心の時間変化.
        
    3. massCarBody.s: 車体重心の変位(過渡応答開始直後を拡大)
    4.   
    5. massCarBody.v: 車体重心の鉛直方向速度
    6.   
    7. massCarBody.a: 車体重心の鉛直方向加速度
    8.   
    9. massTire.s: タイヤ重心変位
    10.  *赤い線が路面の鉛直方向位置の時間変化,青い線がタイヤ重心の時間変化.
        
    11. massTire.s: タイヤ重心変位(過渡応答開始直後を拡大)
    12.   
    13. massTire.v: タイヤ重心の鉛直方向速度
    14.   
    15. massTire.v: タイヤ重心の鉛直方向速度(過渡応答開始直後を拡大)
    16.   
    17. massTire.a: タイヤ重心の鉛直方向加速度
    18.   
    19. massTire.a: タイヤ重心の鉛直方向加速度(過渡応答開始直後を拡大)
    20.   

    trapezoid入力(石のような突起物を踏み越える動作)

      

    Output

    1. massCarBody.s: 車体重心の変位
    2.  *赤い線が路面の鉛直方向位置の時間変化,青い線が車体重心の時間変化.
        
    3. massCarBody.v: 車体重心の鉛直方向速度
    4.   
    5. massCarBody.v: 車体重心の鉛直方向速度(過渡応答開始直後を拡大)
    6.   
    7. massCarBody.a: 車体重心の鉛直方向加速度
    8.   
    9. massCarBody.a: 車体重心の鉛直方向加速度(過渡応答開始直後を拡大)
    10.   
    11. massTire.s: タイヤ重心変位
    12.  *赤い線が路面の鉛直方向位置の時間変化,青い線がタイヤ重心の時間変化.
        
    13. massTire.s: タイヤ重心変位(過渡応答開始直後を拡大)
    14.   
    15. massTire.v: タイヤ重心の鉛直方向速度
    16.   
    17. massTire.v: タイヤ重心の鉛直方向速度(過渡応答開始直後を拡大)
    18.   
    19. massTire.a: タイヤ重心の鉛直方向加速度
    20.   
    21. massTire.a: タイヤ重心の鉛直方向加速度(過渡応答開始直後を拡大)
    22.   

自由課題

 一通りモデルの組み立て,計算実行を押さえたら,下記のように何か目的/目標をさだめ,モデルを使って設計変数(parameter)を変えてシミュレーションを実行するのを繰り返して演習する事を推奨する.それが設計解析であり,また,モデルを作るのは目的ではなく,それを使って何かの値を決める,評価することが本来の目的だ.
*”演習としてこんな問題設定を”との提示であり,具体的数値設定までは出さない.そこは自由に設定して取り組んでほしい.
  1. 高さxxの段差に乗り上げた際の車体の振動振幅を,xx秒以内に最大振幅のxx%未満に収束させる.また,鉛直方向の速度をxx m/sを超えさせないようにする.
  2. 鉛直変異率xx m/s で坂道を登る際の振動振幅をxx m 以内に抑える.
  3. 突起物を走破した際の鉛直方向加速度を,xx m/s2 未満に抑える.また,その加速度をxx s 以内に最大加速度のxx % 未満に減衰させる.
 上記のような目標/制約を設定した問題を,更に設計変数以外の固定値(車体・タイヤの重量のような,設計問題を解く上で設計者が自由に決めることはできない値)を変えて解いてみる事も推奨する.

例モデルに関する情報

例題出展情報:本例題は,内容は一般的なものであるが,質量やバネ定数などに下記の工学書に収録されていた例題を引用した.
    System Dynamics (2nd Edition);William J. Palm Ⅲ; McGrawHill; Chapter-5 problems #5.18 (p266)
 本記事で取り上げたモデルはgithubに公開しており、その情報を記しておく。ソースコードは本記事にも記載したが、直接OpenModelicaで読み込みたい方はダウンロードしてGPL3の範囲内で自由に使っていただいて構わない。
以上

コメント

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