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


概要
Radioss 2025 から /FUNCT_PYTHON という Python で定義できるカーブが追加されました。
時刻や節点の変位や速度、要素の応力など、さまざまな状態量を用いてカーブを設定できます。
作ったカーブは境界条件、荷重条件に適用できます。
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 版で動かしてみてください。
Comments
-
Can Radioss2024 use this? I only found Radioss 2024 in Hypermesh 2025.
Thanks
Qin
0 -
And in which line of .rad did you callout python functions?
They are defined in .inc, but not used in .inc.
0 -
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.
0 -
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.
0 -
"#" 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.0