주요 콘텐츠

MATLAB에서 멀티바디 시스템 모델링하기

이 예제는 Simscape Multibody의 MATLAB 클래스를 사용하여 4절 링크 시스템을 모델링하는 방법을 보여줍니다. 이 예제에서는 길이가 각각 5cm, 8cm, 10cm, 12cm인 4개의 링크를 가진 크랭크-로커 메커니즘을 만듭니다.

클래스의 네임스페이스 이름을 입력할 필요가 없도록 import 함수를 사용하십시오.

import simscape.Value simscape.op.* simscape.multibody.*;

4절 링크 시스템 만들기

먼저, 4절 링크 시스템을 나타내는 simscape.multibody.Multibody 객체를 만들고, 객체의 이름을 fb로 지정합니다. Multibody 객체는 임의 유형의 컴포넌트 객체를 포함하는 계층적 컨테이너입니다. 각 컴포넌트 객체는 멀티바디 시스템의 일부 또는 서브시스템을 나타냅니다.

fb = Multibody
fb = 
  Multibody:

  No connectors.

  No components.

  No connections.

  Multibody with properties:

     ComponentNames: [0×1 string]
            Gravity: [0 0 -9.8066] (m/s^2)
        DoVisualize: 1
    FrameConnectors: [0×1 string]

이 객체는 비어 있으며 커넥터가 없습니다.

다음으로, 4절 링크 시스템을 위한 링크와 조인트를 만듭니다. 4절 링크 시스템의 각 링크는 2개의 엔드 프레임 커넥터와 바디 중심에 기준 프레임이 있는 강체입니다.

링크를 생성하려면 헬퍼 함수 link를 사용하십시오. 처음 2개의 인수는 링크의 길이와 색을 정의하며, 세 번째 인수는 로컬 기준 프레임에 커넥터를 추가할지 여부를 정의합니다. 세 번째 인수가 true이면 그 링크의 기준 프레임이 다른 프레임이나 컴포넌트에 연결할 수 있는 프레임 커넥터가 됩니다. 이 함수는 링크의 너비와 높이를 각각 2cm와 1cm로 설정하는 하드 코딩된 값을 사용합니다. MATLAB에서 링크를 생성하는 자세한 지침은 MATLAB에서 강체 모델링하기 항목을 참조하십시오.

먼저, 그림에 따라 각 링크의 길이와 색을 지정합니다. simscape.Value 객체와 요소를 3개 가진 [R G B] 벡터를 사용하여 각 링크의 길이와 색을 지정합니다.

bottomLength = Value(12,"cm");
topLength = Value(10,"cm");
leftLength = Value(5,"cm");
rightLength = Value(8,"cm");
bottomColor = [0 0 .8];
topColor = [1 .8 0];
leftColor = [.8 0 0];
rightColor = [0 .8 0];

모델을 열고, 지정된 링크 길이와 색을 사용하여 헬퍼 함수 link를 사용합니다. 4절 링크 시스템에서 하단 링크의 기준 프레임은 월드 프레임과 연결되므로, 이 기준 프레임은 프레임 커넥터여야 합니다. 하단 링크의 기준 프레임을 프레임 커넥터로 노출하기 위해, 하단 링크의 세 번째 인수를 true로 설정합니다.

Bottom_Link = link(bottomLength,bottomColor,true);
Top_Link = link(topLength,topColor,false);
Left_Link = link(leftLength,leftColor,false);
Right_Link = link(rightLength,rightColor,false);

생성된 링크를 addComponent 메서드를 사용하여 4절 링크 시스템에 추가합니다.

addComponent(fb,"Bottom_Link",Bottom_Link);
addComponent(fb,"Top_Link",Top_Link);
addComponent(fb,"Left_Link",Left_Link);
addComponent(fb,"Right_Link",Right_Link);

addComponent 메서드를 사용하여 월드 프레임을 4절 링크 시스템에 추가하고, connect 메서드를 사용하여 하단 링크의 기준 프레임을 월드 프레임에 연결합니다.

addComponent(fb,"World",WorldFrame);
connect(fb,"World/W","Bottom_Link/reference");

이 링크들을 4절 링크 시스템으로 조립하려면 4개의 회전 조인트를 사용합니다. 회전 조인트를 만들려면 클래스를 사용합니다. 각 위치에 따라 조인트의 이름을 지정하고 addComponent 메서드를 사용하여 조인트를 4절 링크 시스템에 추가합니다.

joint = RevoluteJoint;
addComponent(fb,"Bottom_Right_Joint",joint);
addComponent(fb,"Top_Left_Joint",joint);
addComponent(fb,"Top_Right_Joint",joint);
addComponent(fb,"Bottom_Left_Joint",joint);

connectVia 메서드를 통해 회전 조인트를 사용하여 링크를 연결합니다.

connectVia(fb,"Bottom_Left_Joint","Bottom_Link/neg_end","Left_Link/neg_end");
connectVia(fb,"Bottom_Right_Joint","Bottom_Link/pos_end","Right_Link/neg_end");
connectVia(fb,"Top_Left_Joint","Top_Link/neg_end","Left_Link/pos_end");
connectVia(fb,"Top_Right_Joint","Top_Link/pos_end","Right_Link/pos_end");

기본적으로 중력은 월드 프레임의 음의 z 방향에 맞춰집니다. 이 예제에서는 4절 링크 시스템이 월드 프레임의 X-Y 평면에서 움직이므로, 중력은 음의 y 방향에 맞춰져야 합니다. 4절 링크 시스템의 중력 방향을 다시 설정합니다.

fb.Gravity = circshift(fb.Gravity,-1);

4절 링크 시스템의 초기 구성을 설정하기 위해, 조인트 프리미티브에 대한 목표값을 지정합니다. 예를 들어, simscape.op.OperatingPoint 객체와 simscape.op.Target을 사용하여 하단 왼쪽 조인트의 조인트 프리미티브 목표값을 60도로 설정할 수 있습니다.

JointOP = OperatingPoint;
JointOP("Bottom_Left_Joint/Rz/q") = Target(60,"deg","High")
JointOP = 
  OperatingPoint with children:

  OperatingPoints:

   ChildId              Size
   ___________________  ____

   'Bottom_Left_Joint'   1x1

조인트 프리미티브의 목표값을 설정할 때는 jointPrimitivePaths 메서드를 사용하여 Multibody 객체 내 프리미티브의 경로를 표시할 수 있습니다.

시스템의 컴포넌트와 구조를 확인합니다.

fb
fb = 
  Multibody:

  No connectors.

  Components:

  Name                  Type          
  ____________________  ______________

  "Bottom_Left_Joint"   Revolute Joint
  "Bottom_Link"         Rigid Body    
  "Bottom_Right_Joint"  Revolute Joint
  "Left_Link"           Rigid Body    
  "Right_Link"          Rigid Body    
  "Top_Left_Joint"      Revolute Joint
  "Top_Link"            Rigid Body    
  "Top_Right_Joint"     Revolute Joint
  "World"               World Frame   

  Connections:

  Connector 1              Connector 2           
  _______________________  ______________________

  "Bottom_Left_Joint/B"    "Bottom_Link/neg_end" 
  "Bottom_Left_Joint/F"    "Left_Link/neg_end"   
  "Bottom_Link/pos_end"    "Bottom_Right_Joint/B"
  "Bottom_Link/reference"  "World/W"             
  "Bottom_Right_Joint/F"   "Right_Link/neg_end"  
  "Left_Link/pos_end"      "Top_Left_Joint/F"    
  "Right_Link/pos_end"     "Top_Right_Joint/F"   
  "Top_Left_Joint/B"       "Top_Link/neg_end"    
  "Top_Link/pos_end"       "Top_Right_Joint/B"   

  Multibody with properties:

     ComponentNames: [9×1 string]
            Gravity: [0 -9.8066 0] (m/s^2)
        DoVisualize: 1
    FrameConnectors: [0×1 string]

Simulink 모델 만들기

멀티바디 시스템을 시뮬레이션하는 기능을 포함하여 Simscape Multibody의 기능을 완전히 활용하려면 makeBlockDiagram 메서드를 사용하여 fb 객체에서 Simulink 모델을 만드십시오.

MATLAB에서 멀티바디 시스템을 생성하면, Simscape Multibody는 다른 방식으로 조인트 프리미티브의 상태를 지정합니다. Joint 블록 내에서 조인트 목표값을 통해 상태를 지정하는 대신, fb 객체에서는 simscape.op.OperatingPoint 객체인 JointOP를 사용하여 조인트 프리미티브의 상태 목표값을 정의합니다. 따라서 fb 객체로부터 Simulink 모델을 생성하려면, makeBlockDiagram 메서드에 JointOP 객체와 fb 객체가 필요합니다. makeBlockDiagram 메서드는 JointOP 객체의 데이터를 사용하여, 생성된 Simulink 모델의 Joint 블록에 조인트 목표 파라미터를 채웁니다.

makeBlockDiagram(fb,JointOP,"FourBar")

FourBar 모델도 다른 Simulink 모델과 마찬가지로 수정할 수 있습니다. 하지만 fb 객체에서 변경 가능한 내용은 FourBar 모델에서 직접 변경하지 않는 것이 좋습니다. 대신 fb 객체를 생성하는 코드를 변경한 후에 객체를 다시 생성하고, 새로운 Simulink 모델을 만드십시오. 이 접근법을 사용하면 코드가 항상 모델의 기본 소스로 유지됩니다.

참고 항목

| |

도움말 항목