control tutorials/cruise control

3. Simulink modeling

fbc0314 2025. 1. 29. 09:03

1. Modeling

이전에 cruise control system에서 회전 저항과 공기저항이 자동차의 속도에 비례한다고 가정하면 system은 아래와 같이 간단한 식으로 표현된다.(mass-damper system)

 

$$m \dot{v}=u-bv$$ $$m=1000kg$$ $$b=50Nsec/m$$ $$u=500N$$

 

 

위의 식을 simulink로 표현하면 아래처럼 그리면 된다. m, b, u(step input의 값)은 위의 식의 갑과 동일하다.

simulink에서의 cruise control

시뮬레이션 시간을 120초로 하고 실행하면 아래와 같은 결과를 확인할 수 있다. 시뮬레이션 시간은 시뮬레이션 탭에서 중지시간 또는 모델설정 앱에서 변경할 수 있다.

시뮬레이션 결과

120초 후에는 10m/s를 유지한다. 최종적으로  10m/s 되는 것을 여러 방법을 통해 알 수 있다.

 

1)미분방정식 풀기

시간이 걸리지만 가장 간단한 방법이다. 위의 미방을 풀어보자. 초기값인 v(0)=0이고 라플라스 변환을 이용해서 해결해보자.

$$u-bv=m \dot{v}$$ $$500-50v=1000 \dot{v}$$ $$1000 \dot{v}+50v=500$$ $$Laplace\ Transform$$ $$1000(sV(s)-v(0))+50V(s)= \frac{500}{s}$$ $$(20s+1)V(s)=\frac{10}{s}$$ $$V(s)= \frac{10}{s*(20s+1)}= \frac{10}{s} - \frac{200}{20s+1}$$ $$Inverse\ Laplace\ Transform$$ $$v(t)=10-10e^{- \frac{1}{20} t}$$

시간이 흐르면 10에 수렴함을 확인할 수 있다.

 

2)DC gain 이용

DC gain은 step input이 작용할 때 steady-state 값과 step input의 비를 나타내고 아래의 식처럼 전달함수에 s=0을 대입해서 얻을 수 있다.

$$DC\ Gain\ = \displaystyle \lim_{s \to 0}G(s)$$

cruise system의 전달함수를 구하고 DC gain을 구해보자!!

$$u-bv=m \dot{v}$$ $$U(s)-bV(s)=m(sV(s)-v(0))$$ $$U(s)=(ms+b)V(s)$$ $$\frac{V(s)}{U(s)}= \frac{1}{ms+b}= \frac{1}{1000s+50}$$ $$ \displaystyle \lim_{s \to 0}G(s)= \displaystyle \lim_{s \to 0} \frac{V(s)}{U(s)}= \displaystyle \lim_{s \to 0} \frac{1}{1000s+50}= \frac{1}{50}$$

DC gain은 1/50이다. 따라서 500N의 input이 주어지면 500*(1/50)=10이 되어서 최종값을 10m/s가 된다.

 

3)최종값 정리(Final value theorem)

위의 DC gain과 비슷하다. 식으로 나타내면 아래와 같다.

$$y(\infty )=\displaystyle \lim_{t \to \infty }y(t)=\displaystyle \lim_{s \to 0}sY(s)$$

위에서 DC gain과 헷갈리는 부분은 DC gain에서 G(s)는 시스템의 전달함수이고 최종값 정리에서 Y(s)는 미분방정식에 라플라스 변환을 하고 식을 정리한 것이다. 즉 G(s)*(1/s)는 unit step input이 적용된 것이고 Y(s)는 원래 시스템의 step input이 그대로 적용된 것으로 DC gain은 비율이 되고  최종값 정리는 steady-state 값이 된다.

cruise system에 적용해보자!!

$$V(s)= \frac{10}{s(20s+1)}$$ $$\displaystyle \lim_{s \to 0}s \frac{10}{s(20s+1)}=10$$

최종값 정리를 이용해도 결과적으로 steady-state 값은 10m/s가 된다.

 

 

#참고

개인적으로 헷갈렸던 부분이다. 위의 결과를 open-loop response라고 하는데 block diagram은 feedback loop처럼 보인다. 처음에는 오류인가 생각했지만 이유는 단순하다. 위의 시스템은 open-loop가 맞다. 원하는 값과 센서로 측정한 값을 비교하여 제어에 목적이 있는 것이 아닌 그냥 힘이 작용하고 수식을 표현하기 위한 것이다. 따라서 open-loop system으로 그냥 힘이 system에 작용하고 그 결과 속도가 output으로 나오게 된다.

 

 

2. Control

위에서 만든 open-loop의 cruise control system을 이용해서 feedback controller를 simulink에서 만들어보자.

이전에 만들었던 모델에서 scope을 Out1으로 step을 In1의 블록으로 교체한다.

위의 파일을 cruise.slx로 저장하고 아래 명령어를 명령창에 실행하면 위의 linaer model을 matlab으로 가져올 수 있다.

linmod()함수는 simulink 모델의 선형화를 수행하여 상태공간(state-space)의 선형 시스템 모델을 생성한다.

m = 1000;
b = 50;
u = 500;
[A,B,C,D] = linmod('cruise')
cruise_ss = ss(A,B,C,D);
step(u*cruise_ss);

위의 코드를 실행하면 500N의 힘이 가해졌을 때 자동차의 속도가 그래프로 표현되는데 이전에 확인한 것처럼 10m/s로 속도가 수렴하는 것을 확인할 수 있다. 즉 simulink의 모델을 matlab으로 그대로 가져온 것이다.

 

1)PI control

위의 모델과 PI controller를 이용해서 제어기를 디자인 해보자. 제일 먼저 subsystem의 블록에 cruise system을 넣어서 간단하게 표현해야 한다. 이는 아래의 두가지 방법으로 만들어질 수 있고 순서의 차이만 있다.

  • 시스템을 모두 선택해서(Ctrl+a) 선택항목을 서브시스템으로 만들수 있다.(Ctrl+g) 
  • 새로운 모델 파일을 열고 서브시스템 블록을 가져온 후 해당 블록을 더블클랙해서 들어가고 이전에 만들었던 모델을 복사붙여넣기 한다.

만들어진 subsystem

이제 PI control 블록을 추가하고 feedback제어 시스템을 만들어보자.

pid 블록없이 표현
pid 블록을 사용해서 표현

그리고 Transfer Fcn 블록을 사용해서 Kp+Ki/s를 넣어주는 방법도 존재한다. 여러가지 방법을 사용해서 만들 수 있다. 차이는 없고 표현을 간단하게 만든것이다.  Kp값은 800, Ki값은 40, reference 값을 10으로 해서 결과를 확인해보자. 여기에서 step 블록은 우리가 목표로 하는 속도값인 reference value를 나타내며 이전에 open-loop에서 작용한 힘과는 의미하는 것이 다르다(처음에 이게 헷갈렸는데 나만 그럴지도...)

 

시뮬레이션 시간을 10초로 두고 결과를 확인하면 아래처럼 나온다.

 

 

Kp값을 통해 시스템을 더 빠르게 만들 수 있고 Ki를 통해서 steady-state error를 줄였다. 우리가 원하는 성능과 물리적 한계를 고려해서 각 계수를 설정하면 된다.

 

3. simscape

simulink와 simscape 에드온이 설치되어 있어야 하는데 설치되지 않았다면 아래를 참고해서 미리 설치하고 진행한다.

https://fbc0314.tistory.com/9

 

Simscape

1. Simscape와 Simulink지금까지 우리는 simulink를 사용해서 시스템을 모델링하고 원하는 조건을 성립하도록 제어기를 설계하고 시뮬레이션 하는 방법을 해보았다. Simscape도 Simulink와 비슷한 목적을 가

fbc0314.tistory.com

그리고 아래의 에드온을 추가로 설치한다. 

simscape multibody

  • scc_new : simscape 실행, 전기, 기계, 유압, 열 등 다양한 물리적 시스템을 블록 기반으로 모델링하는 툴박스
  • smnew : simscape multibody 실행, 3D 다물체(강체) 시스템을 모델링하고 동역학 해석을 수행하는 툴박스

simscape multibody는 simscape와 비슷하지만 로봇, 자동차 서스펜션 등의 다물체 시스템에 적합하다고 이해하면 된다.

 

smnew 명령어를 명령창에 실행하면 아래와 같은 화면이 나온다. simscape와는 조금 다른 것을 확인할 수 있다.

simscape 처음화면(각각의 이름 보이게)

  • PS-Simulink와 Simulink-PS는 각각 simulink와 simscape의 경계를 의미한다.
  • Mechanism Configuratioin은 중력의 크기과 방향을 설정할 수 있고 [0 0 -9.81]은 -z축 방향으로 중력이 작용함을 의미한다.
  • Solver Configuration의 Use local solver를 끄면 전체 솔버와 일관성을 유지하면서 시뮬레이션 가능(??)
  • ctrl+e를 통해서 구성파라미터 화면을 열 수 있고 시뮬레이션 시간, 솔버 유형 등을 선택할 수 있다.

1)Prismatic Joint

한방향으로만 직선운동(translation motion)을 허용하는 조인트로 슬라이더나 피스톤 같은 기계요소를 모델링할때 사용한다. 기본적으로는 z축을 따라 운동하도록 설정되어 있고 축을 변경하거나 이동범위를 설정할 수 있다.

  • B 포트 : Base frame of the joint block , 기준이 되는 프레임
  • F 포트 : Follower frame of the joint block,  조인트를 따라 이동하는 물체

prismatic joint 블록을 두번 클릭하고 아래처럼 설정한다. Internal Mechanics -> damping coefficient는 50, Actuation->Force는 provided by input, Sensing에서 Position, velocity 체크

 

cruise control를 구현하기 위한 prismatic joint의 설정
왼쪽 사진은 설정 후의 prismatic joint 블록, 오른쪽 사진을 각각을 연결한 결과

B포트와 F포트는 이전에 설명한 가장 기본적은 포트이고 Force를 provided by input으로 해서 f가 seinsing에서 position과 velocity를 체크해서 p와 v 포트가 생겼다. 즉 f는 z축 방향으로 작용하는 힘을 연결하고 p는 위치를 나타내고 v는 속도를 나타낸다. 

하나하나 연결하면서 필요한 설정을 추가해보자.

 

2)Rigid Transform

두개의 좌표축 사이의 공간적인 관계를 rotation과 translation으로 나타내준다.

primatic joint는 z축 방향으로 운동하기 때문에 우리는 world 좌표계를 y축 기준 90도 회전시켜 결과적으로 물체의 좌표계의 z축이 world 좌표계의 x축이 되어서 물체가 x축의 방향으로 이동하도록 만든다. rigid transform 블록을 더블클릭 후에 아래와 같이 설정한다.

Rigid Transform 설정와 y축 기준으로 회전한 좌표계

 rigid transform블록의 F포트를 primatic joint의 B포트에 연결하고  rigid transform블록의 B포트 world frame의 w포트에 연결한다.

 

3)Brick Solid

Brick Solid 블록은 기하학적 중심(geometry center)이 기준 좌표계의 원점과 일치하는 프리즘 형태의 형상이며, 각 평면(면)은 기준 좌표계의 X, Y, Z축에 수직이라고 한다. 쉽게 말해서 자동차라는 물체를 표현하기 위해 직육면체를 가져온 것이다. 아래와 같이 크기와 질량을 설정할 수 있다.

brick solid 설정

만든 brick solid는 prismatic joint의 F포트에 연결한다.

 

4)step, scope

작용하는 힘을 표현하기 위해 step 블록과 위치와 속도를 확인하기 위해 scope 블록을 이용한다. 해당 블록은 simulink의 블록이기 때문에 변환해주는 과정이 필요하다. step 블록에는 simulink-ps converter(input signal unit은 N으로 설정)을 연결하고 이를 primatic joint의 f포트에 연결한다. scope은 ps-simulink convertor(output signal unit은 m와 m/s로 설정)에 연결하고 이를 primatic joint의 p와 v에 연결한다. 

 

step 블록에서 스텝시간은 0, 최종값을 500으로 설정하고 scope의 결과를 확인하면 아래와 같다.

위치와 속도
최종적인 simscape multibody

 

이제 위에서 만든 자동차를 subsystem으로 간단하게 만들고 controller를 디자인 해보자.

step과 scope 블록을 제외한 블록 선택후 ctrl+g한 결과

아래와 같이 step, subtract, pid controller, manual switch 블록을 추가해서 아래와 같은 pid 제어기가 추가된 feedback loop를 만들어준다. manual switch를 바꾸면 open-loop response를 확인할 수 있다. kp의 값은 800, ki의 값은 40으로 설정한다. reference input인 step은 10으로 설정해 목표값을 10m/s로 만든다.

feedback loop control

 속도의 결과는 아래와 같다.

왼쪽은 control system(feedback) response, 오른쪽은 open-loop response

'control tutorials > cruise control' 카테고리의 다른 글

2. Control  (0) 2025.01.22
1. System Modeling  (0) 2025.01.21