일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 차량 동역학
- lateral dynamics
- Isaac Sim
- 제어공학
- 백스테핑
- feedback linearization
- 터미널 오류
- ROS2
- 궤환 선형화
- ros2humble
- #! /usr/bin/env python
- 오류
- Python
- FL
- 자동제어
- 우분투
- control
- 비선형제어
- 보드선도
- humble
- 나이퀴스트선도
- 강화학습
- 경로계획
- 궤환선형화
- Backstepping
- 횡방향 동역학
- 나이퀴스트
- RL
- 러닝 #운동 #동기부여
- 2024적금
- Today
- Total
내 머릿속
[비선형제어]Feedback Linearization -3- 본문
이번에도 FL의 예제와 함께하는 설명입니다.
예제
$\dot x_1 = sin(x_2)+(x_2+1)x_3$
$\dot x_2 = x_1^5 + x_3$
$\dot x_3 = x_1^2 + u$
$y = x_1$
이번에는 모든 상태를 피드백 받는것이 아닌 $y$을 피드백 받아 $y_d$를 추종하는 제어입력을 설계해야 합니다.
현재 제어입력 $u$는 $x_1$과 직접 연결되어 있지 않으니, $y$를 한번 미분해보겠습니다.
$\dot y = \dot x_1$ 이므로
$\dot y = sin(x_2) + (x_2+1)x_3$ 입니다.
만약 여기서 제어입력이 나왔다면 이전과 같이 우변을 모두 보조제어입력 $v$로 보고, u를 설계하면 됩니다.
하지만 제어입력이 없기 때문에 한번 더 미분해주겠습니다.
$\ddot y = cos(x_2)\dot x_2 + \dot x_2 x_3 + (x_2 + 1)\dot x_3$
$\ddot y = cos(x_2)(x_1^5+x_3)+(x_1^5+x_3)(x_3)+(x_2+1)(x_1^2+u)$
$\ddot y = (cos(x_2)+x_3)(x_1^5+x_3)+(x_2+1)x_1^2 + (x_2+1)u$
이제 제어입력을 제외한 항을 $f(x)=(cos(x_2)+x_3)(x_1^5+x_3) + (x_2+1)x_1^2$로 표현하면
$\ddot y = f(x)+(x_2+1)u$가 됩니다.
제어입력이 나왔으니, 이제 감이 오시죠?
$\ddot y = v$로 잡고
$v = f(x)+(x_2+1)u$ 니까
$u = (v-f(x))/(x_2+1)$입니다.
만약 $y_d$가 trajectory라면, $\dot y_d$, $\ddot y_d$가 존재할 것이고,
error dynamics 가 $\ddot e + k_2 \dot e + k_1 e = 0$인 보조 제어입력 $v$는
$v = \ddot y_d - k_1 e - k_2 \dot e$ 입니다.
결과
코드
clear all;close all;clc;
Tf = 10;
dt = 0.1;
idx = 1;
time = 0:dt:Tf;
states = zeros(3,Tf/dt);
states(1,1) = 0;
states(2,1) = 0;
k1 = 1;
k2 = 1;
y_d = sin(time);
y_d_dot = cos(time);
y_d_ddot = -sin(time);
for t = 0:dt:Tf-dt
y = states(1,idx);
y_dot(idx) = sin(states(2,idx)) + (states(2,idx)+1)*states(3,idx);
e_dot = y_dot(idx) - y_d_dot(idx);
e = y-y_d(idx);
v = y_d_ddot(idx) -k1*e - k2*e_dot;
f_x = (states(1,idx)^5+states(3,idx))*(states(3,idx)+ cos(states(2,idx))) + (states(2,idx)+1)*states(1,idx)^2;
u = 1/(states(2,idx)+1)*(v-f_x);
x1_dot = sin(states(2,idx)) + (states(2,idx)+1)*states(3,idx);
x2_dot = states(1,idx)^5 + states(3,idx);
x3_dot = states(1,idx)^2 + u;
x_dot = [x1_dot;x2_dot;x3_dot];
states(:,idx+1) = states(:,idx) + x_dot*dt;
idx = idx + 1;
end
figure()
subplot(2,1,1)
plot(time(1:end),states(1,:),'b-');
hold on;
plot(time(1:end),y_d(:),'r--','LineWidth',2)
legend('y','y_d')
grid on
subplot(2,1,2)
plot(time(1:end-1),y_dot(:),'b-');
hold on;
plot(time(1:end),y_d_dot(:),'r--','LineWidth',2)
legend('y_dot','y_d_dot')
grid on
'자율주행 > Control' 카테고리의 다른 글
[비선형제어]Backstepping control -2- (0) | 2025.03.03 |
---|---|
[비선형제어]Backstepping control -1- (1) | 2025.03.03 |
[비선형제어]Feedback Linearization -2- (0) | 2025.03.03 |
[비선형제어]Feedback Linearization -1- (0) | 2025.03.02 |