接触時の摩擦係数を垂直荷重の関数とするユーザーサブルーチン
Overview
機構解析Altair MotionSolveにて摩擦のある接触計算を行えますが、標準機能では、摩擦力は垂直荷重×摩擦係数となり、垂直荷重が大きくなると摩擦力も大きくなります。
今回は、摩擦係数を垂直荷重の関数とするユーザーサブルーチンを作成することで、垂直荷重が大きくなった場合に摩擦力が小さくなる現象を表してみたいと思います。MotionSolveはC++、Fortranのほか、Matlab、Python、Altair Composeでユーザサブルーチンが記述可能です。今回はPythonで記述してみます。
結果、下記のように、垂直荷重を100Nから200Nと大きくした場合に摩擦力が10Nから2Nに低下する現象を再現できました。
Pre-Requisite
本記事で使用したモデルとユーザーサブルーチンはこちらよりダウンロードいただけます。
Pythonユーザサブルーチンを用いたチュートリアルは下記があります。
MV-1023: Use Python Subroutines in MotionView Model Building (altair.com) (最新:英語)
MV-1023:MotionViewモデル構築でのPythonサブルーチンの使用 (altair.com) (v2022:日本語)
Usage/Installation Instructions
ベースモデル
ベースモデルをms_contact_fric_sub_base.mdlとします。
先端が球の棒にZ方向に荷重を与えて板に接触させた状態で、X方向に往復運動させて摩擦を発生させるモデルです。
Z方向にはForceで-100Nの荷重を与えています。
また、X方向にはMotionで振幅50mm、1Hzのサイン波での強制変位を与えています。
接触摩擦のユーザサブルーチン
接触の摩擦力をユーザサブルーチンで定義しています。
別途テキストファイルCFFSUB_base.pyで摩擦力をPythonで下記のように記述しています。摩擦係数と遷移速度はMotionViewで指定した値を参照しています。
MotionView上でUser expr:を`USER(0.1,0.15)`と定義していますので、par[0]=0.1、par[1]=0.15となります。パラメータは2以上でも同様に引き渡せます。
Pythonの場合ヘルプCFFSUB (altair.com) にサンプルコードがありますので、それをベースに修正いただくと簡単です。
ベースモデルでは、遷移速度を超えると一定の摩擦係数となる単純な動摩擦モデルです。ユーザーサブルーチンを使わなくても標準機能で再現できるモデルですが、動作確認用です。
import math def CFFSUB(id, time, par, npar, loci, locj, x, xdot, nforce, dflag, iflag): result = [0,0,0] mu_dyn = float(par[0]) vd = float(par[1]) v = math.sqrt(xdot[0]*xdot[0]+xdot[1]*xdot[1])+0.001 mu = 0.0 if v>=vd: mu = mu_dyn else: [mu, errflg] = py_step(v, -vd, -mu_dyn, vd, mu_dyn,0) result[0] = -mu*(nforce)*xdot[0]/v result[1] = -mu*(nforce)*xdot[1]/v return result
ベースモデルの動作確認
垂直荷重、摩擦力、X速度の3つのグラフを示します。
いまは動摩擦係数を0.1としていますので、垂直荷重100N×0.1=10Nの摩擦力が速度の方向に発生していることがわかります。
摩擦係数の関数化
では、次に摩擦係数が一定でなく、垂直荷重に応じて変化するモデルを実装してみます。
まずはユーザーサブルーチンを以下のように書き換えました(CFFSUB.py)。
摩擦係数を2種類(mu_dyn1とmu_dyn2)用意し、遷移荷重fdで切り替わる実装をしました。
具体的には、fd~1.01fdにかけてSTEP関数でmu_dyn1~mu_dyn2へ滑らかに変化させています。
import math def CFFSUB(id, time, par, npar, loci, locj, x, xdot, nforce, dflag, iflag): result = [0,0,0] mu_dyn1 = float(par[0]) mu_dyn2 = float(par[1]) vd = float(par[2]) fd = float(par[3]) v = math.sqrt(xdot[0]*xdot[0]+xdot[1]*xdot[1])+0.001 [mu_dyn, errflg] = py_step(nforce, fd, mu_dyn1, fd*1.01, mu_dyn2,0) mu = 0.0 if v>=vd: mu = mu_dyn else: [mu, errflg] = py_step(v, -vd, -mu_dyn, vd, mu_dyn,0) result[0] = -mu*(nforce)*xdot[0]/v result[1] = -mu*(nforce)*xdot[1]/v return result
合わせて、MotionViewのモデルを変更しています(ms_contact_fric_sub.mdl)。
Pythonファイルを記述を変更したものに差し替えています。
また、Pythonへ引き渡すパラメータを`USER(0.1,0.01,0.15,150)`としています。垂直荷重150以下では摩擦係数が0.1、150以上では摩擦係数が0.01に低下する設定です。
合わせて垂直荷重を0~2.5secは100N、2.5sec以降は200Nと摩擦係数の変化を確認するため、垂直荷重を変化させています。
摩擦係数変化モデルの動作確認
ベースと同様に垂直荷重、摩擦力、X速度の3つのグラフを示します。
垂直荷重100Nの場合は、100×0.1=10Nの摩擦力が速度の方向に発生し、垂直荷重が200Nと大きくなると、摩擦係数が0.01に低下し、200×0.01=2Nの摩擦力が発生していることがわかります。
Post-Requisite
使用製品:Altair MotionSolve/MotionView
よくあるエンジニアからの質問はこちら