프로젝트를 시작하며

대학교 수업 시간에 배운 ‘자동 제어’ 과목은 앞으로 내가 가고 싶은 진로(로봇 제어, 자율주행, 동역학 관련 연구)와 직접적으로 연결되는 분야다. 수업에서는 루트 로커스, Bode 선도, PID 설계 같은 내용을 이론 중심으로 배웠지만, “이 수식들이 실제 로봇에서 어떻게 동작하는지”를 몸으로 느끼기에는 한계가 있었다.

특히 PID 제어기를 설계하는 계산 문제는 충분히 많이 풀었고 수업에서는 1등을 했지만,

  • 내가 설정한 게인이 실제 로봇의 거동(응답 속도, 오버슈트, 진동)에 어떤 영향을 주는지,
  • 이론에서 배운 성능 지표들이 Gazebo 같은 시뮬레이션 환경에서 실제 로봇 움직임과 어떻게 연결되는지

    직접 확인해 볼 기회가 부족하다고 생각했다.

이 부족한 부분을 채우기 위해, 이번 프로젝트에서는 하나의 연구 과제를 수행한다는 마음가짐으로 다음을 목표로 삼았다.

  • 실제 로봇을 대상으로 수학적 모델링 → PID 설계 → 시뮬레이션 → 실기 적용까지 한 사이클을 완주한다.
  • 이 과정에서 필요한 자동제어 이론은 Top-Down 방식으로,
    • 먼저 “어떤 성능을 내야 하는지(응답 시간, 오버슈트 등)”를 정하고
    • 그 성능을 달성하기 위해 필요한 이론과 도구를 그때그때 학습하는 방식으로 정리한다.

프로젝트 전 과정은 Notion에 정리하고, 이후에는 GitHub 블로그에 포트폴리오 형식으로 게시하여,

이론 + 시뮬레이션 + 실기 적용까지 모두 경험한 자동제어 프로젝트로 남길 예정이다.

로봇 선정

image.png

OIP.jpg

로봇은 아마존의 페가수스 모델로 선정하였다.

  • 인터넷 제어 강의에서 제공되는 로봇 상세 스펙을 쉽게 참고할 수 있어서 실제 치수 기반의 모델링이 가능했다.
  • 학부 수준에서 분석하기에 형태가 단순해서 질량, 관성, 구동부 등을 이상화 하기에 적합하다고 생각했다.

이 로봇을 기반으로

  • MATLAB/Simulink를 활용한 모델링 및 제어기 설계,
  • Gazebo를 이용한 시뮬레이션 검증까지 연결하는 것을 이 프로젝트의 큰 흐름으로 삼을 예정이다.

로봇 스펙

image.png

image.png

  • 가로 60cm, 세로 75cm, 높이 19cm
  • 무게 102kg 가정
  • 바퀴 2개, 1개당 무게 4kg 가정
    • 무게는 자료가 나와있지 않아서 적당한 값을 가정했다.
  • 바퀴 지름 16cm
  • 적재 능력 560kg
  • 최대 속도 1.3 m/s

모터 사양

  • 정격출력 52W
  • 전압 30~48V
  • 정격 전류 8A
  • 정격 속도 77rpm
  • 최대 속도 239rpm

주요 변수와 FBD

image.png

image.png

  • $N$: 수직항력
  • $m_b$: 차체 질량
  • $m_w$: 바퀴 질량
  • $g$: 중력가속도
  • $x, y$: 좌표계
  • $C.G$: 무게 중심
  • $\dot{x},v_b$: $x$방향 속도
  • $\ddot{x},\dot{v_b}$: $x$방향 가속도
  • $\omega_b$: 차체 각속도
  • $\dot{\omega_b}$: 차체 각가속도
  • $F_L$: 왼쪽 바퀴에 작용하는 힘
  • $F_R$: 오른쪽 바퀴에 작용하는 힘
  • $T_L$: 왼쪽 바퀴에 작용하는 토크
  • $T_R$: 오른쪽 바퀴에 작용하는 토크
  • $w_L$: 왼쪽 바퀴의 회전 속도
  • $w_R$: 오른쪽 바퀴의 회전 속도
  • 바퀴 1개의 경우를 통해 $N=mg$와 $F_{R,L} = \mu mg$를 얻었다.

가정

  1. 모터 손실은 무시한다.
  2. 바퀴는 지면과 W/O Slip 조건을 만족한다.
  • 두 번째 가정으로부터 바퀴 중심의 병진 운동 속도 $V$는 반지름 $r$ * 각속도 $w$를 만족하게 된다.

운동방정식

바퀴의 회전 운동 방정식

\[\sum M_R : \quad I_w \dot{\omega}_R + b \omega_R + F_R r = T_R\] \[\sum M_L : \quad I_w \dot{\omega}_L + b \omega_L + F_L r = T_L\] \[\therefore \quad F_R = \frac{1}{r} (T_R - I_w \dot{\omega}_R - b \omega_R), \quad F_L = \frac{1}{r} (T_L - I_w \dot{\omega}_L - b \omega_L) \quad (I_w : \frac{1}{2}m_wr^2) \tag1\]
  • 모터 토크, 지면 마찰력, 점성 마찰을 모아 회전 운동 방정식을 세웠다.
  • 회전 운동방정식으로부터 바퀴에 작용하는 힘을 구할 수 있다.

image.png

\[v_b = \frac{v_L + v_R}{2} = \frac{r}{2}(w_L+w_R) \tag2\] \[w_b = \frac{v_R-v_L}{2l} \tag3\]
  • 하나의 축에 2개의 바퀴가 나란히 있고 차체가 축 중앙에 있는 차동 구동 방식이므로 위의 두 식이 성립한다.

차체 병진 운동 방정식 ($M=m_w+2m_b$)

image.png

$I_{w}$ : 바퀴 관성 모멘트

\[\sum F_x: \quad F_L + F_R = M \dot{v}_b\]
  • (1), (2)의 값을 대입한 후 정리하면
\[(M + \frac{2 I_w}{r^2}) \dot{v}_b + \frac{2b}{r^2} v_b = \frac{1}{r} (T_R + T_L)\]
  • $(M + \frac{2 I_w}{r^2})$ 부분을 보면 원래 차체의 질량과 회전 관성이 더해져서 실제 질량보다 더 무거워진다는 의미이다.

차체 회전 운동 방정식

image.png

\[\sum M_b : \quad I_{eq} \dot{\omega}_b = F_R l - F_L l\]
  • (1), (3)의 값을 대입한 후 정리하면
\[(I_{eq} + \frac{2l^2 I_w}{r^2}) \dot{\omega}_b + \frac{2l^2 b}{r^2} \omega_b = \frac{l}{r} (T_R - T_L)\]
  • 병진 운동과 마찬가지로 로봇을 제자리에서 돌리려고 할 때, 몸체와 바퀴를 모두 돌려야 하기 때문에 각가속도항 앞의 관성 모멘트가 증가하는 것을 볼 수 있다.

    image.png

    $I_{eq}$ : 등가 관성모멘트

    $I_b$ : 차체 관성 모멘트

    $I_{wb}$ : 바퀴의 두 축의 관성 모멘트 합 (by 평행축 정리)

    \[I_{eq} = 2I_{wb} + I_b\] \[I_{eq} = \frac{1}{3} m_b (d^2 + \ell^2) + 2 m_w \ell^2 + \frac{1}{2} m_w r^2\]
    • $I_{eq}$ 값은 바퀴가 스스로의 축으로 회전하면서 차체 중심을 기준으로 회전하는 관성과
    • 차체 몸체를 직육면체로 가정했을 때 몸체의 관성의 합이다.
  • 이로써 로봇의 모든 운동방정식을 구했다.

잠시 모터를 공부하면

기계공학과에서는 보통 모터에 나오는 출력 자체를 입력으로 보고 방정식을 차체와 바퀴에 대해서만 구하는 경우가 대부분이었다. 하지만 실제 제어는 전기 입력부터 시작되는 것이기 때문에 기초적인 모터의 회로 방정식 정도는 알 필요가 있을 것 같다.

\[V(t) = R i(t) + L \frac{di(t)}{dt} + V_{emf}(t)\]
  • 키르히호프의 전압 법칙이다.
  • 이 내용을 조금 더 직관적으로 쓰면 아래와 같다.
\[V(t) \quad = \quad \underbrace{R i(t)}_{\text{손실}} \quad + \quad \underbrace{L \frac{di}{dt}}_{\text{전기적 관성}} \quad + \quad \underbrace{K_e \omega}_{\text{속도에 의한 반발}}\]
  • 배터리가 전압을 줘서 모터를 돌리려고 한다. 그 결과 전압은 3군데로 나누어 소비된다.
  • ${R i(t)}$ : 마찰 손실
    • 전선을 통과하면서 열로 날아가는 에너지이다. 물이 흐르면 무조건 생기는 손실 같은 것이다.
  • $L \frac{di}{dt}$ : 전기적 관성
    • 전류가 갑자기 변하는 것을 방해하는 성질. 유체역학의 수격현상처럼 전기 흐름을 갑자기 바꾸려면 힘이 든다.
  • $K_e \omega$ : 역기전력 (back EMF)
    • 내가 전기를 써서 모터를 돌리지만, 모터가 돌면서 동시에 발전기 역할도 한다. 따라서 모터 내부에서 입력 전압을 밀어내는 반대 방향 전압이 생긴다. 그래서 모터는 무한히 빨라진 수 없고, 최고 속도 제한이 생긴다.

과정

  1. 전압을 주면 전류가 흐르려 하고
  2. 전류가 흐르면 토크가 생겨서 모터가 돈다.
  3. 모터가 돌기 시작하면 역기전력이 생겨서 전류 들어오는 걸 방해한다.
  4. 결국 입력 전압 = 저항 손실 + 역기전력이 되는 지점에서 모터 속도가 일정해진다.

image.png

  • 우리의 로봇 시스템이 위와 같은 구조로 모터와 바퀴가 이어져 있을 때

    \[V_{\text{emf}}(t) = K_e\omega_m(t)\] \[\tau_m(t) = K_t i(t) \tag4\]

    위와 같은 전기적 등식이 성립하고,

    \[\tau(t) = N\tau_m(t) \tag5\] \[\omega(t) = \frac{\omega_m(t)}{N}\]
  • 토크는 기어비 때문에 늘어나고, 회전수는 기어비 때문에 줄어든다.
  • 이제 우리는 제어 이론을 적용하여 로봇을 제어할 것이기 때문에 시스템의 전달함수를 구해야한다.

전달함수

  • 선형 시불변(Linear Time-Invariant, LTI) 시스템에서 초기 조건이 0일때, 입력 신호와 출력 신호의 비율을 의미
    • 선형 시불변이란 간단히 말해서, 선형이고 시간에 영향이 없어서
    • 아침에 가속 페달 1초 조작에 10km/h 되던 차는 저녁에도 1초 조작에 10km/h 되어야 한다는 것을 의미한다.
  • 전달함수가 아래와 같은 형태일 때

    \[G(s) = \frac{N(s)}{D(s)} = K \frac{(s - z_1)(s - z_2) \cdots (s - z_m)}{(s - p_1)(s - p_2) \cdots (s - p_n)}\]
    • $z_i$ : 시스템의 영점(zeros)
    • $p_i$ : 시스템의 극점(poles)
    • 분모 $D(s)=0$ 을 시스템의 특성 방정식으로 정의

전기 모터 전달함수

  • 앞서 구한 전기 모터의 회로 방정식을 라플라스 변환하여 전달함수를 구해보자.

    \[V(t) = Ri(t) + L\frac{di(t)}{dt} + K_eN\omega(t)\]

    라플라스 변환하면,

    \[V(s) = RI(s) + LsI(s) + K_eN\Omega(s)\]

    $I(s)$에 대해 정리하고, (4)를 (5)에 대입해 라플라스 변환한 $T(s)$에 대입하면,

    \[I(s) = \frac{V(s) - K_eN\Omega(s)}{Ls + R}\] \[T(s) = K_tNI(s)\] \[T(s) = \frac{K_tNV(s) - K_eK_tN^2\Omega(s)}{Ls + R}\]
  • 위와 같은 형태로 전기 모터의 전달함수를 구할 수 있다.
    • 입력 : 전압 $V(s)$
    • 출력 : 토크 $T(s)$
  • 내가 흔히 보던 전달함수의 형태는 아니다. 분자의 $\Omega(s)$ 는 모터가 회전하는 속도이다.
  • 위에서 모터 속도가 빨라지면 역기전력이 생기는 것을 알게 되었는데, 분자의 $-\Omega(s)$ 항은 속도가 빨라질수록 토크를 갉아먹는 반대 힘이 생긴다는 것을 의미한다.
    • 마치 전기적 피드백처럼 작용하여 모터가 돌면서 속도가 생기다가
    • 속도가 생기면 다시 역기전력을 만들어서 전류를 줄인다.
  • 현재의 $T(s)$는 엄밀한 의미로는 출력/입력 형태가 아니기 때문에 최종 전달함수가 아닌 상태이다.

병진 운동 전달함수

  • 앞서 구한 차체 병진 운동 방정식을 라플라스 변환하면

    \[\left(M + \frac{2I_w}{r^2}\right)sV_b(s) + \frac{2b}{r^2}V_b(s) = \frac{1}{r}(T_R(s) + T_L(s))\] \[T_R(s) = \frac{K_t N V_R(s) - K_e K_t N^2 \Omega_R(s)}{Ls + R} \qquad T_L(s) = \frac{K_t N V_L(s) - K_e K_t N^2 \Omega_L(s)}{Ls + R}\]

    위와 같은 식이 되고, 전기 모터의 전달함수 $T_R$, $T_L$ 을 운동 방정식에 대입하고, (2) 식을 사용하여 $\Omega_{R,L}(s)$를 $V_b$ 에대한 식으로 적어주면

    \[\left((Mr^2 + 2I_w)Ls^2 + ((Mr^2 + 2I_w)R + 2bL)s + 2bR + 2K_e K_t N^2\right)V_b(s) = K_t N r (V_R(s) + V_L(s)) \tag6\]
  • 식의 상수항을 보면
    • $2bR$로 나타난 기계적 마찰과 전기 저항의 곱
    • 물리적인 마찰이 없더라도 모터 내부의 자기장적인 상호작용 때문에 일어나는 저항력 $2K_eK_tN^2$이 있다.
    • 공학적으로 마찰 $b$를 줄이려고 애쓰지만, 실제 제어에서는 $N$이 크다면 모터의 역기전력에 의한 전기적 제동력이 훨씬 클 수 있다.
    • 따라서 시스템이 예상보다 훨씬 무겁고 뻑뻑할 수 있다는 걸 예측할 수 있다.
  • 식의 2차항을 보면
    • $(Mr^2 + 2I_w)L$ 로 나타난 기계적 관성 M과 전기적 관성 L의 곱
    • 보통 소형 DC 모터에서 $L$은 매우 작은 값을 가지므로 0으로 근사하게 되면, $s^2$항을 고려하지 않은 1차 시스템으로 근사화 할 수 있다.
    • 1차 시스템으로 근사화하게 되면, 설계가 단순해지고 D 게인을 잡을 때 노이즈에 덜 민감해질 수 있어서 좋다.
  • 기어비 $N$을 보면
    • 우변 입력 힘은 기어비 $N$에 비례해서 힘이 커지지만
    • 좌변 저항력 $2K_eK_tN^2$ 도 $N$에 비례해서 커진다.
    • 공학적으로 힘을 세게 하려고 기어비를 무작정 높이면 토크는 올라가지만, 관성이나 감쇠가 제곱비로 증가해서 토크는 강한데 반응 속도가 엄청 느려질 수 있다.
  • 우리는 물리적 전압 $V$ 를 소프트웨어적 제어 입력 $\delta$ 로 변환해서 식을 세우고 싶다.

    왜냐하면 MCU로 모터를 제어할 때, 아날로그 전압을 마음대로 조절해서 내보내는 게 아니라 PWM을 사용하기 때문에 모터에 걸리는 실제 평균 전압 $V_{motor}$ 는 ($V_{in} =$ 배터리 전압)

    \[V_{motor} \approx V_{in} \times \delta\]

    제어 변수의 분리를 위해서 로봇의 움직임을 직진 $\delta_t$ 와 회전 $\delta_r$ 로 나누면

    \[V_R = V_{in}(\delta_t + \delta_r) \qquad V_L = V_{in}(\delta_t - \delta_r) \tag7\]

    (6) 식의 우변 $V_R + V_L$ 에서 $\delta_r$ 이 사라지므로 직진 성분인 $\delta_t$ 만 남게 된다.

    \[\left((Mr^2 + 2I_w)Ls^2 + ((Mr^2 + 2I_w)R + 2bL)s + 2bR + 2K_e K_t N^2\right)V_b(s) = 2K_t N r V_{in} \delta_t(s)\]

    최종적으로 병진 운동 방정식을 전달 함수 형태로 정리하면,

    \[\frac{V_b(s)}{\delta_t(s)} = \frac{2K_t N r V_{in}}{(Mr^2 + 2I_w)Ls^2 + ((Mr^2 + 2I_w)R + 2bL)s + 2bR + 2K_e K_t N^2}\]
  • 식의 분자를 보면
    • 배터리 전압은 시스템의 Gain 역할을 한다.
    • 무차원 입력인 $\delta_t$ 를 물리적 전압 차원으로 변환하기 위해 제어 이득 $V_{in}$ 이 포함된다.
    • 배터리가 꽉 차서 $V_{in}$ 이 높다면 같은 $\delta_t$ 를 줘도 확 튀어 나가고
    • 배터리가 낮아서 $V_{in}$ 이 낮다면 같은 $\delta_t$ 를 줘도 로봇이 비실 거린다.

회전 운동 전달함수

  • 앞서 구한 차체 회전 운동 방정식을 라플라스 변환하면

    \[\left(I_{eq} + \frac{2l^2I_w}{r^2}\right) s\Omega_b(s) + \frac{2l^2b}{r^2} \Omega_b(s) = \frac{l}{r} (T_R(s) - T_L(s))\] \[\Omega_b(s) = r \frac{\Omega_R(s) - \Omega_L(s)}{2l} \quad \Rightarrow \quad \Omega_R(s) - \Omega_L(s) = \frac{2l\Omega_b(s)}{r}\]

    위와 같은 식에 $T_R(s)$ 와 $T_L(s)$ 를 대입 후 (3) 식을 이용하여 $\Omega_{R,L}(s)$ 를 정리하면

    \[\left((I_{eq}r^2 + 2l^2I_w)Ls^2 + ((I_{eq}r^2 + 2l^2I_w)R + 2l^2bL)s + 2l^2bR + 2l^2K_eK_tN^2\right)\Omega_b(s) = rlK_t N(V_R(s) - V_L(s))\]
  • 식의 2차항을 보면
    • $I_{eq}r^2$ 은 로봇 몸체를 회전시키는데 드는 관성
    • $2l^2I_w$ 은 바퀴의 관성이 로봇 중심에서 거리 $l$ 의 제곱만큼 증폭 된다.
    • 공학적으로 직진할 때는 바퀴 관성이 $2I_w$ 였는데, 회전할 때는 $2l^2 I_w$ 가 되는 것을 알 수 있고
    • 바퀴 간격이 넓은 로봇은 바퀴를 돌려서 몸체를 돌리는 작용 때문에 관성이 거리의 제곱에 비례하게 커져서, 회전 가속 반응이 느릴 수 밖에 없다는 것을 알 수 있다.
  • 식의 1차항을 보면
    • $(I_{eq}r^2 + 2l^2I_w)R + 2l^2bL$ 에서 $b$ 와 $L$ 은 보통 값이 작아서 거의 무시되고
    • 지배적인 항은 앞부분의 (기계적 관성) x (저항)이다.
    • 공학적으로 이 항은 시정수와 관련이 있기 때문에
    • 저항 $R$ 이 클 수록 전류가 늦게 흘러서 토크 생성이 늦어지고, 관성이 클 수록 속도 변화가 느려진다.
    • 1차항이 클 수록 핸들을 돌렸을 때 로봇이 실제로 돌기까지 걸리는 딜레이가 길어진다는 것을 알 수 있다.
      • 2차항은 실제 힘은 들어가지만 관성에 의해 무거워서 도는게 느린 느낌이라면, 1차항은 애초에 돌리기 시작하기까지가 오래 걸린다는 의미이다.
  • 식의 상수항을 보면
    • $2l^2bR + 2l^2K_eK_tN^2$ 에서 직진 때와 비슷하게 $2l^2K_eK_tN^2$ 항이 전기적 점성 역할을 한다.
    • 물리적 마찰인 $b$ 가 없어도 모터 회로 자체가 회전을 멈추게 하려는 성질을 가진다.
    • 공학적으로 여기도 $l^2$ 이 붙어있기 때문에
    • 로봇 바퀴 간격이 넓을수록 회전 할 때 바퀴가 더 빨리 돌아야하고, 그만큼 역기전력도 강하게 걸린다.
    • 따라서 넓은 로봇은 회전시키려면 힘도 많이 들지만, 전압을 끄면 그만큼 큰 제동력이 걸린다는 것을 알 수 있다.
  • 식 정리 전의 우변을 보면
    • $rlK_t N (V_R(s) - V_L(s))$ 에서 전압 차이 $V_R(s) - V_L(s)$ 가 $K_t, N$ 과 곱해져 토크가 되고
    • 바퀴 반경 $r$ 을 나눠 힘이 되고
    • 다시 오른쪽 바퀴와 왼쪽 바퀴가 땅을 미는 힘이 서로 다르면 회전하게 되므로 $l$ 을 곱해서 모멘트를 만든다.

      \[\text{최종 회전력} = \underbrace{(T_R - T_L)}_{\text{모터 토크}} \times \underbrace{\frac{1}{r}}_{\text{힘으로 변환}} \times \underbrace{l}_{\text{모멘트로 변환}}\]
    • 식을 정리하기 위해 양변에 $r^2$ 을 곱하면 현재의 우변이 된다.
    • 공학적으로 $l$ 을 늘리면 돌리는 힘도 강해지지만 돌리기 힘들어지는 정도인 관성은 제곱으로 강해진다.
  • 병진 운동의 경우와 마찬가지로 제어 입력 $\delta$ 로 식을 변형하면, 식 (7)을 이용하여

    \[\left((I_{eq}r^2 + 2l^2I_w)Ls^2 + ((I_{eq}r^2 + 2l^2I_w)R + 2l^2bL)s + 2l^2bR + 2l^2K_eK_tN^2\right)\Omega_b(s) = 2rlK_t N \delta_r(s)V_{in}\] \[\frac{\Omega_b(s)}{\delta_r(s)} = \frac{2rlK_t NV_{in}}{(I_{eq}r^2 + 2l^2I_w)Ls^2 + ((I_{eq}r^2 + 2l^2I_w)R + 2l^2bL)s + 2l^2bR + 2l^2K_eK_tN^2}\]
  • 식의 분자를 보면
    • 바퀴가 클수록 한 바퀴 돌 때 이동 거리가 기니까 회전 속도가 빠르다.
    • 로봇 폭이 길면 지렛대 효과처럼 돌리는 힘인 토크가 커진다.
    • 전압에는 당연히 비례한다.
    • 그렇다면 로봇 폭이 길면 토크가 강하니 회전을 더 잘 하는가? → 분모를 봐야한다.
  • 식의 분모를 보면
    • 로봇 폭이 길수록 관성이 $l^2$ 에 비례해서 회전 가속이 오히려 손해이다.
  • 결론적으로
    • 좁은 골목을 다니는 배달 로봇 같이 회전이 중요하다면 $l$ 을 줄이는게 유리하고, 짐을 나르는 로봇 같이 안정성이 중요하다면 $l$ 을 길게 하는게 유리하다는 것을 알게 되었다.

전달함수 정리

\[DC 모터 \ 전달함수 \qquad T(s) = \frac{K_tNV(s) - K_eK_tN^2\Omega(s)}{Ls + R}\] \[병진 \ 운동 \ 전달함수 \quad \frac{V_b(s)}{\delta_t(s)} = \frac{2K_t N r V_{in}}{(Mr^2 + 2I_w)Ls^2 + ((Mr^2 + 2I_w)R + 2bL)s + 2bR + 2K_e K_t N^2}\] \[회전 \ 운동 \ 전달함수 \quad \frac{\Omega_b(s)}{\delta_r(s)} = \frac{2rlK_t NV_{in}}{(I_{eq}r^2 + 2l^2I_w)Ls^2 + ((I_{eq}r^2 + 2l^2I_w)R + 2l^2bL)s + 2l^2bR + 2l^2K_eK_tN^2}\]

Updated: