내 머릿속

[비선형제어]Feedback Linearization -2- 본문

자율주행/Control

[비선형제어]Feedback Linearization -2-

두구궁 2025. 3. 3. 00:41
728x90
반응형
SMALL

이번에는 지난 포스트에 이어 비선형 제어기 중 하나인 Feedback Linearization에 대해 더 소개해보겠습니다.

 

2차 비선형 시스템

저번에는 단순한 1차 비선형 시스템이여서 FL의 제어입력 식이 단순하게 설계 될 수 있었습니다.

 

1차 비선형 시스템의 경우 $\dot x = v$ 와 같은 꼴로 만들어지는 제어입력 $u$를 설계하고,

$v$가 어떤 에러에 비례한 제어입력꼴을 갖도록 하는 최종 제어입력을 설계하면 됐었습니다.

 

2차 시스템의 경우는 우선

$ \dot x_1 = x_2$

$ \dot x_2 = v$

 

와 같은 꼴을 가지도록 하는 u를 설계하는게 먼저고,

 

이후에 $v=-K_1 x_1 - K_2 x_2$와 같이 두게 되면 시스템의 상태를 안정화시키는 제어입력이 완성됩니다.

 

예제

$\dot x_1 = -2x_1 + ax_2 + sin(x_1)$

$\dot x_2 = -x_2 cos(x1) + u cos(2x_1)$

 

이 예제를 보도록 합시다.

1차 시스템처럼 단순히 $\dot x_2 = v$ 와 같이 접근하면 $x_1$을 제어할 수 없게 됩니다.

 

따라서 보조 변수 $z_1$을 사용하도록 하겠습니다.

우선, $z_1 = x_1$, $z_2 = \dot z_1$ 와 같은 미분관계를 갖는 시스템으로 바꿔주고

 

미분 방정식으로 표현하면

$\dot z_1 = \dot x_1$

$\dot z_2 = \ddot x_1$이 됩니다.

 

초기 2차시스템 모델을 대입하면

$\dot z_1 = -2x_1 + ax_2 + sin(x_1)$

$\dot z_2 = -2 \dot x_1 + a \dot x_2 + cos(x_1) \dot x_1$

 

$\dot z_1 = -2x_1 + ax_2 + sin(x_1)$

$\dot z_2 = -2 \dot x_1 + a (-x_2 cos(x1) + u cos(2x_1)) + cos(x_1) \dot x_1$

 

그런데 $\dot z_1 = -2x_1 + ax_2 + sin(x_1)$ 에서

$z_2 = \dot z_1$이기 때문에,

 

$z_2 = -2x_1 + ax_2 + sin(x_1)$이고,

$x_2 = (1/a)*(z_2 + 2x_1 - sin(x_1))$ 로 표현할 수 있습니다.

 

그래서 다시 $x_1 = z_1$,

$x_2 = (1/a)*(z_2 + 2x_1 - sin(x_1))$ 이므로

 

$\dot z_1 = -2x_1 + ax_2 + sin(x_1)$

$\dot z_2 = -2 \dot x_1 + a (-x_2 cos(x1) + u cos(2x_1)) + cos(x_1) \dot x_1$

 

$\dot z_1 = -2z_1 + a((1/a)*(z_2 + 2z_1 - sin(z_1))+sin(z_1)$

$\dot z_2 = -2 z_2 + a(-((1/a)*(z_2 + 2z_1 -sin(z_1))) cos(z_1) + ucos(2z_1))+cos(z_1) z_2$

 

이렇게 정리가 되고,

$\dot z_1 = -2z_1 + a((1/a)*(z_2+2z_1-sin(z_1)))+sin(z_1)$

첫번째 수식에서는 $sin(z_1)$항과, $-2z_1$항이 제거되어서

$\dot z_1 = z_2$

 

두번째 수식에서는 $cos(z_1)z_2$항만 제거되어서

$\dot z_2 = -2 z_2 + a(- ( (1/a)*(z_2 + 2z_1 - sin(z_1))) cos(z_1) + u cos(2z_1)) +cos(z_1) z_2$

$\dot z_2 = -2 z_2 -2z_1 cos(z_1) + sin(z_1) cos(z_1) + a u cos(2z_1)) $

와 같이 정리됩니다.

 

최종적으로

$\dot z_1 = z_2$

$\dot z_2 = -2 z_2 -2z_1 cos(z_1) + sin(z_1) cos(z_1) + a u cos(2z_1))$

 

이제 $\dot z_2 = -2 z_2 -2z_1 cos(z_1) + sin(z_1) cos(z_1) + a u cos(2z_1))$ 항의 우변을 v로 치환하면?

$\dot z_2 = v$

$v = -2 z_2 -2z_1 cos(z_1) + sin(z_1) cos(z_1) + a u cos(2z_1))$

 

$u = (1/a cos(2z_1))*(v + 2z_2 + 2z_1 cos(z_1) -sin(z_1) cos(z_1))$

그리고 $v = -k_1 z_1 - k_2 z_2$ 와 같은 꼴이여야 하므로,

 

$u = (1/(a cos(2z_1)))*((-k_1 z_1 - k_2 z_2)+ 2z_2 + 2z_1 cos(z_1) -sin(z_1) cos(z_1))$

 

를 최종제어입력으로 설계할 수 있습니다.

 

결과는 아래와 같습니다.

코드

clear all;close all;clc;

Tf = 10;
dt = 0.1;

idx = 1;
time = 0:dt:Tf;

states = zeros(2,Tf/dt);
states(1,1) = 10;
states(2,1) = 5;

a = 2;
% u = 3;
k1 = 10;
k2 = 5;



for t = 0:dt:Tf-dt

    z1 = states(1,idx);
    z2 = -2*states(1,idx) + a*states(2,idx) + sin(states(1,idx));

    % z1 = states(idx,1);
    v = -k1*z1 - k2*z2;
    u = (1/(a*cos(2*z1))) * (v + 2*z2 + 2*z1*cos(z1) - sin(z1)*cos(z1));
    x1_dot = -2*states(1,idx) + a*states(2,idx) + sin(states(1,idx));
    x2_dot = -states(2,idx)*cos(states(1,idx))+u*cos(2*states(1,idx));
    
    x_dot = [x1_dot;x2_dot];


    states(:,idx+1) = states(:,idx) + x_dot*dt;
    idx = idx + 1;
end

plot(time(1:end),states(1,:));
hold on;
plot(time(1:end),states(2,:));

 

728x90
반응형
LIST