Main Content

시스템을 모델링하고 검증하기

시스템 구조 내에서 각 컴포넌트를 모델링하여 해당 컴포넌트의 물리적 동작 또는 함수 동작을 표현합니다. 테스트 데이터를 사용해 시뮬레이션을 수행하여 기본 컴포넌트 동작을 검증합니다.

시스템 레이아웃 열기

전체 시스템 레이아웃에 대한 큰 그림을 보면 개별 컴포넌트를 모델링할 때 도움이 됩니다. 먼저, 레이아웃 모델을 불러옵니다. MATLAB® 명령줄에 다음을 입력하십시오.

open_system('system_layout.slx')

컴포넌트 모델링하기

컴포넌트의 Simulink® 모델은 다음과 같은 몇 가지 시작점을 바탕으로 합니다.

  • 물리적 컴포넌트에서 출력과 입력 사이의 명시적인 수학적 관계 — 미분 방정식의 적분과 대수 계산을 통해 컴포넌트의 입력에서 직접 또는 간접적으로 출력을 계산할 수 있습니다. 예를 들어, 주어진 유입량에 대해 탱크의 수위를 계산하는 것은 명시적인 관계입니다. 각 Simulink 블록은 입력에서 출력을 계산하는 정의에 따라 실행됩니다.

  • 물리적 컴포넌트에서 모델 변수 사이의 묵시적인 수학적 관계 — 변수가 상호 종속적이기 때문에 컴포넌트에 입력과 출력을 명시적으로 할당하지 않습니다. 예를 들어, 회로에 연결된 모터의 + 단자의 전압과 - 단자의 전압은 묵시적인 관계를 갖습니다. Simulink에서 이러한 관계를 모델링하려면 Simscape™와 같은 물리 모델링 툴을 사용하거나, 이러한 변수를 입력/출력 정의가 가능한 더 큰 컴포넌트의 일부로 모델링합니다. 모델링 목표와 컴포넌트 정의를 상세하게 검토하면 입력/출력 관계를 정의하는 데 도움이 될 수 있습니다.

  • 실제 시스템에서 확보한 데이터 — 실제 컴포넌트에서 입력/출력 데이터를 측정했지만 완전히 정의된 수학적 관계가 존재하지 않습니다. 많은 장치가 이 설명과 같이 모델링되지 않은 컴포넌트를 가집니다. 예를 들어, 텔레비전에 의해 발생하는 열이 이에 해당됩니다. System Identification Toolbox™를 사용하여 이러한 시스템에 대한 입력/출력 관계를 정의할 수 있습니다.

  • 양함수 정의 — 대수 계산 및 논리 계산을 통해 함수 컴포넌트의 입력으로부터 출력을 정의합니다. 예를 들어, 온도 조절 장치의 스위칭 논리가 이에 해당됩니다. 대부분의 함수 관계를 Simulink 블록과 서브시스템으로 모델링할 수 있습니다.

이 튜토리얼에서는 명시적 입력/출력 관계를 갖는 물리적 컴포넌트와 함수 컴포넌트를 모델링합니다. 이 튜토리얼에서 수행할 작업은 다음과 같습니다.

  1. 시스템 방정식을 사용하여 Simulink 모델을 만듭니다.

  2. Simulink 편집기에서 Simulink 블록을 추가하고 연결합니다. 블록으로 방정식의 계수와 변수를 표현합니다.

  3. 각 컴포넌트에 대해 개별적으로 모델을 구축합니다. 시스템의 모델을 구축하는 가장 효과적인 방법은 먼저 컴포넌트를 독립적으로 고려하는 것입니다.

  4. 먼저, 시스템의 근삿값을 사용하여 단순한 모델을 구축합니다. 모델의 정확도에 영향을 미칠 수 있는 가정을 식별합니다. 복잡도 수준이 모델링 및 정확도 요구 사항을 충족할 때까지 반복적으로 세부 수준을 높여갑니다.

물리적 컴포넌트 모델링하기

컴포넌트 사이의 관계를 설명합니다(예: 데이터, 에너지, 힘 전달). Simulink에서 시스템 방정식을 사용하여 시스템의 그래픽 모델을 구축합니다.

컴포넌트 모델링을 시작하기 전에 몇 가지 질문을 해야 합니다.

  • 각 컴포넌트에서 무엇이 상수인가? 어떤 값이 사용자가 직접 변경하지 않는 한 변화하지 않고 유지되는가?

  • 각 컴포넌트에서 무엇이 변수인가? 어떤 값이 시간 경과에 따라 변화하는가?

  • 하나의 컴포넌트가 몇 개의 상태 변수를 가지는가?

과학적 원리를 사용하여 각 컴포넌트에 대한 방정식을 도출합니다. 대부분의 시스템 방정식은 다음 세 가지 범주로 나뉩니다.

  • 연속 시스템의 경우, 미분 방정식으로 변수의 변화율을 설명하며, 시간의 모든 값에 대해 방정식이 정의됩니다. 예를 들어, 1계 미분 방정식은 자동차의 속도를 제공합니다.

    dv(t)dt=bmv(t)+u(t)

  • 이산 시스템의 경우, 차분 방정식으로 변수의 변화율을 설명합니다. 하지만 특정 시간에 대해서만 방정식이 정의됩니다. 예를 들어, 이산 PD(비례-미분) 제어기에서 생성하는 제어 신호는 다음과 같습니다.

    pd[n]=(e[n]e[n1])Kd+e[n]Kp

  • 도함수를 사용하지 않는 방정식은 대수 방정식입니다. 예를 들어, 대수 방정식은 2개의 컴포넌트를 갖는 병렬 회로에서 총 전류를 제공합니다.

    It=Ia+Ib

바퀴와 직진 동작.  바퀴에 두 개의 힘이 작용합니다.

  • 모터에 의해 가해지는 힘 — 힘 F는 속도가 변하는 방향으로 작용하며, 바퀴 서브시스템에 대한 입력입니다.

  • 항력(drag force) — 힘 Fdrag는 속도가 변하는 방향과 반대로 작용하며, 속도의 함수입니다.

    Fdrag=kdragV|V|

가속도는 이들 힘의 합에 비례합니다.

(m/2)V˙=FFdrag(m/2)V˙=FkdragV|V|V˙=FkdragV|V|(m/2)

여기서 kdrag는 항력 계수이며 m은 로봇의 질량입니다. 각 바퀴는 이 질량의 절반을 지탱합니다.

바퀴 모델을 구축합니다.

  1. system_layout 모델에서 Right Wheel이라는 서브시스템을 더블 클릭하여 빈 서브시스템을 표시합니다.

  2. 속도와 가속도를 모델링하기 위해 Integrator 블록을 추가합니다. 초기 조건은 0으로 설정된 상태로 둡니다. 이 블록의 입력은 가속도 Vdot이고, 출력은 속도 V입니다.

    The Integrator block has an unconnected input signal named Vdot and an output signal labeled V that is connected to an Outport block named Speed. An unconnected Inport block named Force is to the left of the unconnected signal line for the signal Vdot.

  3. 항력을 모델링하기 위해 User-Defined Functions 라이브러리에서 MATLAB Function 블록을 추가합니다. MATLAB Function 블록을 사용하면 모델에 수학 표현식을 빠르게 구현할 수 있습니다. 함수를 편집하기 위해 블록을 더블 클릭하여 MATLAB Function 블록 편집기를 엽니다.

  4. MATLAB Function 블록 편집기에서 MATLAB® 코드를 입력하여 항력을 계산합니다.

    function Fdrag=get_fdrag(V,k_drag)
    
    Fdrag=k_drag*V*abs(V);

    The MATLAB Function Block Editor shows the code for a MATLAB function named Fdrag that calculates the drag force.

  5. MATLAB Function 블록의 인수를 정의합니다. MATLAB Function 블록 편집기에서 데이터 편집 을 클릭합니다. k_drag를 클릭하고 범위파라미터로 설정한 후 적용을 클릭합니다.

  6. Subtract 블록을 사용하여 모터 힘에서 항력을 뺍니다. 이득 파라미터가 1/(m/2)로 지정된 Gain 블록을 사용하여 힘-가속도 방정식을 완성합니다.

  7. MATLAB Function 블록을 선택하여 블록의 방향을 바꿉니다. 그런 다음 Simulink 툴스트립의 형식 탭에서 좌우를 반전합니다 를 클릭합니다. 블록을 연결합니다.

    In the wheel model, the MATLAB Function block is in a feedback loop between the speed output signal. The Subtract block subtracts the drag force calculated by the MATLAB Function block from the force input to the subsystem. The Subtract block and Gain block are between the force input and the input to the Integrator block.

  8. 두 바퀴는 동일한 동특성을 갖습니다. 방금 생성한 Right Wheel이라는 서브시스템을 복사하여 Left Wheel이라는 서브시스템에 붙여 넣습니다.

  9. 부모까지 탐색 을 클릭하여 모델의 최상위 수준을 봅니다.

회전 동작.   두 바퀴가 서로 반대 방향으로 돌면 반지름이 r인 원을 그리면서 움직이므로 로봇이 회전 동작을 하게 됩니다. 바퀴가 서로 같은 방향으로 돌면 회전이 일어나지 않습니다. 바퀴 속도의 크기가 항상 동일하다고 가정하면, 두 바퀴의 속도 VR과 VL 사이의 차이에 따라 회전 동작이 달라지도록 모델링할 수 있습니다.

θ˙=VRVL2r

회전 동특성 모델을 구축합니다.

  1. system_layout 모델의 최상위 수준에서 Rotation이라는 서브시스템을 더블 클릭하여 빈 서브시스템을 표시합니다. Inport 블록과 Outport 블록 간 연결을 삭제합니다.

  2. 각속도와 위치를 모델링하기 위해 Integrator 블록을 추가합니다. 초기 조건은 0으로 설정된 상태로 둡니다. 이 블록의 출력은 회전 위치 theta이고, 입력은 각속도 theta_dot입니다.

  3. 접선 속도에서 각속도를 계산합니다. Gain 블록을 추가하고 블록의 이득 파라미터를 1/(2*r)로 설정합니다.

  4. 블록을 연결합니다.

    An Inport block named Speed difference connects to the Gain block, which connects to an Integrator block, which connects to an Outport block named Angle

  5. 부모까지 탐색 을 클릭하여 모델의 최상위 수준을 봅니다.

함수 컴포넌트 모델링하기

함수의 입력부터 출력까지 함수에 대해 설명합니다. 이 설명에는 대수 방정식과 논리 구문이 포함될 수 있으며, 이를 사용하여 Simulink에서 시스템의 그래픽 모델을 구축할 수 있습니다.

좌표 변환.  x, y 좌표상 로봇의 속도 VX, VY는 직진 속도 VN 및 각도 theta와 다음의 관계를 가집니다.

VX=VNcos(θ)VY=VNsin(θ)

좌표 변환 모델을 구축합니다.

  1. system_layout 모델의 최상위 수준에서 Coordinate Transform이라는 서브시스템을 더블 클릭하여 빈 서브시스템을 표시합니다.

  2. 삼각 함수를 모델링하기 위해 Math Operations 라이브러리에서 SinCos 블록을 추가합니다.

  3. 곱셈을 모델링하기 위해 Math Operations 라이브러리에서 Product 블록을 2개 추가합니다.

  4. 블록을 연결합니다.

    The coordinate transformation model has two inputs named Linear speed and Angle and two outputs named Y speed and X speed. The X and Y speeds are calculated by multiplying the sine and cosine of the angular position by the linear speed input.

  5. 부모까지 탐색 을 클릭하여 모델의 최상위 수준을 봅니다.

모델 파라미터 설정하기

다음을 포함한 여러 근거 자료를 사용하여 모델의 파라미터에 적절한 값을 결정할 수 있습니다.

  • 서면으로 작성된 사양(예: 표준 속성 테이블 또는 제조업체 데이터 시트)

  • 기존 시스템에서 직접 확보한 측정값

  • 시스템 입력/출력을 사용한 추정값

이 모델에서 사용하는 파라미터는 다음과 같습니다.

파라미터기호
질량m2.5kg
구름 저항k_drag30Ns2/m
로봇 반지름r0.15m

Simulink 모델은 MATLAB 작업 공간의 변수를 사용하여 정의된 파라미터 값에 액세스할 수 있습니다. MATLAB 명령 창에 명령을 입력하여 이러한 변수를 정의합니다.

m = 2.5;
k_drag = 30;
r = 0.15;

시뮬레이션을 통해 컴포넌트 검증하기

입력을 전달하고 출력을 관찰하여 컴포넌트를 검증합니다. 이렇게 간단한 검증으로도 모델을 바로 개선할 수 있는 방법을 찾을 수 있습니다. 이 예제에서는 다음 동작을 검증합니다.

  • 바퀴에 지속적으로 힘이 가해지면 정상 상태 속도에 도달할 때까지 속도가 증가한다.

  • 바퀴가 서로 반대 방향으로 돌 때 회전각이 일정한 비율로 증가한다.

바퀴 컴포넌트 검증하기

바퀴 컴포넌트에 대한 테스트 모델을 만들고 실행합니다.

  1. 새 모델을 만듭니다. 시뮬레이션 탭에서 새로 만들기 를 클릭합니다. Right Wheel이라는 Subsystem 블록을 새 모델로 복사합니다.

  2. 테스트 입력을 만들기 위해 Sources 라이브러리에서 Step 블록을 추가하고 Right Wheel이라는 서브시스템의 입력에 연결합니다. 스텝 시간 파라미터는 1로 설정된 상태로 둡니다.

  3. 출력에 Scope 뷰어를 추가합니다. Right Wheel이라는 Subsystem 블록의 출력 포트를 마우스 오른쪽 버튼으로 클릭하고 뷰어 만들기 및 연결 > Simulink > Scope를 선택합니다.

    A Step block connects to the input of a Subsystem block named Right Wheel. The input port of the subsystem is named Force, and the output port of the subsystem is named Speed. A scope icon next to the subsystem output port indicates that the output port is connected to a scope viewer..

  4. 모델을 시뮬레이션합니다. 시뮬레이션 탭에서 실행 을 클릭합니다.

    The scope viewer plots the output signal of the subsystem named Right Wheel.

시뮬레이션 결과는 모델이 일반적으로 예상되는 동작을 보임을 나타냅니다. 스텝 시간에 힘이 가해지기 전까지는 동작이 일어나지 않습니다. 힘이 가해지면 속도가 증가하기 시작하며 가해진 힘과 항력이 평형 상태에 도달하면 일정하게 유지됩니다. 이 시뮬레이션은 검증 외에도 주어진 힘에 대한 바퀴의 최대 속도를 보여줍니다.

회전 컴포넌트 검증하기

회전 모델에 대한 테스트 모델을 만들고 실행합니다.

  1. 새로 만들기 를 클릭하여 새 모델을 만듭니다. Rotation이라는 Subsystem 블록을 새 모델로 복사합니다.

  2. 새 모델에 테스트 입력을 만들기 위해 Sources 라이브러리에서 Step 블록을 추가합니다. 스텝 시간 파라미터는 1로 설정된 상태로 둡니다. Step 블록의 출력을 Rotation이라는 서브시스템 입력에 연결합니다. 이 입력은 바퀴가 서로 반대 방향으로 돌 때 바퀴 속도의 차이를 나타냅니다.

  3. Rotation이라는 서브시스템의 출력에 Scope 뷰어를 추가합니다. 서브시스템의 출력 포트를 마우스 오른쪽 버튼으로 클릭하고 뷰어 만들기 및 연결 > Simulink > Scope를 선택합니다.

    A Step block connects to the input of a Subsystem block named Rotation. The input port of the subsystem is named Speed difference, and the output port of the subsystem is named Angle. A scope icon next to the subsystem output port indicates that the output port is connected to a scope viewer.

  4. 모델을 시뮬레이션합니다. 시뮬레이션 탭에서 실행 을 클릭합니다.

    The scope viewer plots the output signal of the subsystem named Rotation.

이 시뮬레이션에서는 두 바퀴가 동일한 속도로 서로 반대 방향으로 도는 동안 각도가 꾸준히 증가하는 것을 보여줍니다. 각도 출력을 더욱 쉽게 해석하기 위해 모델을 개선합니다. 예를 들어, 다음 작업을 수행할 수 있습니다.

  • 180/pi의 이득을 갖는 Gain 블록을 추가하여 출력 신호 단위를 라디안에서 각도로 변환합니다.

  • 함수 mod를 사용하는 Math Function 블록을 추가하여 출력값을 360도 주기로 표시합니다.

MATLAB 삼각 함수는 라디안 단위의 입력을 받습니다.

모델 검증하기

개별 컴포넌트를 검증한 후에는 전체 모델에 대해 유사한 검증을 수행할 수 있습니다. 이 예제에서는 다음 동작을 검증합니다.

  • 두 바퀴에 같은 방향으로 동일한 힘이 가해졌을 때 로봇이 일직선으로 이동한다.

  • 두 바퀴에 서로 반대 방향으로 동일한 힘이 가해졌을 때 로봇이 제자리에서 회전한다.

  1. system_layout 모델에서 Inputs라는 서브시스템을 더블 클릭하여 빈 서브시스템을 표시합니다.

  2. Step 블록을 추가하여 테스트 입력을 만듭니다. 스텝 시간 파라미터는 1로 설정된 상태로 둡니다. Step 블록 출력을 두 Outport 블록에 연결합니다.

    A Step block connects to two Outport blocks, one named Left force and one named Right force

  3. 모델의 최상위 수준에서 두 출력 신호를 동일한 Scope 뷰어에 연결합니다.

    The Coordinate Transform subsystem has two output ports named X speed and Y speed. Each output port connects to an Integrator block, and the outport of each Integrator block connects to a scope viewer.

  4. 모델을 시뮬레이션합니다.

    The scope viewer plots the two output signals on the same graph, one in yellow and one in blue.

    Scope 뷰어의 노란색 선은 X 방향이고 파란색 선은 Y 방향입니다. 각도가 0이고 달라지지 않으므로 차량이 예상대로 X 방향으로만 이동합니다.

  5. Inputs라는 서브시스템을 더블 클릭합니다. 왼쪽 바퀴의 방향을 반대로 바꾸기 위해 소스와 두 번째 출력 사이에 Gain 블록을 추가하고 이득 파라미터를 -1로 설정합니다.

    The Step block connects directly to the Outport block named Right Force. The Gain block with a gain of -1 inverts the Step block output. The output from the Gain block connects to the Outport block named Left force.

  6. 각도 출력에 Scope 뷰어를 추가합니다.

  7. 모델을 시뮬레이션합니다.

x와 y 속도 신호에 연결된 Scope 뷰어는 X-Y 평면에서 동작이 일어나지 않음을 보여줍니다.

The scope viewer plots the X and Y speed signals on the same graph.

각도 신호에 연결된 Scope 뷰어는 정상 각도 운동을 보여줍니다.

The scope viewer plots the angle output.

이 최종 모델에서 입력을 변경해 보면 모델에 관한 여러 질문에 대한 답을 얻을 수 있습니다.

  • 초기 각도가 0이 아니면 어떻게 되는가?

  • 힘이 0으로 떨어질 때 동작이 정지하기까지 얼마나 걸리는가?

  • 로봇이 더 무거우면 어떻게 되는가?

  • 로봇이 항력 계수가 더 작은 더 매끄러운 표면에서 움직이면 어떻게 되는가?

관련 항목