/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:

Welcome!

It looks like you're new here. Sign in or register to get started.

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.

Welcome!

It looks like you're new here. Sign in or register to get started.

Welcome!

It looks like you're new here. Sign in or register to get started.