剛体がある軸周りに自転している時、自転軸を振り回すように外部から角速度が加わると、その角速度と自転軸の双方に対して直角に回転モーメントが発生します。この回転モーメントはジャイロモーメントと呼ばれています。学校の授業や科学博物館などで、回転台の上に乗って回転する自転車の車輪を傾けてジャイロモーメントを体験する実験を見たことがあるのではないでしょうか(動画を見る>>)。この実験を模擬する装置のシミュレーションモデルを作成してみましょう。
図1に示すような、ジャイロモーメント実験装置のシミュレーションモデルを作成します。ステージは地面に対して水平に摩擦無く回転します。ステージに固定された柱にはアームが取り付けられ、アームにはホイールが取り付けられています。ホイールはアームに対して一定の角速度で回転します。アームはステージに対して垂直平面内で回転し、アームの角度はモータで自由に変えることができるとします。
図2に、ジャイロモーメント実験装置のシミュレーションモデルの設計図を示します。図では、reference「Ref_Wheel_Spindle」をnode「Node_Wheel」から少しずらして描いてありますが、実際は同じ位置にあります。
便宜上、各nodeはそれぞれの部品の回転方向を z 方向として定義します。アームとステージの接続は、ジョイントの“spherical hinge”と“drive hinge”を併用して行います。spherical hingeで相対位置を拘束し、drive hingeで相対姿勢を拘束します。drive hingeについては以下で説明します。ところで、この場合、spherical hingeの代わりにrevolute hingeを用いてしまうと、過拘束になってしまうので注意が必要です。(ただし、revolute hingeとtotal jointの組み合わせであれば可能です。)
このジョイントは、2つのnodeの相対姿勢を拘束し(相対位置は拘束しない)、一方のnodeをもう一方のnodeに対して強制回転させることができます。強制回転の回転角はtemplate drive callerによって定義します。drive hingeの基本的なステートメントの型は次のようになります。
joint: <label>, drive hinge, <node 1>, hinge, <relative orientation matrix 1>, <node 2>, hinge, <relative orientation matrix 2>, <hinge orientation>;
ここで、<hinge orientation>には、template drive callerオブジェクトで強制回転の回転角を定義します。
本例題では、このdrive hingeによって、アームの角度を変化させるモータを表現します。
アーム角の入力は自由に行いたいので、drive hingeの<hinge orientation>入力には“scalar function drive”を用いることにします。scalar function driveは、任意のscalar functionを入力することができるdrive callerです。scalar function driveの型は次のようになります。
scalar function, "<scalar function name>", <scalar function definition>
では、アーム角の入力を図3のグラフに示すように行いたいと仮定しましょう。図3のグラフの関数は区分線形の関数なので、“multilinear”というscalar functionを用いて定義することができます。
scalar function driveで図3のグラフの関数の入力を行うdrive hingeの定義は次のようになります。template drive callerのsingleを用いて、「Node_Arm」のz軸周りにscalar function driveで強制変位を与えていることに注目してください。入力ファイルでは角度の単位がradianであることに注意しましょう。
set: integer JoDrivh_Stage_Arm = 3; joint: JoDrivh_Stage_Arm, drive hinge, Node_Stage, hinge, euler, -pi/2., 0., 0., # relative axis orientation Node_Arm, hinge, eye, # relative axis orientation single, 0., 0., 1., scalar function, "Fun_Arm_Input", # position multilinear, 0.0, 0., 0.5, 0., 1.0, pi/4., 1.5, pi/4., 2.0, pi/2., 2.5, pi/2., 3.0, pi/4., 3.5, pi/4., 4.0, 0, 4.5, 0, 5.0, -pi/4., 5.5, -pi/4., 6.0, -pi/2., 6.5, -pi/2., 7.0, -pi/4., 7.5, -pi/4., 8.0, 0., 8.5, 0.;
以上を踏まえて作成した、例題7のジャイロモーメント実験装置の解析を行うための入力ファイルを以下のコード1に示します。
# gyro_moment.mbd #----------------------------------------------------------------------------- # [Data Block] begin: data; problem: initial value; end: data; #----------------------------------------------------------------------------- # [<Problem> Block] begin: initial value; initial time: 0.; final time: 8.5; time step: 1.e-3; max iterations: 10; tolerance: 1.e-6; end: initial value; #----------------------------------------------------------------------------- # [Control Data Block] begin: control data; output frequency: 10; structural nodes: 3; rigid bodies: 3; joints: 4; end: control data; #----------------------------------------------------------------------------- # Design Variables set: real I_Stage = 0.1; #[kg m^2] Moment of Inertia of Stage set: real M_Wheel = 3.; #[kg] Mass of Wheel set: real R_Wheel = 0.4; #[m] Radius of Wheel set: real H_Arm = 1.; #[m] Height of Arm set: real L_Arm = 0.6; #[m] Length of Arm set: real W_Wheel = 10*pi; #[rad/s] Angular Velocity of Wheel #----------------------------------------------------------------------------- # Reference Labels set: integer Ref_Wheel_Spindle = 1; # Node Labels set: integer Node_Stage = 1; set: integer Node_Arm = 2; set: integer Node_Wheel = 3; # Body Labels set: integer Body_Stage = 1; set: integer Body_Arm = 2; set: integer Body_Wheel = 3; # Joint Labels set: integer JoRevp_Stage = 1; set: integer JoSphh_Stage_Arm = 2; set: integer JoDrivh_Stage_Arm = 3; set: integer JoRevh_Arm_Wheel = 4; #----------------------------------------------------------------------------- # Intermediate Variables set: real Ixx_Wheel = M_Wheel*R_Wheel^2./4.; set: real Iyy_Wheel = M_Wheel*R_Wheel^2./4.; set: real Izz_Wheel = M_Wheel*R_Wheel^2./2.; #----------------------------------------------------------------------------- # References reference: Ref_Wheel_Spindle, 0., L_Arm, H_Arm, # absolute position euler, 0., pi/2., 0., # absolute orientation null, # absolute velocity null; # absolute angular velocity #----------------------------------------------------------------------------- # [Nodes Block] begin: nodes; #----------------------------------------------------------------------------- # Nodes structural: Node_Stage, dynamic, null, # absolute position eye, # absolute orientation null, # absolute velocity null; # absolute angular velocity structural: Node_Arm, dynamic, 0., 0., H_Arm, # absolute position euler, -pi/2., 0., 0., # absolute orientation null, # absolute velocity null; # absolute angular velocity structural: Node_Wheel, dynamic, reference, Ref_Wheel_Spindle, null, # absolute position reference, Ref_Wheel_Spindle, eye, # absolute orientation reference, Ref_Wheel_Spindle, null, # absolute velocity reference, Ref_Wheel_Spindle, 0., 0., -W_Wheel; # absolute angular velocity end: nodes; #----------------------------------------------------------------------------- # [Elements Block] begin: elements; #----------------------------------------------------------------------------- # Bodies body: Body_Stage, Node_Stage, 1., # mass null, # relative center of mass diag, 1., 1., I_Stage; # inertia matrix body: Body_Arm, Node_Arm, 1., # mass null, # relative center of mass diag, 1.e-6, 1.e-6, 1.e-6; # inertia matrix body: Body_Wheel, Node_Wheel, M_Wheel, # mass null, # relative center of mass diag, Ixx_Wheel, Iyy_Wheel, Izz_Wheel; # inertia matrix #----------------------------------------------------------------------------- # Joints joint: JoRevp_Stage, revolute pin, Node_Stage, null, # relative offset null; # absolute pin position joint: JoSphh_Stage_Arm, spherical hinge, Node_Stage, 0., 0., H_Arm, # relative offset Node_Arm, null; # relative offset joint: JoDrivh_Stage_Arm, drive hinge, Node_Stage, hinge, euler, -pi/2., 0., 0., # relative axis orientation Node_Arm, hinge, eye, # relative axis orientation single, 0., 0., 1., scalar function, "Fun_Arm_Input", # position multilinear, 0.0, 0., 0.5, 0., 1.0, pi/4., 1.5, pi/4., 2.0, pi/2., 2.5, pi/2., 3.0, pi/4., 3.5, pi/4., 4.0, 0, 4.5, 0, 5.0, -pi/4., 5.5, -pi/4., 6.0, -pi/2., 6.5, -pi/2., 7.0, -pi/4., 7.5, -pi/4., 8.0, 0., 8.5, 0.; joint: JoRevh_Arm_Wheel, revolute hinge, Node_Arm, reference, Ref_Wheel_Spindle, null, # relative offset hinge, reference, Ref_Wheel_Spindle, eye, # relative axis orientation Node_Wheel, reference, Ref_Wheel_Spindle, null, # relative offset hinge, reference, Ref_Wheel_Spindle, eye; # relative axis orientation end: elements;
コード1の入力ファイルによる、シミュレーション結果のアニメーションを動画1に示します。
シミュレーション結果より、ステージの角速度と角加速度のプロットを図4に示します。アーム角が変化する時(図3参照)、ジャイロモーメントが発生し、ステージに角加速度が生じます。アーム角が±90度に近づくに従って、ステージに生じる角加速度が小さくなります。これは、ジャイロモーメントベクトルが水平方向に近づき、その鉛直方向成分が減少するためです。