createModelメソッド
このモデルは、4つの力が作用する並進ジョイント上の1つのブロックで構成されています。この並進ジョイントの軸は、全体座標系のZ軸方向に平行です。4つの力のうちの1つは外乱による力です。残りの3つの力は、PIDコントローラを表します(これらの力を組み合わせて1つの力にすることはできますが、わかりやすいように3つの力に分割しています)。
def createModel(self):
"""
Create the model
"""
self.model = Model(output = "PID Controller Design")
units = Units()
grav = Accgrav()
# Ground Part
ground = Part(ground=True)
self.oxyz = oxyz = Marker(label="Global CS", body = ground)
# Reference Marker
self.rm = rm = Marker(body = ground, qp = [0,0,2])
# Design Variables
self.dv_kp = kp = Dv(label='Kp', b=self.kp, blimit=[0,1])
self.dv_ki = ki = Dv(label='Ki', b=self.ki, blimit=[0,1])
self.dv_kd = kd = Dv(label='Kd', b=self.kd, blimit=[0,1])
# Block
self.block = Part(
mass = self.mass ,
ip = [10,10,10],
qg = [0,0,2])
# Block cm
self.block.cm = cm = Marker (label='block cm', body=self.block),
block_geo = Box(cm=cm, x=1, y=1, z=1)
# Translational Joints
joint1 = Joint(type='TRANSLATIONAL', i=cm, j=oxyz)
# The Disturbance Force
expr = 'STEP(TIME, 10, {}, 10.1, 0)'.format(self.force_mag)
self.force = self.model.force = Sforce(
i = cm,
j = oxyz,
type = 'TRANSLATION',
function = expr,
)
# We add a PID controller on it
expr = '-DVAL({Kp})*VZ({I},{J})'.format(Kp=kp.id, I=cm.id, J=rm.id)
P_term = Sforce(
i = cm,
j = oxyz,
type = 'TRANSLATION',
function = expr,
)
expr = '-DVAL({Ki})*DZ({I},{J})'.format(Ki=ki.id, I=cm.id, J=rm.id)
I_term = Sforce(
i = cm,
j = oxyz,
type = 'TRANSLATION',
function = expr,
)
expr = '-DVAL({Kd})*ACCZ({I},{J})'.format(Kd=kd.id, I=cm.id, J=rm.id)
D_term = Sforce(
i = cm,
j = oxyz,
type = 'TRANSLATION',
function = expr,
)
return self.model