일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 보드선도
- #! /usr/bin/env python
- Isaac Sim
- Backstepping
- 강화학습
- FL
- 터미널 오류
- feedback linearization
- ros2humble
- humble
- 궤환선형화
- 궤환 선형화
- 나이퀴스트
- 백스테핑
- ROS2
- 오류
- 경로계획
- 2024적금
- 러닝 #운동 #동기부여
- 횡방향 동역학
- RL
- Python
- 차량 동역학
- 나이퀴스트선도
- 제어공학
- 자동제어
- control
- 우분투
- 비선형제어
- lateral dynamics
- Today
- Total
내 머릿속
[비선형제어]Feedback Linearization -2- 본문
이번에는 지난 포스트에 이어 비선형 제어기 중 하나인 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,:));
'자율주행 > Control' 카테고리의 다른 글
[비선형제어]Backstepping control -2- (0) | 2025.03.03 |
---|---|
[비선형제어]Backstepping control -1- (1) | 2025.03.03 |
[비선형제어]Feedback Linearization -3- (0) | 2025.03.03 |
[비선형제어]Feedback Linearization -1- (0) | 2025.03.02 |