내 머릿속

[비선형제어]Backstepping control -1- 본문

자율주행/Control

[비선형제어]Backstepping control -1-

두구궁 2025. 3. 3. 18:57
728x90
반응형
SMALL

 

이번에는 Backstepping control에 대해 소개해보겠다.

 

이전 FL과 유사하게 예제와 함께 해보자

 

예제

$\dot x_1 = x_1^2 - x_1^3 + x_2$

$\dot x_2 = u$

 

이런 시스템이 존재할 때, FL의 경우

$z_1 = x_1$

$z_2 = \dot z_1$

으로 정의해서

 

$\dot z_2 = 2 x_1 \dot x_1 - 3 x_1^2 \dot x_1 + \dot x_2$

와 같이 정의하고 다시 $\dot x_1$ , $\dot x_2$를 대입해서

 

$\dot z_2 = (2 x_1- 3x_1^2)(x_1^2 - x_1^3 + x_2) + u $

와 같이 만들고 우변을 보조 제어입력 v로 보면,

 

$v = (2 x_1 - 3x_1^2)(x_1^2 - x_1^3 + x_2) + u$

$u = v - (2 x_1 -3x_1^2)(x_1^2 -x_1^3+x_2)$

 

$v = -k1z1$ 

$u = -k1z1 - (2 x_1 -3x_1^2)(x_1^2 -x_1^3+x_2)$

와 같이 설계할 수 있었다.

 

이제 Backstepping의 경우

$\dot x_1 = x_1^2 -x_1^3 +x_2$에서

$x_2$를 보조 제어입력으로 보고 $x_2$를 시스템을 발산시키는 비선형 항을 상쇄 시키면서 $x_1$이 안정화 되도록 한다.

 

$x_2 = -x_1^2 - x_1$ 이라면.

$\dot x_1 = -x_1 - x_1^3$ 이 되니까

 

리아프노프 후보 함수를

$V(x_1) = 1/2x_1^2$ 와 같이 잡고

 

이의 변화량이

$\dot V(x_1) = x_1 \dot x_1 = x_1 (-x_1^3 - x_1) = -x_1^4 - x_1^2 <= -x_1^2 $

 

이므로 GES 이다.

 

문제는 그런 $x_2 = -x_1^2 - x_1$으로 만드는 제어입력 $u$를 만들어 줘야하는건데..

 

이제 Backstep을 하기 위해서

 

$\phi(x_1) = -x_1^2 - x_1$

$\dot x_1 = x_1^2 - x_1^3 +x_2 + \phi(x_1) - \phi(x_1)$

과 같이 트릭을 쓴다.

 

그리고 새로운 변수로 $z_2 = x_2 - \phi(x_1)$로 두게 되면

 

$\dot x_1 = x_1^2 - x_1^3 +\phi(x_1) + z_2$ 인데

$z_2$만 0으로 수렴하면 $x_1$도 앞선 설계에 의해 수렴하게 된다.

 

그럼 $z_2$를 안정화 시키는 $u$만 만들면 되겠죠?

우선 제어입력을 연관시키기 위해서 $z_2$를 미분해서 $\dot z_2$를 구해봅시다.

 

$\dot z_2 = \dot x_2 - (-2x_1 \dot x_1 - \dot x_1)$

$\dot z_2 = u +(2x_1 +1)(-x_1 - x_1^3 + z_2)$

 

드디어 제어입력이 나왔죠?

최종 제어입력을 구하기 위해 다시 리아프노프 후보함수를 사용합니다.

 

$V_c = 1/2 x_1^2 + 1/2 z_2 ^2 $

$\dot V_c = -x_1^2 -x_1^4 + z_2 x_1 + z_2[u + (2x_1+1)(-x_1-x_1^3+z_2)]$

$\dot V_c = -x_1^2 -x_1^4 + z_2[x_1 + (2x_1 +1)(-x_1^2-x_1^3+z_2)+u]$

 

로 정리가 되니까 앞선 $-x_1^2 - x_1^4$는 GES 였으니, 뒤의 모든 항이 음수가 되면 됩니다.

그래서 $[x_1 + (2x_1+1)(-x_1-x_1^3+z_2)+u]=-z_2$라고 두고 제어입력을 유도해보면

 

u = -x_1 -z_2 -(1+2x_1)(-x_1-x_1^3+z_2) 가 되어서 

$\dot V_c = -x_1^2 -x_1^4 - z_2^2$ 이므로 GAS.로 안정화가 됩니다.

 

결과

1. FL

 

2. BS

 

코드

clear all;close all;clc;

Tf = 10;
dt = 0.1;

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

states = zeros(2,Tf/dt);
states(1,1) = 0.5;
states(2,1) = 0;

k1 = 5;
k2 = 5;

control_method = 'bs';

for t = 0:dt:Tf-dt




    %% for FL
    z1_fl = states(1,idx);
    z2_fl = states(1,idx)^2 - states(1,idx)^3 + states(2,idx);
    v_fl = -k1*z1_fl - k2*z2_fl;
    u_fl = v_fl - (2*states(1,idx)-3*states(1,idx)^2)*(states(1,idx)^2-states(1,idx)^3+states(2,idx));

    %% for bs
    z2_bs = states(2,idx) + states(1,idx) + states(1,idx)^2;
    u_bs = -states(1,idx) - z2_bs -(1+2*states(1,idx))*(-states(1,idx)-states(1,idx)^3+z2_bs);

    if control_method == 'fl'
        u = u_fl;
    else
        
        u = u_bs;
    end
    
    
    x1_dot = states(1,idx)^2 - states(1,idx)^3 + states(2,idx);
    x2_dot = u;
    
    x_dot = [x1_dot;x2_dot];


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

plot(time(1:end),states(1,:),'LineWidth',2);
hold on;
plot(time(1:end),states(2,:),'LineWidth',2);
legend('x1','x2')
728x90
반응형
LIST