본문 바로가기
항공우주/우주역학

정적 자세결정: Davenport의 q-방법

by 깊은대학 2023. 10. 22.

앞서 살펴본 TRIAD는 두 개의 측정 단위벡터를 이용하여 우주비행체의 자세를 결정하였다 (https://pasus.tistory.com/302). 만약 두 개 이상의 단위벡터를 측정할 수 있다면 모든 측정 벡터를 이용할 수 있도록 TRIAD 방법을 개선해야 할 것이다. 예를 들면 많은 항성을 동시에 추적할 수 있는 별센서를 사용한다면 다수의 단위벡터가 측정된다.

 

 

Wahba는 센서의 불확실성으로 인해 발생하는 오류를 최소화하는 방식으로 다수의 측정 단위벡터를 처리하는 방법에 대한 문제를 정립했다.

n 개의 측정 단위벡터를 s^k, k=1,...,n 이라고 하자. 그리고 이 벡터를 기준좌표계 {a} 와 동체좌표계 {b} 로 표현한 벡터를 각각 skaskb 로 표기한다. 그러면 좌표계 {a} 에서 {b} 로의 DCM Cba 를 이용하여 두 벡터의 관계식을 다음과 같이 쓸 수 있다.

 

(1)ska=Cbaskb,   k=1,...,n

 

여기서 skb 는 우주비행체의 온보드 센서로 측정한 단위벡터이고, ska 는 기준좌표계에서 '수학모델'로 계산된 단위벡터이다.

Wahba는 기준좌표계에서 측정된 단위벡터와 동체좌표계에서 기준좌표계로 변환된 측정 단위벡터의 차이를 최소화하는 DCM Cba 를 구하는 최소화 문제를 제안하였다.

 

(2)argminCbaJ(Cba)=12k=1nwk|skaCbaskb|2

 

여기서 wkk 번째 벡터의 중요성을 나타내는 가중값(weight)이다. 식 (2)를 Wahba의 자세결정 문제라고 한다.

 

 

측정값에 오류가 없이 완벽하다면 Cba 는 모든 벡터 쌍에 대해 동일할 것이며 J(Cba) 의 최소값은 0 이 될 것이다. 하지만 현실 세계의 불확실성으로 인해 J(Cba) 는 양(+)의 값을 갖게 될 것이므로 J(Cba) 값, 즉 오차를 최소화하는 방식으로 Cba 를 계산하는 것이 필요하다.

Wahba의 문제를 해결하기 위한 여러가지 방법이 제안되었는데, 예를 들면 Davenport의 q-방법, QUEST(QUaternion Estimator), SVD(Singular Value Decomposition) 방법, FOAM(Fast Optimal Attitude Matrix) 알고리즘 등이 있다. 여기서는 Wahba의 문제를 쿼터니언 기반으로 푼 Davenport의 q-방법에 대해서 알아본다.

먼저 식 (2)의 J(Cba) 를 전개하면 다음과 같다.

 

(3)J(Cba)=12k=1nwk(skaCbaskb)T(skaCbaskb)=12k=1nwk((ska)Tska(ska)TCbaskb(skb)T(Cba)Tska+(skb)T(Cba)TCbaskb)

 

여기서 (ska)Tska=1, (skb)Tskb=1, (Cba)TCba=I 이므로 위 식은 다음과 같이 된다.

 

(4)J(Cba)=12k=1nwk(22(ska)TCbaskb)=k=1nwkk=1nwk(ska)TCbaskb

 

위 식 우변의 첫번째 항은 Cba 의 함수가 아니므로 J(Cba) 를 최소화하기 위해서는 두번째 항을 최대화하면 된다. 따라서 최소화 문제는 다음과 같이 최대화 문제로 바뀐다.

 

(5)maxCbaJ¯(Cba)=k=1nwk(ska)TCbaskb

 

Davenport는 DCM 대신에 쿼터니언을 사용하였다. DCM과 쿼터니언 사이에는 변환 관계식이 있기 때문에 식 (5)를 다음과 같이 쓸 수 있다.

 

(6)maxqJ¯(q)=k=1nwk(ska)TCba(q)skb

 

여기서 q 는 좌표계 {a} 에서 {b} 로의 쿼터니언 qba 를 의미하며 Cba(q) 는 다음과 같다.

 

(7)Cba(q)=q02I+q1:3q1:3T+2q0[q1:3×]+[q1:3×]2

 

 

 

방향코사인행렬, 오일러각, 그리고 쿼터니언 | 박성수 | 딥웨이브- 교보ebook

이 책에서는 방향코사인행렬, 오일러각, 쿼터니언과 이들의 시간 변화율에 대해서 공부합니다. 모두 3차원 공간 상에서 어떤 기준 좌표계에 대해서 운동하는 강체의 상대적인 자세의 변화를 표

ebook-product.kyobobook.co.kr

 

쿼터니언 q 는 실수부와 벡터부로 구성되는데 구성 요소는 다음과 같고,

 

(8)q=[q0q1q2q3]=[q0q1:3]

 

[q1:3×]q1:3 의 빗대칭 행렬(skew-symmetric matrix)로서 다음과 같이 정의된다.

 

(9)[q1:3×]=[0q3q2q30q1q2q10]

 

쿼터니언을 이용한 좌표 변환 식에 의하면 식 (6)의 Cba(q)skb 부분은 다음과 같이 쿼터니언 식으로 표현할 수 있다 (https://pasus.tistory.com/86).

 

(10)[0Cba(q)skb]=q[0skb]q=[q0q1:3Tq1:3q0I+[q1:3×]][0(skb)Tskb[skb×]][q0q1:3]

 

여기서 q 는 켤레 쿼터니언(quaternions conjugate)이다. 식 (10)을 이용하면 식 (6)의 우변을 다음과 같이 전개할 수 있다.

 

(11)(ska)TCba(q)skb=[0(ska)T][0Cba(q)skb]=[0(ska)T][q0q1:3Tq1:3q0I+[q1:3×]][0(skb)Tskb[skb×]][q0q1:3]=[q0(q1:3)T][0(ska)Tska[ska×]][0(skb)Tskb[skb×]][q0q1:3]=qT[(ska)Tskb(ska)T[skb×][ska×]skbska(skb)T+[ska×][skb×]]q

 

식 (11)을 식 (6)에 대입하면 다음과 같이 된다.

 

(12)J¯(q)=k=1nwkqT[(ska)Tskb(ska)T[skb×][ska×]skbska(skb)T+[ska×][skb×]]q=qT(k=1nwk[(ska)Tskb(ska)T[skb×][ska×]skbska(skb)T+[ska×][skb×]])q=qTKq

 

여기서

 

(13)K=k=1nwk[(ska)Tskb(ska)T[skb×][ska×]skbska(skb)T+[ska×][skb×]]

 

이다. 계산량을 줄이기 위해서 행렬 K 를 좀더 가다듬어 보자. 행렬 B 를 다음과 같이 정의하면,

 

(14)B=k=1nwk ska(skb)T

 

행렬 K 의 구성 요소는 각각 다음과 같이 행렬 B 로 표현할 수 있다.

 

(15)k=1nwk(ska)Tskb=tr(B)k=1nwk[ska×]skb=[B32B23B31+B13B21B12]=zk=1nwk(ska)T[skb×]=k=1nwk([skb×]ska)T                                =k=1nwk([ska×]skb)T                                =[B32B23B31+B13B21B12]T=zTk=1nwk(ska(skb)T+[ska×][skb×])=B+BTtr(B)I

 

식 (15)를 식 (13)에 대입하면 K 는 다음과 같이 된다.

 

(16)K=[tr(B)zTzB+BTtr(B)I]

 

쿼터니언은 단위 길이 제약, qTq=1 을 만족해야 하므로 식 (6)의 최대화 문제는 다음과 같이 제약조건을 갖는 최대화 문제로 표현해야 한다.

 

(17)maxqJ¯(q)=qTKqsubject to  qTq=1

 

라그랑지 곱수(Lagrange multiplier) λ 를 도입하여 식 (17)을 제약조건이 없는 최대화 문제로 바꾸면 다음과 같다 (https://pasus.tistory.com/29).

 

(18)J¯(q)=qTKq+λ(1qTq)

 

J¯q 에 대해 미분하고 0 으로 놓으면 J¯(q) 의 최대값은 다음 식을 만족하는 q 에서 얻을 수 있다.

 

(19)Kq=λq

 

식 (19)는 고유값 문제이므로 이제 최대화 문제는 고유값 문제가 되었으며 J¯(q) 를 최대화하는 쿼터니언은 행렬 K 의 최대 고유값에 해당하는 고유벡터가 된다.

 

(20)maxJ¯(q)=qmaxTKqmax=qmaxTλmaxqmax=λmaxqmaxTqmax=λmax

 

마지막으로 qmax 에 해당하는 DCM Cba 를 식 (7)의 변환식을 이용해서 계산하면 된다.

Davenport의 q-방법을 요약하면 다음과 같다.

우선 4×4 행렬 K 를 식 (14)와 (16)을 이용하여 계산한다. 그리고 K 의 고유값과 고유벡터를 구한다. 이어서 최대 고유값과 그에 해당하는 고유벡터를 선택한다. 이 고유벡터가 좌표계 {a} 에서 {b} 로의 최적 쿼터니언이다.

Davenport의 q-방법은 최적화 문제를 고유값 문제로 변환하여 풀기 때문에 계산 요구량 측면에서 단점이 될 수 있다.

예를 들어본다. 두 개 이상의 측정 벡터를 처리할 수 있는 q-방법으로는 적당한 예제가 아닐 수 있지만, TRIAD에서 들었던 예와 동일한 문제(https://pasus.tistory.com/302)를 풀어보겠다.

먼저 기준좌표계 {a} 에서 단위벡터 s^1, s^2 가 다음과 같이 주어졌다고 하자.

 

(21)s1a=[100],     s2a=[001]

 

좌표계 {a} 에서 {b} 로의 참값 DCM은 3-2-1 오일러각 30도, 20도, 10도 회전을 통해서 다음과 같다고 하자.

 

(22)Cba=[0.92540.01800.37850.16320.88260.44100.34200.46980.8138]

 

그러면 동체좌표계 {b} 에서 단위벡터 s^1, s^2 는 다음과 같다.

 

(23)s1b=[0.92540.01800.3785],     s2b=[0.34200.46980.8138]

 

이제 식 (21)과 (23)을 측정 단위벡터로 간주하고 q-방법을 사용하여 DCM Cba 를 계산해보자. 먼저 가중값을 모두 1 로 하면 식 (14)에 의해서 행렬 B 는 다음과 같다.

 

B=[0.92540.01800.37850000.34200.46980.8138]

 

식 (16)에 의해서 행렬 K 는 다음과 같다.

 

K=[1.73920.46980.72050.01800.46980.11160.01800.03650.72050.01801.73920.46980.01800.03650.46980.1116]

 

행렬 K의 최대 고유값은 2.0 이며 그 때의 고유벡터가 최적의 쿼터니언이 된다.

 

q=[0.95150.23930.18930.0381]     또는     q=[0.95150.23930.18930.0381]

 

식 (7)을 이용하여 DCM으로 변환하면 다음과 같아서 식 (22)로 주어지는 참값 DCM과 일치함을 알 수 있다.

 

Cba=[0.92540.01800.37850.16320.88260.44100.34200.46980.8138]

 

 

 

다음은 q-방법을 매트랩 코드로 작성한 것이다.

 

function q = davenport(weight, S_a, S_b)

% Davenport's q-method: static attitide determination
% input:
%       weight: weights of each vector
%       S_a = [s_a_1, ..., s_a_n] of s_hat_k, k=1,...,n in frame {a}
%       S_b = [s_b_1, ..., s_b_n] of s_hat_k, k=1,...,n in frame {b}
% output:
%       quaternion q^a_b
%
% coded by st.watermelon

% size
[m,n] = size(S_a);


% B
B = zeros(3,3);
for k=1:n
    B = B + weight(k)*S_a(:,k)*S_b(:,k)';
end

% K
K11 = trace(B);
K21 = [B(3,2)-B(2,3);
      -B(3,1)+B(1,3);
       B(2,1)-B(1,2)];
K22 = B + B' - K11 * eye(3);

K = [K11 K21'; 
     K21 K22];

% eigevnalue
[V, D] = eig(K);

% max quarternion
[m_lam, m_idx] = max(diag(D));
q = V(:, m_idx);

 

댓글