Lecture 3. 상태공간 모델
로봇의 모든 상태를 벡터 하나로, 모든 방정식을 행렬 곱셈 하나로.
목차
- 왜 상태공간인가?
- 표준형 ẋ = Ax + Bu
- 예제 1 — 질량-스프링-댐퍼
- 예제 2 — 카트 위 도립진자
- 전달함수 ↔ 상태공간
- 안정성: 고유값
- 가제어성
- 가관측성
- 비선형 시스템의 선형화
- 이산화 (연속 → 디지털)
- 등속도 / 등가속도 모델
1. 왜 상태공간인가?
고전 제어에서는 라플라스 변환을 거쳐 전달함수 $G(s) = Y(s)/U(s)$로 시스템을 표현합니다. 단순하지만 두 가지 큰 한계가 있습니다.
- 입력·출력이 여러 개인 MIMO 시스템을 다루기 어렵다
- 비선형성, 시변 파라미터를 다루기 어렵다
- 현대 제어 기법(LQR, MPC, 칼만 필터 등)이 모두 상태공간 표현 위에서 정의됨
상태공간(state-space)은 시스템의 모든 내부 변수를 상태 벡터 $\mathbf x$ 하나에 모아 1차 미분방정식의 행렬 형태로 적습니다.
2. 표준형: $\dot{\mathbf x} = A\mathbf x + B\mathbf u$
$$ \dot{\mathbf{x}} = A \mathbf{x} + B \mathbf{u}, \qquad \mathbf{y} = C \mathbf{x} + D \mathbf{u} $$- $\mathbf x \in \mathbb R^n$ — 상태(state): 시스템의 미래를 결정하기 위해 알아야 할 최소한의 정보
- $\mathbf u \in \mathbb R^m$ — 입력(input): 우리가 시스템에 주는 제어 명령
- $\mathbf y \in \mathbb R^p$ — 출력(output): 센서로 측정 가능한 양
- $A$ — 시스템 행렬, $B$ — 입력 행렬, $C$ — 출력 행렬, $D$ — 직접 전달 행렬 (보통 0)
상태 공간 변환의 5단계 절차
- 물리 법칙으로 미분방정식 유도 (뉴턴/라그랑지)
- 상태 변수 $\mathbf x(t)$를 정의 (보통 위치와 그 도함수)
- 고차 미분을 1차 미분의 연립으로 풀어 적기
- $\dot{\mathbf x}$ 형태로 정리
- $A, B, C, D$ 행렬을 만든다
3. 예제 1 — 질량-스프링-댐퍼
벽에 스프링(강성 $k$)과 감쇠기(점성 $c$)로 매달린 질량 $m$이 외력 $u$를 받습니다.
$$ m\ddot{y} + c\dot{y} + k y = u $$상태를 $\mathbf{x} = [y,\;\dot{y}]^\top$로 정의하면:
$$ \dot{\mathbf{x}} = \underbrace{\begin{bmatrix}0 & 1 \\ -k/m & -c/m\end{bmatrix}}_{A}\mathbf{x} + \underbrace{\begin{bmatrix}0 \\ 1/m\end{bmatrix}}_{B}u, \quad y = \underbrace{[1\;0]}_{C}\mathbf x $$물리적 직감:
- $A$의 첫 행 $[0, 1]$은 $\dot y = \dot y$ — 위치의 미분은 속도라는 정의식
- $A$의 둘째 행 $[-k/m, -c/m]$은 뉴턴의 법칙 $\ddot y = (-ky - c\dot y)/m$를 행렬화한 것
- $B$는 외력이 가속도에 $1/m$만큼 영향을 준다는 사실
🎮 인터랙티브: 질량-스프링-댐퍼 자유 응답
스프링 강성 $k$와 감쇠 $c$를 바꿔보며 시스템 응답을 관찰하세요. 살짝 잡아당겼다가 놓는 자유 응답입니다.
감쇠비 ζ = c / (2√(mk)). ζ<1: 언더댐핑(진동), ζ=1: 임계감쇠, ζ>1: 오버댐핑.
4. 예제 2 — 카트 위 도립진자 (Inverted Pendulum on Cart)
로봇공학에서 가장 사랑받는 예제입니다. 카트에 길이 $\ell$, 질량 $m$인 막대가 핀으로 연결되어 있고, 카트에 힘 $u$를 가해 막대가 똑바로 서 있도록 제어합니다.
막대 각도 $\phi$가 작다는 가정 하에 $\sin\phi \approx \phi, \cos\phi \approx 1$로 선형화하면:
$$ \ddot x = \frac{u - m g \phi}{M}, \quad \ddot \phi = \frac{(M+m)g\phi - u}{M\ell} $$상태 $\mathbf x = [x,\;\dot x,\;\phi,\;\dot\phi]^\top$로 정의하면 4×4 $A$, 4×1 $B$의 깔끔한 선형 시스템이 됩니다.
$$ A = \begin{bmatrix} 0 & 1 & 0 & 0 \\ 0 & 0 & -\tfrac{mg}{M} & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & \tfrac{(M+m)g}{M\ell} & 0 \end{bmatrix}, \quad B = \begin{bmatrix} 0 \\ 1/M \\ 0 \\ -1/(M\ell) \end{bmatrix} $$🎮 인터랙티브: 도립진자 자유 거동
막대가 자유 낙하하는 모습입니다. 입력 $u=0$이므로 막대가 떨어집니다. 다음 강의(L8 PID, L13 MPC)에서 이 막대를 똑바로 세우는 제어기를 학습합니다.
5. 전달함수 ↔ 상태공간
전달함수 $G(s) = (s+3)/(s^3 + 3s^2 + 5s + 2)$ 같은 식이 주어지면 다음 절차로 상태공간으로 바꿉니다.
- $Y(s)/U(s)$의 분모를 0으로 놓고 미분방정식 복원: $\dddot y + 3\ddot y + 5\dot y + 2y = \dot u + 3u$
- 상태 변수 정의: $x_1 = y, x_2 = \dot y, x_3 = \ddot y$
- 1차 연립 형태로:
이런 표준 형태를 controllable canonical form이라 부릅니다.
6. 안정성 — 고유값으로 보기
입력이 없는 시스템 $\dot{\mathbf x} = A\mathbf x$의 해는 $\mathbf x(t) = e^{At}\mathbf x_0$입니다. 이 식이 $t \to \infty$에서 발산하지 않으려면 $A$의 모든 고유값 $\lambda_i$의 실수부가 음수여야 합니다.
$$ \text{안정} \iff \mathrm{Re}(\lambda_i) < 0 \;\;\forall i $$고유값을 복소평면에 그리면 직관적입니다: 왼쪽 절반에 있으면 안정, 오른쪽으로 가면 발산. 허수 축에서 멀수록 빠르게 진동/감쇠합니다.
🎮 인터랙티브: 고유값 ↔ 시간 응답
2차 시스템의 두 고유값 위치(실수부 σ, 허수부 ω)를 슬라이더로 옮기면, 그에 따른 시간 응답이 즉시 그려집니다. 왼쪽은 복소평면, 오른쪽은 단위 충격 응답입니다.
실험 가이드: σ를 0보다 크게 만들면 응답이 폭발합니다. ω를 키우면 진동이 빨라지고 ω=0이면 진동 없는 지수 감쇠가 됩니다.
7. 가제어성 (Controllability)
입력 $\mathbf u$로 임의의 상태에 도달할 수 있느냐의 문제입니다. 답은 다음 가제어성 행렬의 랭크로 결정됩니다.
$$ \mathcal C = [B,\;AB,\;A^2 B,\;\dots,\;A^{n-1} B], \qquad \mathrm{rank}(\mathcal C) = n \iff \text{가제어} $$$n$은 상태 차원입니다. 랭크가 부족하면 어떤 방향으로는 절대 갈 수 없는 "사각지대"가 생깁니다.
🎮 인터랙티브: 가제어성 시각화
두 질량이 직렬로 연결된 시스템에서 어느 질량에 힘을 가하느냐에 따라 가제어성이 달라집니다. 입력 위치를 바꿔보세요.
8. 가관측성 (Observability)
가제어성의 쌍대 개념입니다. 출력 $\mathbf y$만 보고 내부 상태 $\mathbf x$를 복원할 수 있느냐?
$$ \mathcal O = \begin{bmatrix} C \\ CA \\ CA^2 \\ \vdots \\ CA^{n-1}\end{bmatrix}, \qquad \mathrm{rank}(\mathcal O) = n \iff \text{가관측} $$가관측이 아니면 어떤 내부 모드는 출력에 전혀 나타나지 않아 추정이 불가능합니다. 이 두 개념은 칼만 필터(L4–L5)와 LQR/MPC(L12–L13)의 이론적 토대입니다.
9. 비선형 시스템의 선형화 (Linearization)
실제 로봇은 거의 모두 비선형입니다 ($\sin, \cos$, $|v|v$ 등). 그렇다면 상태공간 표현은 의미가 없을까요? 대답은 평형점(equilibrium) 주변에서는 선형으로 근사할 수 있다입니다.
1차 테일러 전개:
$$ \dot{\mathbf x} = f(\mathbf x, \mathbf u) \approx f(\mathbf x_e, \mathbf u_e) + \underbrace{\left.\frac{\partial f}{\partial \mathbf x}\right|_e}_{A} (\mathbf x - \mathbf x_e) + \underbrace{\left.\frac{\partial f}{\partial \mathbf u}\right|_e}_{B} (\mathbf u - \mathbf u_e) $$$A$와 $B$가 바로 야코비안 행렬입니다.
예시: 모바일 로봇
L2의 $(x,y,\theta)$ 운동학을 평형점 $(x_e, y_e, \theta_e, v_e=0, \delta_e=0)$ 주변에서 선형화하면 깔끔한 행렬이 나옵니다. 정지 상태에서 출발해 작은 명령을 줄 때 로컬 제어기를 만드는 표준 방법입니다.
10. 이산화 (Discretization)
컴퓨터는 연속 시간을 다룰 수 없으니 시간 간격 $\Delta t$로 잘라야 합니다. 입력이 $\Delta t$ 동안 일정(zero-order hold)이라 가정하면:
$$ \mathbf{x}_{k+1} = A_d \mathbf{x}_k + B_d \mathbf{u}_k $$ $$ A_d = e^{A\Delta t}, \qquad B_d = \int_0^{\Delta t} e^{A\tau}\,d\tau \cdot B $$$e^{At}$는 행렬 지수(matrix exponential)로 다음 급수로 정의됩니다.
$$ e^{At} = I + At + \frac{(At)^2}{2!} + \frac{(At)^3}{3!} + \dots $$11. 등속도 / 등가속도 모델
칼만 필터(L4–L5)에서 가장 자주 등장하는 두 모델입니다.
등속도 (Constant Velocity)
"속도가 거의 변하지 않는다"는 가정. $\mathbf x = [p,\;\dot p]^\top$.
$$ A_d = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} $$등가속도 (Constant Acceleration)
$\mathbf x = [p,\;\dot p,\;\ddot p]^\top$. $A$가 nilpotent ($A^3 = 0$)이라 행렬 지수가 닫힌 형태로 나옵니다.
$$ A_d = \begin{bmatrix} 1 & \Delta t & \tfrac12 \Delta t^2 \\ 0 & 1 & \Delta t \\ 0 & 0 & 1 \end{bmatrix} $$운동학적으로 익숙한 식 $p_{k+1} = p_k + \dot p_k \Delta t + \tfrac12 \ddot p_k \Delta t^2$가 행렬 첫 행에 그대로 들어 있습니다.
🎮 인터랙티브: 연속 vs 이산 응답 비교
같은 질량-스프링 시스템을 연속 시간 RK4와 ZOH 이산화로 동시에 시뮬레이션합니다. $\Delta t$가 커지면 이산 모델이 어긋나기 시작합니다.
코드 예제 (Python · scipy)
import numpy as np
from scipy.linalg import expm
# 연속 시스템: 질량-스프링-댐퍼
m, k, c = 1.0, 10.0, 0.5
A = np.array([[0, 1], [-k/m, -c/m]])
B = np.array([[0], [1/m]])
C = np.array([[1, 0]])
D = np.array([[0]])
# 1) 안정성: 고유값
eig = np.linalg.eigvals(A)
print("eigenvalues:", eig)
print("stable?", all(np.real(eig) < 0))
# 2) 가제어성
Wc = np.hstack([B, A @ B])
print("controllable?", np.linalg.matrix_rank(Wc) == 2)
# 3) 가관측성
Wo = np.vstack([C, C @ A])
print("observable?", np.linalg.matrix_rank(Wo) == 2)
# 4) 이산화 (zero-order hold)
dt = 0.05
Ad = expm(A*dt)
Bd = np.linalg.solve(A, (Ad - np.eye(2)) @ B)
# 5) 시뮬레이션
x = np.array([1.0, 0.0])
hist = [x]
for k in range(200):
x = Ad @ x # 입력 0
hist.append(x)
📖 더 깊이 공부하기
- Underactuated Robotics (MIT, Tedrake) — 2장이 선형 시스템과 안정성, 6장이 LQR을 다룹니다.
- Modern Control Engineering (Ogata) — 상태공간의 정석 교과서.
- Linear System Theory and Design (Chen) — 가제어성·가관측성의 깊이 있는 처리.