일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ros2humble
- 백스테핑
- 제어공학
- 오류
- 강화학습
- 궤환 선형화
- 보드선도
- RL
- #! /usr/bin/env python
- 2024적금
- ROS2
- humble
- 비선형제어
- 차량 동역학
- 터미널 오류
- 나이퀴스트선도
- Python
- lateral dynamics
- 자동제어
- 나이퀴스트
- feedback linearization
- FL
- control
- Isaac Sim
- Backstepping
- 횡방향 동역학
- 러닝 #운동 #동기부여
- 궤환선형화
- 우분투
- 경로계획
- Today
- Total
내 머릿속
[비선형제어]Backstepping control -1- 본문
이번에는 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')
'자율주행 > Control' 카테고리의 다른 글
[비선형제어]Backstepping control -2- (0) | 2025.03.03 |
---|---|
[비선형제어]Feedback Linearization -3- (0) | 2025.03.03 |
[비선형제어]Feedback Linearization -2- (0) | 2025.03.03 |
[비선형제어]Feedback Linearization -1- (0) | 2025.03.02 |