안녕하세요. 이제 Matlab에서 실제 예제를 코딩하기 시작하겠습니다
제어 가능성을 확인하고 동역학을 안정화하는 컨트롤러를 설계할 것입니다
이는 정말 재미있고 강력할 것입니다. 지금까지 많은 수학적 내용을 다뤘습니다
왜, 언제, 어떻게 제어해야 하는지 이해하기 위해서였죠. 이제는
실제로 적용해 볼 차례입니다
Matlab에서 시스템을 제어하는 것이 얼마나 쉬운지
직접 보게 될 것입니다
제가 좋아하는 시스템 중 하나는
도립진자입니다. 하지만 이 도립진자는
카트 위에 놓여 있습니다
도립진자가 카트 위에 있고
우리는 그 카트를 움직일 수 있습니다
이렇게 하면 단순히 아래에서 토크로 제어하는 것보다
더 물리적으로 느껴집니다. 그건 너무 쉬워 보이죠
이 방식이 더 흥미롭습니다
카트를 움직여서 도립진자를 안정화시키려고 하는 거죠
좀 더 재미있지 않나요?
자, 어떤 숫자들이 필요한지 생각해봅시다
먼저 시스템의 상태를 정의해야 합니다
시스템의 상태는
다음과 같이 주어집니다
이 카트의 위치를 x라고 부르겠습니다.
그리고 이 진자 팔의 각도를,
theta라고 부르겠습니다. 따라서 우리의 고차원
동적 시스템 상태는,
바꿔서 벡터 y라고 부르겠습니다.
이 상태 y dot.
아니, y라고 부르지 않겠습니다. 그러면
출력 측정값과 혼동될 수 있으니까요. x로 유지합시다. 상태
벡터는 다음과 같다고 하겠습니다
이 위치 x, 그 속도
x dot, theta,
그리고 theta dot. 알겠죠? 이는 2자유도
시스템입니다. x와 theta, 두 개의 자유도가 있습니다.
카트의 위치와 진자의 각도입니다. 그리고 이것이 2
자유도이기 때문에 뉴턴의 제2법칙에 따라
4개의 연관된 미분방정식을 얻게 됩니다. 알겠죠? 본질적으로
저는 d/dt
x가 어떤
x 벡터의 비선형 함수와 같다고 합니다. 이는 4개의
비선형 행 방정식입니다. 이것들을 실제로 유도하는 방법에 대한
세부사항은 지루할 수 있으니 생략하겠지만, 여러분은
오일러-라그랑주 방정식이나 해밀턴 방정식 같은 것을 사용할 수 있고,
이런 결합된 1차 비선형 미분방정식을 얻을 수 있습니다.
알겠죠? 이것은 진정한 비선형 문제입니다.
하지만 우리는 시스템을 선형화할 수 있고 직관적으로,
몇 가지 주요 고정점이 있다는 것을 알고 있습니다.
알겠죠? 시스템의 고정점들은,
고정점들은,
진자의 아래쪽 위치에 해당하는
고정점이 있을 것입니다. 우리가 알고 있는 건
θ가 진자 아래쪽일 때는 0이거나
진자 위쪽일 때는 π여야 합니다.
θ점은 0이어야 하고,
x점도 0이어야 합니다.
이 모든 방정식을 적어보면, 이 변화율들이
실제로 x 자체에 의존하지 않는다는 것을 알 수 있습니다.
그래서 x는 자유 변수입니다.
그리고 이것은 이치에 맞죠? 이것이 여기에 있든
여기에 있든 저기에 있든 상관없습니다. 진자가
위나 아래에 있고 속도가 없다면, 그것은 고정점입니다.
그래서 두 가지 기본적인 고정점이 있습니다.
θ가 0인 경우는
진자가 아래쪽에 있고
카트가 고정된 상태입니다.
그리고 theta가 PI일 때는
카트가 고정된 상태에서 진자가 위로 향합니다.
알겠죠? 그래서 만약
오일러-라그랑주 방정식과 이런 고정점들이 있다면, 자코비안을 계산해서
본질적으로 얻을 수 있습니다.
즉, df/dx를 고정점에서
평가하여 선형 방정식
시스템을 얻을 수 있습니다. X dot = Ax + Bu.
알겠죠? 그리고 이제,
u가 무엇인지 말씀드리지 않았는데, 이것이 매우 중요합니다.
u는 이 시스템의 제어 입력으로, 우리가 제어하려는 것인데,
우리는 u가
카트에 가해지는
X 방향의
힘이라고 할 것입니다.
알겠죠? 이것은 실제로 매우 합리적입니다.
내가 할 수 있는 것은 이 바퀴 중 하나에
모터를 달고 컨트롤러를 가질 수 있습니다. 그래서
내가 두 배의 힘을 원한다고 지정하면,
두 배의 전압을 주고 이것을 움직일 수 있습니다.
알겠죠? 이것은 실제로 매우 현실적입니다. 이 진자를
지지하고 움직일 수 있는 카트를 만들 수 있고, 당신은
힘으로 작동시킵니다. 자, 이제 제가 할 일은
Matlab을 실행해서 이미 준비해 둔
모든 예제들을 보여드리는 것입니다.
저는 이 좋은 함수를 가지고 있습니다. Matlab에서는
이런 우변 함수들을 만듭니다. 이것이 제 비선형 미분방정식입니다.
이것은 cart pend라고 불리는 카트 진자 시스템입니다.
이것은 상태가 주어졌을 때 시간 도함수를 제공합니다.
여기서는 y라고 불립니다. 그래서 제가
y라고 부르고 싶었습니다. Matlab에서는 때때로 이 상태들을 y라고 부릅니다.
이는 Matlab의 관례이고 몇 가지
다른 숫자들이 있습니다. 여기 밖에 여러 매개변수들이 있습니다. 이 작은 질량이
질량 m을 가지고 있다고 말합니다.
카트는 질량 M을 가집니다.
이 도립 진자는 길이 l을 가집니다.
중력이 아래로 당긴다는 것을 알고 있고
그리고 d가 있는데, 이는 본질적으로 감쇠항입니다.
그래서 이 방정식들에는 마찰이 있을 수 있습니다.
제 생각에는 감쇠가 x dot에 반대되는 것 같습니다.
즉, 카트에 대한 감쇠입니다. 아마도 이 카트에
마찰이 있겠죠. 그리고 진자는 마찰이 훨씬 적다고 가정합니다.
마지막으로 u가 있습니다. 만약 제가
힘을 가한다면, 오일러-라그랑주 또는 해밀턴의
일부 포싸이스를 적용했습니다. 모든 세부 사항을 지루하게 설명하지는 않겠습니다.
유튜브에 이 링크가 게시될 것이니 코드를
다운로드해서 직접 살펴보실 수 있습니다. 하지만 오른쪽의 이 역학은
꽤 복잡합니다. 이 시스템에 대해 손으로 직접 종이에
유도하려면 실제로 시간이 오래 걸립니다.
이 전체 데모에서 가장 시간이 많이 걸리는 부분은 실제로 이
오른쪽 벡터 필드를 얻는 것입니다, 맞죠?
하지만 세부 사항으로 지루하게 하지 않겠습니다. 보시다시피
계속 이어가면 꽤 길고 복잡한 표현이 됩니다.
알겠죠? 그리고 입력, 즉 힘은
x dot과 θ dot 방정식에 들어갑니다.
오일러-라그랑주 방정식을 거치면 그렇게 나오죠.
큰 문제 없습니다. 단지 비선형적인 우변일 뿐입니다.
그리고 이것은 MATLAB에서 강제력이 있든 없든
시스템을 비교적 쉽게 시뮬레이션 할 수 있습니다. 이제
Sim cartpend라는 함수로 가보겠습니다.
여기서는 몇 가지 매개변수만 지정합니다. 질량 1은 이것이고,
질량 5는 이것입니다. 길이는 2, 중력은 정상이고,
카트에는 적당한 감쇠가 있습니다.
그리고 MATLAB에서는
ODE45를 사용해 벡터 필드를 적분할 수 있습니다. 따라서
시간 범위를 설정하면 이것을 적분할 수 있습니다.
그래서 저는 시간 0부터 10까지 적분하려고 합니다
이 초기 조건으로요. 다시 말하면, 이 초기 조건은
x가 0이고, x dot이 0이며,
theta가 파이입니다. 즉 위쪽이고, theta dot은
0.5입니다. 그래서 위쪽 위치에서 시작하지만,
오른쪽으로 움직이고 있습니다. 아니면,
양의 theta 방향으로, 아마 왼쪽일 수도 있겠네요. 어쨌든,
그 다음에 ode 45를 작성합니다.
x, y dot이 이 y의 함수와 같다고
적분하고 싶다고 말합니다.
그리고 이 매개변수들을 고정하고 제어는 없습니다.
지금은 그냥 이것을 자유 물리학에서
힘 없이 시뮬레이션할 겁니다. 좋아요. 그리고 아래쪽에,
drawcartpend라는 함수를 작성했습니다.
본질적으로, 그냥 진자의 동영상을 그립니다.
다시 말하지만, 이걸 다운로드해서 제가 한 일을 볼 수 있습니다. 그럼
실제로 이 sim cart pend를
실행해 보겠습니다. 잘 실행되길 바랍니다.
보시다시피 이것은 기본적으로 예상한 대로입니다. 이것을
놓으면 그냥 계속 흔들리고 흔들리고 흔들립니다. 결국,
더 오래 적분하면 멈출 것입니다. 아마도
그걸 보여드리겠습니다. 쉬우니까요. 더 오래
조금 더 길어집니다.
좋습니다. 계속해서 흔들리고 흔들리고
흔들릴 것이고, 결국 마찰력이 작용해서
멈추게 될 겁니다. 여기서 멈춘 이유는
제가 적분을 중단했기 때문입니다. 이것이 우리가 제어할 시스템입니다.
좋습니다. 이제 이 시스템을 제어할 준비가 되었습니다.
우리가 할 일은, 고정점을 알고 있습니다.
오프라인에서 이 자코비안 행렬을 계산했습니다.
꽤 복잡했지만, 이 고정점들을 대입했습니다.
그래서 진자가 위로 향한 상태에 대한 선형화된 방정식과
진자가 아래로 향한 상태에 대한 선형화된 조건을 가지고 있습니다.
우리가 할 일은 시뮬레이션을 하는 것입니다.
그 선형화를 기반으로 제어기를 설계하고
그 다음 완전한 비선형 시스템에 적용할 것입니다.
알겠죠? 먼저 해야 할 일은 이 자코비안을 얻는 것입니다.
그리고 진자가 위나 아래를 향한 상태의 고정점을 대입해서
이 선형 시스템을 얻습니다.
그 다음 해야 할 일은 이것이 제어 가능한지 확인하는 것입니다.
그래서 우리가 할 일이 바로 그것입니다.
자, 여기 pull place cart pend라는
코드가 있습니다.
이것을 사용할 겁니다.
좋습니다. 그리고 제가
여기서 오프라인으로 한 일은 기본적으로
이 선형화된 방정식 시스템의 A 행렬과 B 행렬을 만든 것입니다.
그리고 이는 선형화된 방정식 시스템을 위한 것입니다.
그리고 상향 선형화와 하향 선형화가
많은 공통점을 공유하기 때문에, 저는
이 작은 스위치를 두기로 했습니다. 진자가 위에 있으면 스위치는
1이고, 진자가 아래에 있으면 스위치는 -1입니다.
그래서 기본적으로 이것이 선형화된 행렬, 즉 A
행렬입니다. 두 조건 모두에 대해서요.
그리고 진자 위에서 아래로 가고 싶다면, 단순히
이 s, 이 s, 그리고 이 s를
음수 값으로 바꾸면 됩니다. 알겠죠? 이것이 A
행렬과 B 행렬입니다. 이제 이 시점에서 제가 하고 싶은 것은,
우선,
이 코드를 실행하는 것입니다. 제 pol을 실행할 겁니다.
pol을 실행하겠습니다.
A 행렬과 B 행렬을 불러올 것입니다. 아, 전체가 실행된 것 같네요.
그래서 A 행렬을 불러오고
고유값을 살펴보겠습니다.
이것들이 진자가 위에 있는 조건에서의 A 행렬의 고유값들입니다.
그리고 이 고유값들 중 하나가 불안정하다는 것을 주목하세요.
그래서 그것은 결국, 수직에서 epsilon만큼 벗어나면,
가속도를 받아 멀어지게 됩니다.
자, 정말 중요한 것은 a와 b가 제어 가능한지 알고 싶다는 겁니다.
이건 우리가 지금까지 작업해 온 것이고, 이제 쉽게 테스트할 수 있어야 합니다.
그래서 먼저 a와 b의 ctrb를 시도해 보겠습니다.
우선, 시도해 볼 것은
a와 b의 ctrb입니다.
이것은 제어 가능성 행렬을 제공합니다. 큰 행렬입니다.
그냥 엔터를 누르겠습니다. 보시게 될 겁니다.
맞습니다. 큰 행렬입니다. 4x4 행렬입니다.
이 CTRB 행렬의 랭크를 살펴보면,
이 랭크가 4라면 시스템이 제어 가능합니다. 랭크가
4가 아니라면 시스템은 제어 불가능합니다.
좋습니다. 이 a 행렬과 b 행렬로,
카트의 x 방향 힘에 해당하는,
제어 가능성 행렬의 랭크가 4이기 때문에,
이 제어 가능성 부분공간으로 모든 상태 공간을
포괄할 수 있습니다. 이는 실제로 시스템을 제어하기 위한
컨트롤러를 개발할 수 있다는 의미입니다. 다음은 무엇일까요?
다음 영상에서 다룰 내용입니다. 제어 가능하다는 것을 알았습니다.
그래서 이는 제어 법칙을 만들 수 있다는 의미입니다.
u = -kx와 같은 형태로
폐루프 시스템은 x dot equals a
minus bkx입니다.
그리고 내가 k를 설계할 수 있어서
이것의 고유값을 원하는 곳에 배치할 수 있습니다. 그래서 다음으로
할 일은 안정적인 고유값을 지정하는 것입니다.
이 고유값들을 안정적인 왼쪽
반평면으로 이동시키고 싶습니다. 우리는 하나의 불안정한 고유값이 있었죠. 그것을
x에 대한 비례 피드백으로 안정적인 왼쪽 반평면으로 이동시킬 것입니다.
이 다이어그램이 어떻게 생겼는지 기억하기 위해,
우리 시스템이 있습니다.
이 경우에는 카트 진자입니다. 우리는
전체 상태 x를 측정할 것입니다. 그리고 그것을 피드백할 것입니다.
그래서 u는
minus kx가 될 것입니다. 네,
우리는 말 그대로 u equals minus 이 행렬
k 곱하기 x의 측정값이라고 할 것입니다. 우리는 모든 것을 측정하고
그것이 이러한 고유값들을 가지도록 시스템을 안정화할 것입니다.
그래서 다음에 할 일입니다. 우리는 Matlab의 place 명령어를 사용하여
이 고유값들을 배치하고 이 행렬 k를 설계할 것입니다.
그 다음 우리는 선형 2차 조절기 또는 LQR
제어를 사용하여 최적의 고유값 배치를 개발할 것입니다.
그래서 다음에 그것이 나올 것입니다.