/FUNCT_PYTHON で荷重 /CLOAD の PID 制御を行う例題

概要

Radioss 2025 から /FUNCT_PYTHON という Python で定義できるカーブが追加されました。

https://help.altair.com/hwsolvers/rad/topics/solvers/rad/funct_python_starter_r.htm

時刻や節点の変位や速度、要素の応力など、さまざまな状態量を用いてカーブを設定できます。

作ったカーブは境界条件、荷重条件に適用できます。

Python を書ける(自分で調べられる), PID も分かる (自分で調べられる) 方を前提としています。これら自体については、本記事ではがっつりと割愛しています。

お題

このような 2本のばね要素を、特定の距離に保つように、力 /CLOAD を PID 制御したいと思います。イメージとしてはつっかえ棒で、隙間を広げるイメージです。作用・反作用の原則により、全く同じ大きさの力を逆向きに入れます。

左側が K=1.0 N/m, 右側が K=2.0N/m (単位はなんでもよいのですが) と、剛性が違うため、単純に均等に強制変位で押し広げると、力のつり合いがおかしくなります。ちなみに質量はどちらも 1.0kg です。

Radioss 側の設定は、2個の /CLOAD に対し同じカーブ (同じ大きさの力) を逆向きに作用させています。

問題を簡単に検証しやすくするために、X 軸の変位しかできなくしてあります。

制御のお題目としては、距離を 20m にすることです。最初の状態が 10m です。

PID 制御

PID には触れないと言いましたが、私はこのサイトで PID を学びましたので、サイトの紹介をさせていただきます。

Arduinoで行う簡易的なPID制御 | くろべこblog

今回は

  • 比例ゲイン Kp = 100
  • 微分ゲイン Kd = -2.2
  • 積分ゲイン Ki = 0

としたらうまくいきました。ちなみに、微分ゲイン、積分ゲイン、と来るなら、次は現在ゲイン、現状ゲインとかになるのではないかと思うのですが、なぜそこだけ比例ゲインと違う種類の名前がついたのだろうか、というのが制御素人目線の疑問です。

ベクトルと Python コードの関係の説明

今回は節点 2, 3 が対象です。

節点 2, 3 の座標ベクトルをそれぞれ X2, X3 とします。すると 2 から 3 に向かうベクトルは X3-X2 です。

距離 = ベクトルの大きさ = 自分自身の内積の平方根ですから、距離 D はこうなります。(numpy に専用の関数がありそうな気がするのですが、分かっていません)

そして本来ですと dD/dt の微分をするのですが、これを行おうとすると、そのサイクルでの値をどこかのファイルに保存しておいて、次のサイクルで呼び出して計算するということで、少しコードのレベルも上がるのですが、幸い(相対)距離 D の微分は相対速度ですので、特にサイクルをまたがずに評価できそうです。

節点 2, 3 の速度ベクトルを V2, V3 とすると、節点 2からみた 3 の相対速度は V3-V2 です。

この相対速度に、節点 2 から 3 に向かう、大きさ 1 のベクトルとの内積をとれば、相対速度の大きさが符号付で取得できます。近づこうとしていると負の値となり、離れようとしていると正の値となります。相対速度 V は先ほど出しておいた (相対) 距離 D などとともに、こうなります。

これで与えるべき力 F = Kp D + Kd V が求まります。

シミュレーション

オプションに -python を加えます。

結果はこのようになります。ばねに何も減衰がないので、振動し続けていますが、距離についてはうまいこと制御できています。

振動は、自動減衰 /ADYREL で止めてしまっても良いでしょう。

/ADYREL を付けると、こうなります。

モデルのダウンロード: /ADYREL 付のものだけ置いておきます。

注意事項

2025 Linux 版 /FUNCT_PYTHON は動作しません。Windows 版で動かしてみてください。

Tagged:

Comments

  • QinHe_321
    QinHe_321 Altair Community Member

    Can Radioss2024 use this? I only found Radioss 2024 in Hypermesh 2025.

    Thanks

    Qin

  • QinHe_321
    QinHe_321 Altair Community Member

    And in which line of .rad did you callout python functions?

    They are defined in .inc, but not used in .inc.

  • altair_fukuoka
    altair_fukuoka
    Altair Employee

    No, this is only Radioss 2025 and later. You need a text editor to create Radioss 2025 _0000.rad file.

    I am not sure about your 2nd question. Is your question, "What card uses the /FUNCT_PYTHON"? If true, the two /CLOAD cards do.

  • QinHe_321
    QinHe_321 Altair Community Member

    you mean funct_IDT with 1 below it uses the function No.1, which is

    #/FUNCT_PYTHON/1

    No.1 python function defined in .inc

    is this the right format to use the python function?

    And the return value will multiply Fscaley and generate force.

  • altair_fukuoka
    altair_fukuoka
    Altair Employee

    "#" line is a comment line. Please read only uncomment line.

    And this is a community site. Not a survice where Altair customer asks and Altair stuff answers. Everyone plays a leading role. Could you please test it and add the result, or writing a new page. Your help will enhance our community knowledge.