| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- FL
- Python
- 자동제어
- 제어공학
- ROS2
- 백스테핑
- 경로계획
- 터미널 오류
- 차량 동역학
- 보드선도
- 비선형제어
- 나이퀴스트
- 오류
- #! /usr/bin/env python
- 러닝 #운동 #동기부여
- Backstepping
- 우분투
- 강화학습
- RL
- ros2humble
- control
- 횡방향 동역학
- Isaac Sim
- 2024적금
- 궤환 선형화
- lateral dynamics
- feedback linearization
- humble
- 궤환선형화
- 나이퀴스트선도
- Today
- Total
내 머릿속
[비선형제어]Feedback Linearization -1- 본문
비선형 제어기는 대표적으로 3가지 정도가 존재합니다.
1. Feedback Linearzation(궤환 선형화)
2. BackStepping(백스테핑)
3. Sliding Mode Control(슬라이딩 모드 제어)
오늘은 이 중 Feedback Linearization에 대해서 작성해 보겠습니다.
1. 쉬운 개념
Q. 어떠한 시스템이 비선형 항을 가지고 있고 그 성분을 모두 알수 있다면?
A. 제어입력에서 이를 상쇄해주어 선형시스템으로 만들고, 목표값으로 수렴하게 하는 제어입력을 설계한다!
입니다.
제어입력이 포함시켰을 때의 시스템을 Closed-loop dynamics , 혹은 Closed-loop system, Error dynamics라고 할 수 있습니다.
그렇다면 선형 시스템의 제어입력을 잘 설계해서
$e_x = x(t) - x_d$
$\dot x + Ke_x=0$
과 같은 시스템을 설계해주었을때,
$e_x -> 0 as\space\ t->\inf$
와 같이 시간이 무한대로 감에 따라 에러가 0으로 수렴하게 됩니다.
감이 안오실거 같으니 예시와 함께 해보겠습니다.
2. 예시

완전히 같은 그림은 아니지만, 수조안의 유체의 높이 h를 조절하는 예제라고 생각하시면 됩니다.
제어 대상은 Referece level, 즉 h_d로
스칼라의 경우 h_d = 5m
시간에 따라 변하는 경우 h_d(t) = 1.5*sin(t) + 2
와 같이 정의할 수 있겠죠.
그리고 빠져나가는 유량 변화율을 $Q_o = a \sqrt{2gh}$, a는 빠져나가는 파이프의 단면적
수조 탱크의 단면적을 $A(h)$, 제어입력을 $u$라고 정의하면
시스템은
$A(h) \dot{h} = u - a\sqrt{2gh}$
처럼 정의할 수 있습니다.
사실 Dynamics가 중요한건 아니니까 제어입력$u$ 설계에 집중하는게 좋습니다.
우선, 시스템을 선형시스템으로 만들어보겠습니다.
이를 위해 보조 제어입력 $v$를 사용하면 다음과 같이 선형시스템이 구축됩니다.
$\dot h = v$
이렇게 만들어주면, 보조제어입력$v$가 곧바로 높이변화율에 해당하게 되는 선형시스템이고,
$v = -Ke_h$처럼 P제어같은 느낌의 제어입력을 설계해주면, 제어를 수행할 수 있겠죠.
$u$는??
$\dot h = v$와 같은 형태로 만들어주는 $u$를 만들면 됩니다.
좀 더 자세히 설명해보겠습니다.
$A(h) \dot{h} = u - a\sqrt{2gh}$과 $\dot h = v$ 에서
$A(h)$를 넘겨주면 되겠죠?
$\dot h = A(h)^{-1 }(u - a\sqrt{2gh})$
그럼 이제 우변이 모두 $v$가 되면 됩니다.
$v = A(h)^{-1 }(u - a\sqrt{2gh})$
다시, $u = $와 같은 꼴로 정리하면, $A(h)^{-1}$를 넘기고 나머지항도 넘겨주면 됩니다.
$u = vA(h) + a\sqrt{2gh}$
이제 이 제어입력을 시스템에 넣게 되면 $\dot h = v$ 선형화가 완료되는 겁니다.
그러면 $v = -Ke_h$까지 넣어서 정리하면?
$u = -Ke_h A(h) + a\sqrt{2gh}$ 가 최종 제어입력이 됩니다.
3. 결과 및 코드
시뮬레이션 결과입니다.
고정 ref 일때.

가변 ref일때,

코드
clear all;close all;clc;
Tf = 20;
dt = 0.1;
% t = 0;
u = 0;
a = 5;
g= 9.81;
h(1) = 10;
alpha = 1;
h_d = 5;
time = 0:dt:Tf;
h_d = sin(time) + 5;
% h_d = 5*ones(length(time),1);
h_d_dot = cos(time);
% h_d_dot = zeros(length(time),1);
% disp(h_d)
idx = 1;
for t = 0:dt:Tf-dt
A = h(idx)^2;
h_tilde = h(idx) - h_d(idx);
v = -alpha*h_tilde + h_d_dot(idx);
u = a*sqrt(2*g*h(idx)) + A*v;
h_dot = (1/A)*(u-a*sqrt(2*g*h(idx)));
h(idx+1) = h(idx) + h_dot * dt;
idx = idx +1;
end
figure();
plot(time(1:end),h_d,'r--','LineWidth',2)
hold on;
plot(time(1:end),h,'b-','LineWidth',1);
legend('ref','h')
ylim([0,10])
감사합니다. 다음엔 다른 예제로 찾아뵙겠습니다.
'자율주행 > Control' 카테고리의 다른 글
| [비선형제어]Backstepping control -2- (0) | 2025.03.03 |
|---|---|
| [비선형제어]Backstepping control -1- (1) | 2025.03.03 |
| [비선형제어]Feedback Linearization -3- (0) | 2025.03.03 |
| [비선형제어]Feedback Linearization -2- (0) | 2025.03.03 |