1978년 HEAO-B(High Energy Astronomy Observatory)의 자세 추정을 계산하는 데 Davenport의 q-방법을 사용했다. 그러나 당시의 컴퓨터 성능으로는 1년 후에 발사된 MAGSAT에서 요구된 보다 빈번한 자세 계산을 감당할 수는 없었다고 한다. QUEST(QUaternion Estimator) 알고리즘은 이러한 요구에 부응하기 위해 고안되었으며, Wahba 의 자세결정 문제를 해결하기 위한 알고리즘으로 널리 사용되게 되었다.

QUEST는 Davenport의 q-방법과 마찬가지로 행렬
Wahba의 자세결정 문제는 다음과 같았다.
여기서
식 (1)의
위 식 우변의 첫번째 항은
여기서
행렬
식 (3)의
반면에 QUEST에서는 식 (7)의 고유값
식 (7)에 (4)와 (5)를 대입하면 다음과 같다.
위 식을 전개하면 다음과 같다.
식 (10)의 양변을
참고로
벡터부는 다음과 같이 계산할 수 있다.
문제는 어떻게 식 (11)을 계산하느냐이다. 식 (11)은 고유값을 포함하고 있으므로 고유값부터 계산해야 한다.
방향코사인행렬, 오일러각, 그리고 쿼터니언 | 박성수 | 딥웨이브- 교보ebook
이 책에서는 방향코사인행렬, 오일러각, 쿼터니언과 이들의 시간 변화율에 대해서 공부합니다. 모두 3차원 공간 상에서 어떤 기준 좌표계에 대해서 운동하는 강체의 상대적인 자세의 변화를 표
ebook-product.kyobobook.co.kr
우선 표기를 단순하게 하기 위해서 다음과 같은 변수를 도입한다.
그려면 식 (11)은 다음과 같이 표기할 수 있다.
식 (15)에서 역행렬을 계산하기 위해서 우선 행렬식(determinant)부터 계산한다. 일반적인
케일리-해밀톤의 정리 (Cayley-Hamilton theorem)에 의하면, 행렬은 자신의 특성방정식을 만족한다. 즉 다음 식이 성립한다.
또한 케일리-해밀톤의 정리에서 파생된 정리에 의하면 정사각형 행렬(square matrix)의 함수는 행렬의 차원보다
여기서
이 상수를 계산하기 위해서 역행렬의 정의를 이용한다.
위 식을 전개하면 다음과 같다.
식 (17)에 의하면
식 (22)를 (21)에 대입하면 다음과 같다.
여기서
이다. 식 (23)에 의하면 다음 식이 성립한다.
이제 식 (11)을 (9)에 대입하면 다음과 같이 된다.
식 (19)를 식 (26)에 대입하면,
이 되는데, 위 식에 식 (25)를 대입하면
이 되므로, 다음과 같이 고유값에 대한 4차 방정식을 얻을 수 있다.
여기서
이다. 사실 고유값 정의에 의하면 행렬
매트랩 함수 'poly(K)' 를 이용하면 식 (29)와 동일한 방정식을 얻을 수 있을 것이다.
식 (30) 또는 (29)로 주어지는 특성방정식은 4차 다항식이므로 4개의 해가 존재한다. 하지만 식 (3)을 최대로 또는 식 (1)을 최소로 하는 고유값은 최대 고유값이므로 식 (29)에서 최대 고유값만 계산하면 된다.
식 (29)에 Newton-Raphson 반복법을 적용하여 최대 고유값을 구하는 방법은 다음과 같다. 먼저 최대 고유값의 초기값을 선정해야 하는데, 식 (1)에 의하면 측정값에 오류가 없이 완벽하다면
그런 다음 고유값이 수렴할 때까지 다음을 반복한다.
최대 고유값을 구했다면, 이제 이 고유값에 대응하는 고유벡터를 식 (11), (12), (13)을 이용해서 계산하면 된다. 이 고유벡터가 최적 쿼터니언
QUEST 알고리즘을 요약하면 다음과 같다. 우선 식 (6)으로 행렬
Davenport의 q-방법에서 풀었던 동일한 예제(https://pasus.tistory.com/303)를 QUEST 알고리즘으로 풀어보겠다.
기준좌표계
좌표계
그러면 동체좌표계
이제 식 (21)과 (23)을 측정 단위벡터로 간주하고 QUESR 알고리즘을 적용한다. 가중값을 모두
식 (29)에 의하면 특성방정식은 다음과 같다.
식 (31)에 의하면 Newton-Raphson 반복법의 초기 추정값은
이를 DCM으로 변환하면 다음과 같아서 식 (34)로 주어지는 참값 DCM과 일치함을 알 수 있다.
다음은 QUEST 알고리즘을 매트랩 코드로 작성한 것이다.
function q = quest(weight, S_a, S_b)
% QUEST: 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
% parameters
sigma = trace(B);
Z = [B(3,2)-B(2,3);
-B(3,1)+B(1,3);
B(2,1)-B(1,2)];
S = B + B';
kappa = 0.5*(trace(S)*trace(S) - trace(S*S));
% characteristic equation coefficients
a2 = kappa - 2*sigma^2 - Z'*Z;
a1 = -det(S) - Z'*S*Z;
a0 = (sigma^2-kappa)*(sigma^2+Z'*Z) + sigma*det(S) + sigma*Z'*S*Z - Z'*S*S*Z;
% Newton-Rhapson
lambda0 = sum(weight);
for ii = 1:10
p_lam0 = lambda0^4 + a2*lambda0^2 + a1*lambda0 + a0;
p_lam0_prime = 4*lambda0^3 + 2*a2*lambda0 + a1;
lambda = lambda0 - (p_lam0)/(p_lam0_prime);
if abs(lambda-lambda0)<=1e-5
break;
end
lambda0 = lambda;
end
% max quarternion
rod = inv((lambda+sigma)*eye(3)-S)*Z;
q0 = 1/(sqrt(1+rod'*rod));
q_vec = q0*rod;
q = [q0; q_vec];
'항공우주 > 우주역학' 카테고리의 다른 글
케플러 문제 (Kepler’s problem) - 1 (0) | 2023.11.18 |
---|---|
궤도의 비행각과 비행시간 (0) | 2023.11.16 |
정적 자세결정: Davenport의 q-방법 (0) | 2023.10.22 |
정적 자세결정 (Static attitude determination): TRIAD (0) | 2023.10.19 |
[CR3BP] 주기궤도의 매니폴드 계산 (0) | 2023.08.01 |
댓글