接触時の摩擦係数を垂直荷重の関数とするユーザーサブルーチン

Kosuke_IKEDA
Kosuke_IKEDA
Altair Employee
edited September 2023 in Altair Exchange

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方向に往復運動させて摩擦を発生させるモデルです。

image

Z方向にはForceで-100Nの荷重を与えています。

また、X方向にはMotionで振幅50mm、1Hzのサイン波での強制変位を与えています。

imageimage

 

接触摩擦のユーザサブルーチン

接触の摩擦力をユーザサブルーチンで定義しています。

image

別途テキストファイル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の摩擦力が速度の方向に発生していることがわかります。

image

 

摩擦係数の関数化

では、次に摩擦係数が一定でなく、垂直荷重に応じて変化するモデルを実装してみます。

まずはユーザーサブルーチンを以下のように書き換えました(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に低下する設定です。

image

合わせて垂直荷重を0~2.5secは100N、2.5sec以降は200Nと摩擦係数の変化を確認するため、垂直荷重を変化させています。

image

 

摩擦係数変化モデルの動作確認

ベースと同様に垂直荷重、摩擦力、X速度の3つのグラフを示します。

垂直荷重100Nの場合は、100×0.1=10Nの摩擦力が速度の方向に発生し、垂直荷重が200Nと大きくなると、摩擦係数が0.01に低下し、200×0.01=2Nの摩擦力が発生していることがわかります。

image

 

Post-Requisite

使用製品:Altair MotionSolve/MotionView

よくあるエンジニアからの質問はこちら