The quaternion estimator algorithm (QUEST) is an algorithm designed to solve Wahba's problem, that consists of finding a rotation matrix between two coordinate systems from two sets of observations sampled in each system respectively. The key idea behind the algorithm is to find an expression of the loss function for the Wahba's problem as a quadratic form, using the Cayley–Hamilton theorem and the Newton–Raphson method to efficiently solve the eigenvalue problem and construct a numerically stable representation of the solution. The algorithm was introduced by Malcolm D. Shuster in 1981, while working at Computer Sciences Corporation. While being in principle less robust than other methods such as Davenport's q method or singular value decomposition, the algorithm is significantly faster and reliable in practical applications, and it is used for attitude determination problem in fields such as robotics and avionics.
Formulation of the problem Wahba's problem consists of finding a rotation matrix A ∗ {\displaystyle \mathbf {A} ^{*}} that minimises the loss function
l ( A ) = 1 2 ∑ i = 1 n a i ‖ w i − A v i ‖ 2 {\displaystyle l\left(\mathbf {A} \right)={\frac {1}{2}}\sum _{i=1}^{n}a_{i}\left\|\mathbf {w} _{i}-\mathbf {A} \mathbf {v} _{i}\right\|^{2}}
where w i {\displaystyle \mathbf {w} _{i}} are the vector observations in the reference frame, v i {\displaystyle \mathbf {v} _{i}} are the vector observations in the body frame, A {\displaystyle \mathbf {A} } is a rotation matrix between the two frames, and a i {\displaystyle a_{i}} are a set of weights such that ∑ i a i = 1 {\displaystyle \textstyle \sum _{i}a_{i}=1} . It is possible to rewrite this as a maximisation problem of a gain function g {\displaystyle g}
g ( A ) = 1 − l ( A ) = ∑ i a i w i ⊤ A v i {\displaystyle g\left(\mathbf {A} \right)=1-l\left(\mathbf {A} \right)=\sum _{i}a_{i}\mathbf {w} _{i}^{\top }\mathbf {A} \mathbf {v} _{i}}
defined in such a way that the loss l {\displaystyle l} attains a minimum when g {\displaystyle g} is maximised. The gain g {\displaystyle g} can in turn be rewritten as
g ( A ) = tr ( A B ⊤ ) {\displaystyle g\left(\mathbf {A} \right)=\operatorname {tr} \left(\mathbf {A} \mathbf {B} ^{\top }\right)}
… excerpt ends here. Continue reading the full article.
