반응형

구동기 한계를 가지는 상황에서의 가중 의사 역행렬을 이용하여 조종면 할당 문제를 다룬 바 있다. 

입력 행렬 $B$가 Virtual Control Command와 Real Actuator간의 관계 혹은 Control Effectness를 나타낸다는 특징이 있다. 그렇다면 입력 행렬 $B$의 성분을 수정하면 Real Actuator의 고장에 대해서 조종면 재할당을 할 수 있을 것으로 예상된다.

다시 의사 역행렬을 이용한 조종면 할당 알고리즘을 복습하면 다음과 같다.

Pseudo-Inverse Algorithm for Control Allocation

상태 $x\in \mathbb{R}^n$, 입력 $u\in \mathbb{R}^m$인 다음의 선형 동적 시스템이 있다고 하자.

$$\cases{\dot{x} = Ax + Bu \\ y = Cx+ Du}$$

Virtual Control Command $v\in \mathbb{R}^n$과 제어 입력 $u$는 입력 행렬 $B$을 이용하여 다음과 같이 표현 될 수 있다.

$$v=Bu$$

그렇다면 Virtual Control Command $v_d$에 대해 최적의 제어 입력 $u$를 찾기 위해 다음과 같은 Quadratic form으로 최적화 문제로 정의한다.

$${\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}$$

 

Weighted Pseudo-Inverse Algorithm

$${\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}$$

가중 의사 역행렬 방법은 가중 행렬 $W$을 Performance Index에 삽입하여 Virtual Control Command의 요소 간 중요도를 정의할 수 있었다.

 

Problem Statement

 

현재 다루고자 하는 문제는 Virtual Control Command $v_d$에 대해서 어떤 시점에서 구동기 고장이 유발, 고장 진단 되었을 때 어떻게 구동기에 명령을 재분배할 것인가에 대한 것이다.

앞서 다룬 예제를 통해서 검증해보고자 한다.

예제 상황은 의사 역행렬 기법을 이용할 때, Right Inboard Actuator 가 고장났다고 가정하면, 입력 행렬 $B$는 다음과 같이 변형된다.

$$B^{-1} = \left[ \matrix{1 && 1 \\ 0 && 1 \\ 0 && 1 \\ -1 && 1} \right] \rightarrow B'^{-1} = \left[ \matrix{1 && 1.33 \\ 0 && 0 \\ 0 && 1.33 \\ -1 && 1.33} \right]$$

고장난 구동기의 효과를 다른 구동기가 더 분담하는 형태인 것이다.

 

MATLAB 예시 코드는 다음과 같다.

 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
32
33
34
35
36
37
38
39
40
41
clc;
Ail = 2.0;
Elv = 6.0;
AilMax = 10.0;
ElvMax = 15.0;
CtrlMax = 10.0;
 
W = [ 1 0;
    0 1];
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 j = 1 : 10
    v = vd;
    if (j > 5)
        B = [   1  4/3;
                0  0;
                0  4/3;
               -1  4/3];
        Binv = pinv(B);
    end
    for i = 1 : 10
        u_new = B * v;
        u_sat = max(-CtrlMax,min(u_new,CtrlMax));
        v_new = Binv * u_sat;
 
        J = 0.5 * (Binv * u_sat - vd)' * W * (Binv * u_sat - vd);
        v = v - 2.0 * W * (Binv * u_sat - vd);
    end
    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));
end

 

결과를 보면 다음과 같다.

더보기

OriginAil Elv 2.0000 6.0000 with cost 1.1224 -> 8.0000 6.0000 6.0000 4.0000 (Actual Ail Elv 2.0000 6.0000)
CA_in Ail Elv 2.0000 6.0000 with cost 0.0000 -> 8.0000 6.0000 6.0000 4.0000 (Actual Ail Elv 2.0000 6.0000)
CA_in Ail Elv 2.0000 6.0000 with cost 0.0000 -> 8.0000 6.0000 6.0000 4.0000 (Actual Ail Elv 2.0000 6.0000)
CA_in Ail Elv 2.0000 6.0000 with cost 0.0000 -> 8.0000 6.0000 6.0000 4.0000 (Actual Ail Elv 2.0000 6.0000)
CA_in Ail Elv 2.0000 6.0000 with cost 0.0000 -> 8.0000 6.0000 6.0000 4.0000 (Actual Ail Elv 2.0000 6.0000)
CA_in Ail Elv 2.0000 6.0000 with cost 0.0000 -> 8.0000 6.0000 6.0000 4.0000 (Actual Ail Elv 2.0000 6.0000)
CA_in Ail Elv 2.0000 6.0000 with cost 0.0000 -> 10.0000 0.0000 8.0000 6.0000 (Actual Ail Elv 2.0000 6.0000)
CA_in Ail Elv 2.0000 6.0000 with cost 0.0000 -> 10.0000 0.0000 8.0000 6.0000 (Actual Ail Elv 2.0000 6.0000)
CA_in Ail Elv 2.0000 6.0000 with cost 0.0000 -> 10.0000 0.0000 8.0000 6.0000 (Actual Ail Elv 2.0000 6.0000)
CA_in Ail Elv 2.0000 6.0000 with cost 0.0000 -> 10.0000 0.0000 8.0000 6.0000 (Actual Ail Elv 2.0000 6.0000)
CA_in Ail Elv 2.0000 6.0000 with cost 0.0000 -> 10.0000 0.0000 8.0000 6.0000 (Actual Ail Elv 2.0000 6.0000)

다른 구동기에 더 분담을 시켰기 때문에 고장난 구동기의 위치 만큼 다른 구동기가 더 작동한 모습을 볼 수 있다.

 

여기서 연구 아이디어가 생각난 것은 

위 문제에서는 입력 행렬에 Uniform하게 값을 더하면서 고장난 구동기의 역할을 다른 구동기에 분배했다.

그렇다면 Uniform한 방법이 아닌, 이 분배 방법또한 최적화 할 수 있지 않을까?

과정은 (제어 입력 최적화 -> 입력 행렬 최적화) 가 될 것 같다.

 

1. Uniform 하게 입력 행렬 초기화

2. 제어 입력의 최적화 진행

3. 최적화된 제어 입력에 따른 입력 행렬의 요소 최적화

4. 2~3 과정 반복을 통한 제어 입력과 입력 행렬의 최적화

 

그렇다면 문제가 발생할 수도 있다고 생각되는 부분은

입력 행렬의 최적 값과 제어 입력의 최적 값 사이에서 진동할 수도 있다는 것이다. 짐작이다.

이거는 Performance Index를 어떻게 정하느냐에 따라서 달린 것 같다.

 

 

 

 

728x90

+ Recent posts