Inverted Pendulum on Cart LQR Control
Reference: Prof Steve Brunton, Control Bootcamp
Youtube Link

위와 같은 카트에 달린 역진자 시스템을 LQR로 제어하는 예제를 실습해보자.
상태 피드백 제어
일반적으로 모든 상태를 피드백 받을 수 있다고 가정한다면, pole placement와 같은 제어기는 다음과 같이 정의된다.
u=−Kx
x˙=(A−BK)x
그러나 이 제어 게인 K를 구하기 위해 극점을 설계하는 과정은 많은 노력이 필요하다. 이를 해결하기 위해 최적화의 개념을 도입하여 K를 도출하는 것이 LQR이다.
LQR 제어기 설계
최소화해야 하는 목적함수를 다음과 같이 정의한다:
J=∫0∞(xTQx+uTRu)dt
무한대의 시간 동안 상태 오차를 최소화하며, 제어입력을 최소한으로 사용하는 것이 목적이다.
가중치 행렬 설정:
Q=diag(1,1,10,100)
R=0.001
여기서 Q는 대각행렬로, 각 상태변수에 대한 가중치를 나타낸다:
- Q11=1: 위치 x에 대한 가중치
- Q22=1: 속도 v에 대한 가중치
- Q33=10: 각도 θ에 대한 가중치 (높은 우선순위)
- Q44=100: 각속도 ω에 대한 가중치 (가장 높은 우선순위)
R은 제어입력에 대한 가중치로, 작은 값은 제어력 사용에 대한 제약이 적음을 의미한다.
시스템 모델링
역진자-카트 시스템의 선형화된 상태공간 모델은 다음과 같다:
x˙=Ax+Bu
여기서 상태벡터는 x=[x,x˙,θ,θ˙]T 이며:
- x: 카트의 위치
- x˙: 카트의 속도
- θ: 진자의 각도 (수직으로부터의 편차)
- θ˙: 진자의 각속도
시스템 매개변수를 다음과 같이 설정한다:
- m=1 kg (진자의 질량)
- M=5 kg (카트의 질량)
- L=2 m (진자의 길이)
- g=10 m/s² (중력가속도)
- d=1 N·s/m (댐핑 계수)
이를 통해 시스템 행렬을 구성하면:
A=⎣⎢⎢⎢⎡00001−Md0−MLd0Mmg0ML(m+M)g0010⎦⎥⎥⎥⎤
B=⎣⎢⎢⎢⎡0M10ML1⎦⎥⎥⎥⎤
Hamilton-Jacobi-Bellman (HJB) 방정식 이론
HJB 방정식의 개념
Hamilton-Jacobi-Bellman 방정식은 동적 계획법(Dynamic Programming)의 연속시간 버전으로, 최적 제어 문제를 해결하는 핵심 도구이다. 이는 Richard Bellman의 최적성 원리(Principle of Optimality)에 기반한다.
최적성 원리: "최적 정책의 어떤 부분도 최적이어야 한다"
즉, 시간 t에서 상태 x(t)에 있을 때, 앞으로의 최적 제어 전략은 현재 상태에서만 의존해야 하며, 과거 경로와는 무관해야 한다.
가치함수 (Value Function) 정의
현재 상태 x에서 시작하여 무한대까지의 최소 누적 비용을 나타내는 가치함수를 정의한다:
V(x)=minu(⋅)∫0∞L(x(t),u(t))dt
주의: 여기서 x(t)는 초기조건 x(0)=x에서 시작하여 제어 정책 u(⋅)에 의해 결정되는 시간에 따른 상태 궤적이다. 즉, V(x)는 초기 상태 x만의 함수이지만, 적분 내부의 x(t)는 시간에 따라 변하는 상태를 의미한다.
여기서 L(x,u)=xTQx+uTRu는 순간 비용함수이다.
HJB 방정식의 물리적 의미
HJB 방정식은 다음과 같은 동적 일관성 조건을 수학적으로 표현한다:
"현재 시점에서의 최적 비용은 다음 순간의 최적 비용과 현재 순간의 비용의 합과 같아야 한다"
HJB 방정식 미분형태의 도출 과정
동적 일관성 조건 (Dynamic Consistency Condition)
HJB 방정식의 핵심 아이디어는 동적 일관성이다. 시간 t에서 상태 x(t)에 있을 때, 가치함수 V(x(t))는 다음 관계를 만족해야 한다:
V(x(t))=umin[∫tt+dtL(x(τ),u(τ))dτ+V(x(t+dt))]
이는 "현재의 최적 비용 = 미소 시간 동안의 비용 + 다음 시점의 최적 비용"을 의미한다.
Taylor 전개를 통한 미분형태 도출
Step 1: 미소 시간 dt 동안 상태 변화
시스템 동역학 x˙=f(x,u)=Ax+Bu에 의해:
x(t+dt)=x(t)+f(x(t),u(t))⋅dt+O(dt2)
여기서 O는 Big O 표기로 2차 이상의 High order term을 의미한다.
Step 2: 가치함수의 Taylor 전개
V(x(t+dt))=V(x(t))+∇V(x(t))T[x(t+dt)−x(t)]+O(dt2)
=V(x(t))+∇V(x(t))Tf(x(t),u(t))⋅dt+O(dt2)
Step 3: 적분 근사
미소 시간 동안의 비용:
∫tt+dtL(x(τ),u(τ))dτ≈L(x(t),u(t))⋅dt
동적 일관성 조건 대입
위의 근사들을 동적 일관성 조건에 대입하면:
V(x(t))=umin[L(x(t),u(t))⋅dt+V(x(t))+∇V(x(t))Tf(x(t),u(t))⋅dt]
양변에서 V(x(t))를 빼고 dt로 나누면:
0=umin[L(x(t),u(t))+∇V(x(t))Tf(x(t),u(t))]
HJB 방정식의 최종 미분형태
시간 의존성을 생략하여 일반적인 형태로 쓰면:
0=umin[L(x,u)+∇VTf(x,u)]
여기서 f(x,u)=Ax+Bu는 시스템 동역학이다.
해밀토니안과 물리적 해석
HJB 방정식에서 대괄호 안의 식을 해밀토니안이라고 한다:
H(x,u,∇V)=L(x,u)+∇VTf(x,u)
따라서 HJB 방정식은:
0=uminH(x,u,∇V)
각 항의 의미:
-
L(x,u)=xTQx+uTRu:
- 현재 순간의 즉각적 비용
- 상태 오차와 제어 노력의 가중합
-
∇VTf(x,u):
- 가치함수의 시간 변화율
- ∇V는 "비용이 증가하는 방향"을 나타내는 그래디언트
- f(x,u)는 상태의 변화 방향
- 내적은 "비용 변화의 예상치"를 의미한다
HJB 방정식을 통한 LQR 제어 게인 도출
Step 1: HJB 방정식 구성
LQR 문제에서 HJB 방정식:
0=umin[xTQx+uTRu+∇VT(Ax+Bu)]
여기서 ∇V=∂x∂V는 가치함수의 그래디언트이다.
Step 2: 최적 제어 조건 (First-Order Optimality Condition)
제어 입력 u에 대해 최소화하기 위한 필요조건:
∂u∂[uTRu+∇VTBu]=0
이를 계산하면:
2Ru+BT∇V=0
따라서 최적 제어:
u∗(x)=−21R−1BT∇V
Step 3: 가치함수의 이차형태 가정
선형-이차 문제의 특성상, 가치함수는 이차형태(Quadratic Form)를 가진다:
V(x)=xTPx
여기서 P는 양정치 대칭행렬이다.
따라서 그래디언트:
∇V=∂x∂(xTPx)=2Px
Step 4: LQR 제어 게인 도출
최적 제어를 다시 쓰면:
u∗(x)=−21R−1BT(2Px)=−R−1BTPx
상태 피드백 형태 u=−Kx와 비교하여:
K=R−1BTP
이것이 LQR 제어 게인이다.
Step 5: 대수 리카티 방정식 (Algebraic Riccati Equation) 도출
최적 제어 u∗를 HJB 방정식에 대입:
0=xTQx+(Px)TBR−1BT(Px)+(2Px)TAx−(Px)TBR−1BT(Px)
정리하면:
0=xTQx+2xTPTAx−xTPTBR−1BTPx
P가 대칭행렬이므로 PT=P이고, x는 임의이므로:
ATP+PA−PBR−1BTP+Q=0
이것이 대수 리카티 방정식(ARE)이다.
리카티 방정식의 해석
물리적 의미
리카티 방정식의 각 항목은 다음과 같은 의미를 가진다:
- Q: 상태 비용 - 시스템이 목표 상태에서 벗어나는 정도
- ATP+PA: 개루프 시스템의 안정성 기여도
- −PBR−1BTP: 피드백 제어의 안정화 효과
해의 존재성과 유일성
ARE의 해 P가 존재하고 유일하기 위한 조건:
- 제어가능성: (A,B) 쌍이 제어 가능해야 함
- 관측가능성: (A,Q1/2) 쌍이 관측 가능해야 함
- 가중치 조건: Q≥0, R>0
이 조건들이 만족되면, ARE는 유일한 양정치 해 P>0을 가진다.
LQR에서의 특수성
이차 가치함수: LQR 문제에서는 V(x)=xTPx (이차형태)이므로:
∇V=∂x∂(xTPx)=2Px
이는 선형 그래디언트를 가지므로 HJB 방정식이 해석적으로 풀린다.
명시적 해: 이차 가치함수 덕분에 HJB 방정식이 대수 방정식 (리카티 방정식)으로 변환되어, 수치적 또는 해석적으로 쉽게 풀 수 있다.
이것이 LQR이 최적 제어 이론의 입문으로 자주 사용되는 이유이다 - 일반적인 HJB 방정식은 편미분방정식이지만, LQR에서는 대수방정식이 된다.
MATLAB 구현
시스템 매개변수 및 행렬 정의
% System parameters
m = 1; % pendulum mass (kg)
M = 5; % cart mass (kg)
L = 2; % pendulum length (m)
g = 10; % gravity (m/s^2)
d = 1; % damping coefficient (N*s/m)
% State-space matrices
A = [0 1 0 0;
0 -d/M m*g/M 0;
0 0 0 1;
0 -d/(M*L) (m+M)*g/(M*L) 0];
B = [0; 1/M; 0; 1/(M*L)];
% Weight matrices
Q = diag([1, 1, 10, 100]); % State weights
R = 0.001; % Control weight
LQR 제어 게인 계산
% Solve Algebraic Riccati Equation
P = care(A, B, Q, R);
% Calculate LQR gain
K = R\(B'*P); % Equivalent to inv(R)*B'*P
% Display results
fprintf('LQR Control Gain K:\n');
disp(K);
% Closed-loop eigenvalues
A_cl = A - B*K;
eig_cl = eig(A_cl);
fprintf('Closed-loop eigenvalues:\n');
disp(eig_cl);
시뮬레이션 및 시각화
% Initial conditions
x0 = [0; 0; 0.2; 0]; % Initial angle: 0.2 rad (≈ 11.5°)
% Time vector
t = 0:0.01:10;
% Closed-loop system simulation
sys_cl = ss(A_cl, B, eye(4), 0);
[y, t] = initial(sys_cl, x0, t);
% Extract states
x_pos = y(:,1); % Cart position
x_vel = y(:,2); % Cart velocity
theta = y(:,3); % Pendulum angle
theta_dot = y(:,4); % Pendulum angular velocity
% Calculate control input
u = -K * y';
% Plotting
figure('Position', [100, 100, 1200, 800]);
% State responses
subplot(2,3,1);
plot(t, x_pos, 'LineWidth', 2);
title('Cart Position', 'FontSize', 12);
xlabel('Time (s)', 'FontSize', 10);
ylabel('Position (m)', 'FontSize', 10);
grid on;
subplot(2,3,2);
plot(t, x_vel, 'LineWidth', 2);
title('Cart Velocity', 'FontSize', 12);
xlabel('Time (s)', 'FontSize', 10);
ylabel('Velocity (m/s)', 'FontSize', 10);
grid on;
subplot(2,3,3);
plot(t, theta*180/pi, 'LineWidth', 2);
title('Pendulum Angle', 'FontSize', 12);
xlabel('Time (s)', 'FontSize', 10);
ylabel('Angle (deg)', 'FontSize', 10);
grid on;
subplot(2,3,4);
plot(t, theta_dot, 'LineWidth', 2);
title('Pendulum Angular Velocity', 'FontSize', 12);
xlabel('Time (s)', 'FontSize', 10);
ylabel('Angular Velocity (rad/s)', 'FontSize', 10);
grid on;
subplot(2,3,5);
plot(t, u, 'LineWidth', 2);
title('Control Input', 'FontSize', 12);
xlabel('Time (s)', 'FontSize', 10);
ylabel('Force (N)', 'FontSize', 10);
grid on;
% Phase portrait (angle vs angular velocity)
subplot(2,3,6);
plot(theta*180/pi, theta_dot, 'LineWidth', 2);
title('Phase Portrait (θ vs θ̇)', 'FontSize', 12);
xlabel('Angle (deg)', 'FontSize', 10);
ylabel('Angular Velocity (rad/s)', 'FontSize', 10);
grid on;
sgtitle('LQR Control of Inverted Pendulum', 'FontSize', 14, 'FontWeight', 'bold');