반응형

Weighted Pseudo-Inverse Redistribution Control Allocation with Actuator Limitation

 

0. Intro - Under/Over-Actuated System

1. Objective

2. Weighted Pseudo-Inverse Method

3. Examples

 

0. Intro - Under/Over-Actuated System

조종하고자 하는 차원보다 적은 수의 구동기를 가지면 Under-Actuated System

많은 수의 구동기를 가지면 Over-Actuated System 이라고 한다.

Under-Actuated System의 예를 들면 제어공학에서 흔히 다루는 역진자(Inverted Pendulum) 문제가 있다.

카트 위의 진자를 카트의 구동을 통해서 안정화 하는 문제이다. 2 자유도이지만, 구동기는 1개이기 때문에 직접 역진자를 세우지 못하고 카트를 이리저리 움직이면서 역진자를 안정화하는 문제를 풀게 된다.

강화학습에서 튜토리얼로 자주 하는 CartPole-v1 [1]

그와 반대로, Over-Actuated System은 쓸 수 있는 구동기가 훨씬 더 많은 상황이다.

 한국항공에서 올해 7월 첫 비행시험을 거치게 되는 KF-21 보라매는 주익 뒷전에 안쪽, 바깥쪽 조종면과 앞전에 플랩 등을 가진다. 대충 세어보면 Inboard, Outboard, Leading Edge Flap, Rudder, Elevator 등, 약 5쌍의 조종면을 가진다. 그래서 주익의 타면 뿐만 아니라, 수평 미익의 타면까지 활용하면 (반대로 꺾으면) 더욱 빠르게 롤 움직임을 유발 할 수 있다. 일반적인 Aileron, Elevator, Rudder를 가지는 항공기는 각 조종면이 기체의 회전 축의 회전을 담당한다. 그렇다면 아래와 같은 조종기가 충분히 많은 항공기에 대해서, 어떻게 하면 효과적으로 조종면을 사용할 수 있을까? 그리고 조종면이 많아지면 어떤 조종면이 고장나도 다른 조종면이 이 역할을 대신하면서 보완할 수 있는 다중화 효과가 있다.

 많은 조종면을 어떻게 효과적으로 사용할 수 있을까?

이게 조종면 할당 문제를 관통하는 질문이라고 생각한다.

KF-21 보라매의 형상, 조종면이 잘 보인다.

 

1. Objective

보라매 주익의 In/Outboard 타면에 대해서, 이를 Aileron, Elevator의 역할로 사용하고자 한다.

이때, 구동기의 한계를 고려하고자 한다.

 

 조종면 할당 알고리즘의 주요 목적은 가상의 제어 명령(Commanded virtual Control) $v_d$을 보장하는 제어 입력 (Control Input) $u$을 계산하는 것이다. 그런데 구동기의 물리적 한계 혹은 제약으로 인해 충분한 가상의 제어력을 제공하지 못한다면 이러한 목적 달성에 실패한다. 이런 상황에서 유효한 제어 입력 $u$을 찾을 수 없다면, performance objective가 조금 떨어지더라도 가상의 제어 명령의 오차를 최소화하는 방향으로 제어 입력 $u$을 탐색해야한다. [3]

 

2. Weighted Pseudo-Inverse Redistribution Method

Pseudo-Inverse CA

 직관적으로 생각했을 때, Outboard 쪽은 모멘트 암이 길어서 Aileron으로 쓰기가 좋고, 모든 타면은 Elevator로써의 효과가 유사하다.

 

부연 설명이 너무 길어져서 그만해야겠다.

가상의 제어 명령 $v$에 대해서, 제어 입력 $u$라 할 때, 가상의 제어 명령을 변환하는 입력 행렬 $B$은 다음과 같은 관계를 가진다.

$$v=Bu$$

 여기서 원하는 가상의 제어 명령 $v_d$를 알고 있다면, 원하는 제어 입력 $u_d$이 계산 될 수 있다. 그러나, 구동기의 물리적 제약을 고려하면 이 결과가 해가 되기는 어렵다.

 

 그래서 조종면 할당 문제는 컨벡스 최적화 문제로 소개되어 구속 조건을 만족하는 최적화 문제를 풀게 된다.

다음과 같이 최적화 문제를 표현하여 풀게 된다. (Pseudo Inverse Method)

$${\text{minimize}} \hspace{5mm} J= \frac{1}{2} \left(Bu-v_d\right)^T \left(Bu-v_d\right)$$

$${\text{subject to}} \hspace{5mm} u_{min} \leq u \leq u_{max}, \hspace{5mm} Bu-v_d=0$$

1) 구동기의 한계가 없다면, 다음이 바로 해가 된다.

$$\frac{\partial J}{\partial v_d} =-(Bu-v_d) =0 \rightarrow v_d=Bu$$

$$\therefore) u=B^T \left(B B^T \right)^T v_d = B^+ v_d $$

위의 의사 역행렬(Pseudo-inverse)는 정사각 행렬 일 경우, 그냥 역행렬을 취하면 되지만

그러지 아니할 경우, Moore-Penrose Pseudo Inverse Method를 통해서 유사 역행렬을 취한다.

2) 구동기의 한계가 존재한다면

고려해서 풀면 된다.

 

Weighted Pseudo-Inverse CA

 여기서, 가상의 제어 명령인 Aileron과 Elevator가 사용되는데, 제어 명령을 과도하게 사용하여 고도 유지가 안되는 등의 문제가 발생할 수 있다. 그러면 어떤 특정한 가상의 제어 명령을 선택하여 가중치를 주거나, 그것만큼은 보장되도록 하고 싶을 것이다. 롤은 안 쳐도 되지만, 피치 제어를 못하면 추락하니까.

 최적화 문제를 정의할 때, 특정 상태에 가중치를 주는 방법이다.

원하는 제어 명령 $v_d$에 대해서 다음의 최적화 문제의 해인 제어 입력 $u$을 구하고자 한다. 이때, 제어 명령 성분의 가중치를 부여하는 가중 행렬 $W$를 정의한다.

$${\text{minimize}} \hspace{5mm} J= \frac{1}{2} \left(Bu-v_d\right)^T W \left(Bu-v_d\right)$$

$${\text{subject to}} \hspace{5mm} u_{min} \leq u \leq u_{max}, \hspace{5mm} Bu-v_d=0$$

 

3. Example

문제 정의

다음과 같이 가상의 제어 명령 $v_d$과 제어 입력 $u$, 입력 행렬 $B$, 가중 행렬 $W$을 정의한다. $\delta_a$는 가상의 에일러론 명령, $\delta_e$는 가상의 엘리베이터 명령, $\delta_{RO}$는 Right Outboard 조종면 입력, $\delta_{LI}$는 Left Inboard이다.

$$v_d = \left[\matrix{\delta_a && \delta_e}\right]^T,  u=\left[\matrix{\delta_{RO} && \delta_{RI} && \delta_{LI} && \delta_{LO}}\right]$$

$$B^{-1} = \left[\matrix{1 && 1 \\ 0 && 1 \\ 0 && 1 \\ -1 && 1 }\right], B=\frac{1}{4}\left[\matrix{ 2 && 0 && 0 && -2 \\ 1 && 1 && 1 && 1 } \right], W=\left[\matrix{1 && 0 \\ 0 && 1000} \right] $$

여기서 가상의 제어 명령의 오차가 최소화 되도록 최적화 문제를 상정했다. 제어 입력의 한계 $u_{max}=10$ 이라 하자.

$${\text{minimize}} \hspace{5mm} J= \frac{1}{2} \left(Bu-v_d\right)^T W \left(Bu-v_d\right)$$

$${\text{subject to}} \hspace{5mm} ||u|| \leq u_{max}, \hspace{5mm} Bu-v_d=0$$

Performance Index $J$의 가상의 제어 명령 $v_d$에 대한 편미분은 다음과 같다

$$ \frac{\partial J}{\partial v_d} = -W(Bu - v_d) $$

 

풀이 과정

위 도출된 결과를 정리하여 최적의 제어 입력을 구하는 과정은 다음과 같다.

1) 계산할 가상의 제어 명령 $v$을 원하는 가상의 제어 명령 $v_d$에서 가져온다.

$$v:=v_d$$

2.1) 제어 입력 $u$를 가상의 제어 명령 $v$로부터 계산한다. 그리고 구속 조건을 적용한다.

$$u=Bv$$

$$u_{sat} = \text{minmax} \left(-u_{max}, u, u_{max} \right)$$

2.2) Performance Index $J$를 계산하고 $J$의 gradient로부터 새로운 가상의 제어명령 $v'$를 갱신한다.

$$J= \frac{1}{2} \left(Bu-v_d\right)^T W \left(Bu-v_d\right)$$

$$v'=v - \alpha W \left(Bu-v_d\right)$$

2.3) 원하는 성능이 나올 때 까지 과정 2를 반복한다.

 

해봤을 때, 가중 행렬 $W$는 크기를 정규화하는게 좋다.

가중 행렬이 달라지만 2.3의 가상 제어 명령 갱신할 때 gradient에 의한 이동량이 덩달아 같이 변하게 된다.

그래서 나는 norm으로 나누어주었다.

 

예시 코드

 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
clc;
Ail = 8.0;
Elv = 8.0;
AilMax = 10.0;
ElvMax = 15.0;
CtrlMax = 10.0;
 
W = [ 1 0;
      0 1000];
W = W / norm(W);
B = [ 1 1;
      0 1;
      0 1;
     -1 1];
Binv = pinv(B);
 
vd = [Ail;Elv];
u = B * vd;
v_new = Binv * u;
fprintf("OriginAil Elv %6.4f %6.4f with cost %6.4f -> %6.4f %6.4f %6.4f %6.4f (Actual Ail Elv %6.4f %6.4f)\n", vd(1), vd(2), J, u, v_new(1),v_new(2));
v = vd;
 
for i = 1 : 20
    u_new = B*v;
    u_sat = max(-CtrlMax,min(u_new,CtrlMax));
 
    J = 0.5 * (Binv * u_sat - vd)' * W * (Binv * u_sat - vd);
    v_new = Binv * u_sat;
    fprintf("CA_in Ail Elv %6.4f %6.4f with cost %6.4f -> %6.4f %6.4f %6.4f %6.4f (Actual Ail Elv %6.4f %6.4f)\n", v(1), v(2), J, u_sat, v_new(1),v_new(2));
    v = v - 2.0 * W * (Binv * u_sat - vd);
end

 

구현한 코드의 결과와 해설

코드의 결과는 다음과 같다.

더보기

Origin Ail Elv 8.0000 8.0000 -> 16.0000 8.0000 8.0000 0.0000
New Ail Elv 8.0000 8.0000 with cost 1.1295 -> 10.0000 8.0000 8.0000 0.0000
New Ail Elv 8.0060 11.0000 with cost 0.0410 -> 10.0000 10.0000 10.0000 2.9940
New Ail Elv 8.0150 10.5030 with cost 0.0164 -> 10.0000 10.0000 10.0000 2.4880
New Ail Elv 8.0235 10.2590 with cost 0.0102 -> 10.0000 10.0000 10.0000 2.2355
New Ail Elv 8.0317 10.1412 with cost 0.0086 -> 10.0000 10.0000 10.0000 2.1095
New Ail Elv 8.0398 10.0865 with cost 0.0082 -> 10.0000 10.0000 10.0000 2.0467
New Ail Elv 8.0479 10.0632 with cost 0.0080 -> 10.0000 10.0000 10.0000 2.0153
New Ail Elv 8.0559 10.0555 with cost 0.0080 -> 10.0000 10.0000 10.0000 1.9996

코드 해설을 더하면

가상의 엘리베이터 명령을 보장하기 위해 가중 행렬의 성분에 큰 값(1000)을 부여했다.

제어 입력의 최댓값은 10이고, 제어 효과는 모든 조종면이 동일하다고 가정했다.

가상의 제어 명령은 각각 8을 주었는데, 이는 가상의 엘리베이터 명령이 가상의 에일러론 명령에 의해 성능이 떨어지는 상황을 가정했다. 그래서 초기의 조종면 값을 보면 10, 8, 8, 0 으로 환산하면 가상의 엘리베이터 명령은 8이 아닌 7 정도밖에 들어가고 있지 않다.

가중 의사역행렬을 이용한 조종면 할당 명령은 [8, 8], 결과는 [7, 4]->[8, 4] 가 되었다.

어떤식으로 다른 조종면에 재할당을 했는지 보면 가상의 엘리베이터 명령의 효과를 다른 조종면에 추가적으로 더 넣어 준 것을 볼 수 있다. 그러나 가중치에 따라서 가상의 에일러론 명령은 성능이 떨어지는 효과가 있었다.

 

 

 

 

 

[1] OpenAI, "CartPole-v1," https://gym.openai.com/envs/CartPole-v1/

[2] Oppenheimer, M., W., Doman D., B., and Bolender, M., A., "Control Allocation for Over-Actuated Systems," 2006 14th Mediterranean Converrence on Control and Automation., June 2006. DOI 10.1109/MED.2006.328750

[3] Johansen, T., A., and Fossen, T., I., "Control Allocation - A Survey," Autometica, 49, 2013, pp.1087-1103, DOI 10.1016/j.automatica.2013.01.035

[4] "Constrained Dynamic Control Allocation in the Presence of Singularity and Infeasible Solutions,"

[5] 진재현, 유창선, 류혁, 탁민제, "수정된 의사역행렬 재분배 기법을 이용한 여유 조종력 할당," 한국항공우주학회지, 제 32권, 제 9호, Nov. 2011, pp.65-71.

728x90

+ Recent posts