1 Introduction

The CubeSat standard [1] emerged as a concept to allow university students and researchers to gain access to space exploration in a faster and less costly way. This standard opened the possibility for small space missions to be developed with reduced time, development, and launch costs. The ease of access to space that this standard provides allows different sectors to use it in a wide range of projects, such as technical demonstration, scientific, educational, and commercial, and in increasing quantities [2].

This standardization allows a CubeSats mission to be planned, built, and operated generally in a few years, using standardized COTS (commercial off-the-shelf) components [3], and the launch is conducted as a secondary payload in commercial launchers. On the other hand, the total mass, volume, and available electrical power are quite restricted and, hence, introduce some technological challenges.

Regarding the Attitude Determination and Control System (ADCS), one of the problems in its development for nanosatellites is the need to use small, lightweight, and low-cost sensors and actuators that meet the construction constraints of the CubeSat standard. COTS sensors tend to have high noise levels. Therefore, attitude determination methods must be designed to minimize the impact of these noises.

For nanosatellite or CubeSat missions, however, there must be a compromise between precision and low computational load due to design constraints, such as reduced power, size, and cost. Therefore, onboard attitude determination methods have generally been algebraic, such as TRIAD [4] and QUEST [5], due to the low computational burden. [6] and [7] present a redundant attitude determination system based on the QUEST method.

Approaches based on Kalman filtering rely on system dynamics and noise statistics to attain better accuracy, especially when dealing with high noise level COTS components. For the non-linear attitude estimation problem, the extended Kalman filter (EKF) is probably the most widely used at present. [8] proposed the MEKF formulation to deal with quaternions. CubeSat missions have implemented this method e.g., in [9,10,11].

The application of the Kalman filter in non-linear problems requires the calculation of partial derivatives matrices of the dynamics or measurements, originating the extended version of the filter. In some cases, this calculation can be analytically complex or computationally expensive. The formulation of the central difference filter uses polynomial interpolation to avoid computing these partial derivatives [12, 13].

However, with advances in embedded processor technology and FPGAs (Field-Programmable Gate Array), more efficient algorithms can be implemented onboard. In the unscented Kalman filter (UKF) [14], partial derivatives matrices are substituted by a set of sigma points [15]. The following is a list of known partial derivatives. The computational burden is greater, but in many cases the estimation is more accurate. [16] and [17] use this approach.

Another formulation, the Central Difference Kalman filter (CDKF), also avoids the calculation of derivatives matrices. The CDKF is based on Sterling’s polynomial interpolation formula to deal with nonlinearities [13]. CDKF has shown improved accuracy, compared to UKF, when used with COTS components [18]. Other approaches, like particle filtering, have shown competitive results [19].

In this work, it is proposed to evaluate the performance of attitude determination of a central difference Kalman filter and compare it with an extended Kalman filter, in its multiplicative form [20] and an unscented Kalman filter [21].

Data were simulated for a 3U CubeSat equipped with a magnetometer, sun sensor, and gyroscopes as attitude sensors, and results are shown in terms of quaternion errors and Euler angle errors.

2 Central difference Kalman filter

Extended Kalman Filters (EKF) are widely used in non-linear estimation problems. EKF requires the calculation of Jacobian matrices, which can be difficult to obtain or computationally expensive to perform in a given system. The unscented Kalman filter (UKF) was proposed in [14] and used a set of sampling points (called sigma points) which when propagated through a non-linear system, captures the posterior mean and covariance accurately to the 2nd order [15].

The Central Difference Kalman Filter (CDKF) is also an estimator that avoids the calculation of derivatives in the Jacobian matrix. The CDKF is based on Sterling’s polynomial interpolation formula that deals with nonlinearities [13]. Subsequently, the number of filter adjustment parameters was reduced, from 3 in UKF to 1 [22]. In this work, CDKF is implemented based on the sigma points approach [15]. This filter uses the scaling weight factor \(h = \sqrt{3}\) and \(\mathcal {H}\) which indicates the Householder triangularization. The algorithm is shown below, using \(L = 6\) states.

  1. 1.

    Calculate sigma points \(\chi _{k-1}\):

    \(\chi _{k-1} = \Big [ \hat{\textbf{x}}_{k-1}^+ \hspace{4ex} \hat{\textbf{x}}_{k-1}^+ + hS_{k-1}(i) \hat{\textbf{x}}_{k-1}^+ - hS_{k-1}(i) \Big ]\)

    and \(S_{k-1} = \sqrt{\hat{\textbf{P}}_{k-1}^+}\)

    • \(\hat{\textbf{x}}_{k-1}^+\) and \(\hat{\textbf{P}}_{k-1}^+\) are estimated state and covariance from previous epoch

    • \(S_{k-1}(i)\) is the i-th column of matrix \(S_{k-1}\), with \(1 \le i \le L\).

  2. 2.

    Proceed time updated sigma points \(\chi _{k |k-1}\):

    \(\chi _{k |k-1} = f\left( \chi _{k-1}\right)\)

    • Time update function f is described in Sect. 3.

  3. 3.

    Calculate the central difference matrix \(S_{x,k}^-\):

    \(S_{x,k}^- = \mathcal {H}\Big [ S_{x,k}^{(1)} \hspace{4ex} S_{x,k}^{(2)} \hspace{4ex} S_{Q,k} \Big ]\)

    • \(\left\{ \begin{aligned} S_{x,k}^{(1)}(i)&= w_i^{(c)}\left( \chi _{k |k-1}(i) - \chi _{k |k-1}(i+L) \right) \\ S_{x,k}^{(2)}(i)&= w_0^{(c)}\left( \chi _{k |k-1}(i) + \chi _{k |k-1}(i+L)\right. \\&\left.\quad -2\chi _{k |k-1}(0) \right) \\ S_{Q,k}&= \sqrt{\textbf{Q}_k} \end{aligned}\right.\)

    • (i) means column index of a given matrix, \(1 \le i \le L\).

    • \(\textbf{Q}_k\) is the process noise covariance matrix.

  4. 4.

    Calculate a priori state \(\hat{\textbf{x}}_{k}^-\) and covariance \(\hat{\textbf{P}}_k^-\):

    \(\left\{ \begin{aligned} \hat{\textbf{x}}_{k}^-&= \textstyle \sum _{i=0}^L w_i^{(m)} \chi _{k |k-1}(i) \\ \hat{\textbf{P}}_k^-&= S_{x,k}^- \left( S_{x,k}^-\right) ^T \end{aligned}\right.\)

  5. 5.

    Recalculate sigma points:

    \(\chi _{k}^* = \Big [ \hat{\textbf{x}}_{k}^- \hspace{4ex} \hat{\textbf{x}}_{k}^- + hS_{x,k}^-(i) \hspace{4ex} \hat{\textbf{x}}_{k}^- - hS_{x,k}^-(i) \Big ]\), \(1 \le i \le L\)

  6. 6.

    Obtain measurements sigma points \(\Upsilon _k\):

    \(\Upsilon _k = g\left( \chi _{k}^*\right)\)

    • Measurement update function g is described in Sect. 3.

  7. 7.

    Calculate predicted measurements \(\hat{\textbf{y}}_k^-\):

    \(\hat{\textbf{y}}_k^- = \sum _{i=0}^L w_i^{(m)} \Upsilon _k(i)\)

  8. 8.

    Calculate the central difference matrix for measurements \(S_{v,k}\):

    \(S_{v,k} = \mathcal {H}\Big [ S_{y,k}^{(1)} \hspace{4ex} S_{y,k}^{(2)} \hspace{4ex} S_{R,k} \Big ]\)

    • \(\left\{ \begin{aligned} S_{y,k}^{(1)}(i)&= w_i^{(c)}\big ( \Upsilon _{k}(i) - \Upsilon _{k}(i+L) \big ) \\ S_{y,k}^{(2)}(i)&= w_i^{(c)}\big ( \Upsilon _{k}(i) + \Upsilon _{k}(i+L) - 2\Upsilon _{k}(0) \big ) \\ S_{R,k}&= \sqrt{\textbf{R}_k} \end{aligned}\right.\)

    • (i) means column index of a given matrix, \(1 \le i \le L\).

    • \(\textbf{R}_k\) is the measurement noise covariance matrix.

  9. 9.

    Calculate cross-covariance matrices \(\textbf{P}_{yy,k}\) and \(\textbf{P}_{xy,k}\):

    \(\left\{ \begin{aligned} \textbf{P}_{yy,k}&= S_{y,k}^- \left( S_{y,k}^-\right) ^T \\ \textbf{P}_{xy,k}&= S_{x,k}^-\left( S_{y,k}^{(1)}\right) ^T \end{aligned}\right.\)

  10. 10.

    Measurement update:

    \(\left\{ \begin{aligned} \textbf{K}_k&= \textbf{P}_{xy,k} \left[ S_{v,k}\left( S_{v,k}\right) ^T\right] ^{-1} \\ \hat{\textbf{x}}_k^+&= \textbf{K}_k\left( \textbf{y}_k - \hat{\textbf{y}}_k^-\right) \\ \hat{\textbf{P}}_k^+&= S_{x,k}^+\left( S_{x,k}^+\right) ^T \end{aligned}\right.\)

    • \(S_{x,k}^+ = \mathcal {H}\Big [ S_{x,k}^- -\textbf{K}_kS_{v,k}^{(1)} \hspace{4ex} \textbf{K}_kS_{v,k} \Big ]\)

    • \(\textbf{K}_k\) is the Kalman gain, and \(\hat{\textbf{x}}_{k}^+\) and \(\hat{\textbf{P}}_k^+\) are measurement updated state increment and covariance, respectively.

    • \(\textbf{y}_k\) is the measurement vector.

  11. 11.

    Estimates of quaternion \(\hat{\textbf{q}}_k^+\) and bias \(\hat{\varvec{\beta }}_k^+\):

    \(\left\{ \begin{aligned} \hat{\textbf{q}}_k^+&= \Big [ \hat{\textbf{x}}_{1:3,k}^+ \hspace{4ex} 1 - \left( \hat{\textbf{x}}_{1:3,k}^+\right) ^T\! \hat{\textbf{x}}_{1:3,k}^+ \Big ]^T \otimes \hat{\textbf{q}}_k^- \\ \hat{\varvec{\beta }}_k^+&= \hat{\varvec{\beta }}_k^- + \hat{\textbf{x}}_{4:6,k}^+ \end{aligned}\right.\)

    • \(\hat{\textbf{x}}_{1:3,k}^+\) refers to portion of quaternion increment in state vector, and \(\hat{\textbf{x}}_{4:6,k}^+\) refers to portion of bias increment (see Eq. 7) in state vector.

    • \(\otimes\) means quaternion multiplication operation.

Weight parameters in steps 3, 4, 7 and 8 are:

$$\begin{aligned} \left\{ \begin{aligned} w_0^{(m)}&= \frac{h^2 - n}{h^2},&w_i^{(m)}&= \frac{1}{2h^2},\ {}&i \ge 1 \\ w_0^{(c)}&= \frac{\sqrt{h^2 - 1}}{2h^2},&w_i^{(c)}&= \frac{1}{2h},\ {}&i \ge 1 \end{aligned}\right. \end{aligned}$$

Indexes \({}_{k-1}\) and \({}_k\) represent previous and current epochs, respectively, minus sign (\({}^-\)) means propagated state before measurement update and plus sign (\({}^+\)) means state after measurement update.

3 Models

The satellite is assumed to be Earth-pointed, so the attitude is determined by the orientation of the satellite body system relative to the orbital system. The orbital system is centered on the center of mass and keeps its z axis pointing in the nadir direction, x axis parallel to the satellite velocity vector, and y axis completes the system. The attitude is given by the quaternion that transforms the orbital coordinate system to the satellite system, \(\textbf{q}_o^b\).

The satellite is modeled as a rigid body, with a uniformly distributed mass 3U CubeSat. Dynamic and kinematic models are obtained by:

$$\begin{aligned} \dot{\varvec{\omega }}_{ib}&= \textbf{J}^{-1}\begin{bmatrix} \textbf{N} - \textbf{S}\left( \varvec{\omega }_{ib}\right) \textbf{J}\varvec{\omega }_{ib} \end{bmatrix} \end{aligned}$$
(1)
$$\begin{aligned} \dot{\textbf{q}}_o^b&= \frac{1}{2}\varvec{\Omega }\left( \varvec{\omega }_{ob}\right) \textbf{q}_o^b \end{aligned}$$
(2)

where vector \(\varvec{\omega }_{ib}\) represents the angular velocity of the body frame to the inertial frame, \(\varvec{\omega }_{ob}\) represents the angular velocity of the body frame to orbital frame, \(\textbf{J}\) is the inertia matrix, and \(\textbf{N}\) represents the total torque actuating on the satellite in the body frame. This torque includes perturbation torques (gravity gradient, radiation pressure, atmospheric drag), and the control torque generated by magnetic coils. All quantities are written in the body frame. \(\textbf{S}\left( \varvec{\omega }\right)\) is a skew-symmetric matrix which performs a vectorial product:

$$\begin{aligned} \textbf{S}\left( \varvec{\omega }\right) = \begin{bmatrix} 0 &{} -\omega _z &{} \omega _y \\ \omega _z &{} 0 &{} -\omega _x \\ -\omega _y &{} \omega _x &{} 0 \end{bmatrix} \end{aligned}$$
(3)

and

$$\begin{aligned} \varvec{\Omega }\left( \varvec{\omega }_{ob}\right) = \begin{bmatrix} \textbf{S}\left( \varvec{\omega }_{ob}\right) &{} \varvec{\omega }_{ob}^b \\ -\left( \varvec{\omega }_{ob}\right) ^T &{} 0 \end{bmatrix} \end{aligned}$$
(4)

Angular velocities \(\varvec{\omega }_{ib}\) and \(\varvec{\omega }_{ob}\) are related:

$$\begin{aligned} \varvec{\omega }_{ib}&= \varvec{\omega }_{ob} + \varvec{\omega }_{io} \nonumber \\&= \varvec{\omega }_{ob} + \textbf{A}\left( \textbf{q}_o^b\right) \begin{bmatrix} 0&-\omega _o&0 \end{bmatrix}^T \end{aligned}$$
(5)

Here, \(\textbf{A}\left( \textbf{q}_o^b\right)\) is the transformation matrix from orbital to body system and \(\omega _o\) is orbital angular velocity.

[8] introduced a multiplicative algorithm to EKF using an error quaternion \(\delta \bar{\textbf{q}}\), which represents a small rotation from the predicted to the expected attitude [20]:

$$\begin{aligned} \delta \bar{\textbf{q}} = \textbf{q} \otimes \hat{\textbf{q}}^{-1} \end{aligned}$$
(6)

State vector is formed by quaternion increment \(\delta \textbf{q}\), which is the vector part of the error quaternion \(\delta \bar{\textbf{q}}\) in Eq. (6), and gyroscope bias \(\varvec{\beta }\). Thus, there are \(L = 6\) states:

$$\begin{aligned} \textbf{x} = \big [ \delta \textbf{q} \hspace{2ex} \varvec{\beta } \big ]^T \end{aligned}$$
(7)

The multiplicative form maintains a unitary quaternion norm (as used in quaternion estimate of step 11, Sect. 2), and this reduced representation avoids a singular covariance matrix. Additionally, quaternion estimate \(\hat{\textbf{q}}\) can be retrieved from increment \(\delta \textbf{q}\) whenever needed using Eq. (6) and in step 11.

To perform a discrete estimation, the model equation (2) can be written in discrete form as follows [20, 23]:

$$\begin{aligned} \left\{ \begin{aligned} \hat{\textbf{q}}_{k+1}^{-}&= \varvec{\Theta }\left( \hat{\varvec{\omega }}_k^+\right) \hat{\textbf{q}}_{k}^{+} \\ \hat{\varvec{\beta }}_{k+1}^-&= \hat{\varvec{\beta }}_{k}^+ \end{aligned}\right. \end{aligned}$$
(8)

with \(\hat{\varvec{\omega }}_k^+ = \varvec{\omega }_m - \hat{\varvec{\beta }}_k^+\) and

$$\begin{aligned}&\varvec{\Theta }\left( \hat{\varvec{\omega }}_k^+\right) = \nonumber \\&\begin{bmatrix} \cos \left( \frac{1}{2}\Vert \hat{\varvec{\omega }}_k^+\Vert \Delta t\right) \textbf{I}_{3\times 3}-\textbf{S}\left( \hat{\psi }_k^+\right) &{} \hat{\psi }_k^+ \\ -\left( \hat{\psi }_k^+\right) ^T &{} \cos \left( \frac{1}{2}\Vert \hat{\varvec{\omega }}_k^+\Vert \Delta t\right) \end{bmatrix} \nonumber \\&\hat{\psi }_k^+ = \frac{\sin \left( \frac{1}{2}\Vert \hat{\varvec{\omega }}_k^+\Vert \Delta t\right) \hat{\varvec{\omega }}_k^+}{\Vert \hat{\varvec{\omega }}_k^+\Vert } \end{aligned}$$
(9)

where \(\Vert \cdot \Vert\) represents the vector norm, \(\varvec{\omega }_m\) is the gyroscope measurement, and \(\Delta t\) is the update interval. Equation (8) constitute the time update function (function f in step 2, Sect. 2).

Measurements from the sun sensor and magnetometer are used to update quaternions and gyroscope bias in the filter. The measurements are taken in the body frame, while the expected measurements are calculated in the inertial frame, using simplified models as if these values were computed in the spacecraft onboard computer.

The Sun’s position in the inertial frame is calculated using a simplified model described in [6]. Prediction of sun sensor measurement is given by taking the unity vector pointing to the Sun \(\hat{\textbf{s}}^i\), and transforming to the body frame by attitude quaternion \(\textbf{q}_o^b\):

$$\begin{aligned} \hat{\textbf{s}}^b = \textbf{A}\left( \textbf{q}_o^b\right) \textbf{A}\left( \textbf{q}_i^o\right) \hat{\textbf{s}}^i \end{aligned}$$
(10)

where \(\hat{\textbf{s}}^b\) is the predicted sun sensor measurement in the body frame, \(\textbf{A}(\textbf{q})\) represents a transformation matrix related to quaternion \(\textbf{q}\) [24], \(\hat{\textbf{s}}^i\) is the unity vector pointing to the Sun, written in the inertial frame.

\(\textbf{q}_i^o\) depends on the orbital position, and since orbit determination is not part of this work, \(\textbf{q}_i^o\) is assumed to be known.

Magnetometer measurements are calculated in a similar way as Eq. (10). A 5th-order truncated IGRF-13 gives the magnitude of Earth’s magnetic field in the inertial frame and then transformed to the body frame. [6] also brings this procedure.

$$\begin{aligned} \hat{\textbf{m}}^b = \textbf{A}\left( \textbf{q}_o^b\right) \textbf{A}\left( \textbf{q}_i^o\right) \hat{\textbf{m}}^i \end{aligned}$$
(11)

These predicted values, Eqs. (10) and (11), compose the filter update function (function g in step 6):

$$\begin{aligned} g\left( \textbf{q}_o^b\right) = \begin{bmatrix} \hat{\textbf{m}}^b \\ \hat{\textbf{s}}^b \end{bmatrix} \end{aligned}$$
(12)

The filter uses these simplified models because, in practice, they are computed onboard, and used in measurement updates of the filter (step 6 of the algorithm) to retrieve predicted measurement vectors from sigma points.

Vector \(\textbf{y}_k\) is composed of sensor measurements in the body frame, simulated as described in Sect. 4.

Process and measurement noise covariance matrices are given, respectively, by:

$$\begin{aligned} \textbf{Q}_k = \begin{bmatrix} \left( \sigma _\omega ^2 \Delta t + \frac{1}{3}\sigma _\beta ^2\Delta t^3\right) \textbf{I}_{3\times 3} &{} -\frac{1}{2}\sigma _\beta ^2\Delta t^2\,\textbf{I}_{3\times 3} \\ -\frac{1}{2}\sigma _\beta ^2\Delta t^2\,\textbf{I}_{3\times 3} &{} \sigma _\beta ^2\Delta t\,\textbf{I}_{3\times 3} \end{bmatrix} \end{aligned}$$
(13)

and

$$\begin{aligned} \textbf{R}_k = \begin{bmatrix} \sigma _m^2 \textbf{I}_{3\times 3} &{} \textbf{0}_{3\times 3} \\ \textbf{0}_{3\times 3} &{} \sigma _s^2 \textbf{I}_{3\times 3} \end{bmatrix} \end{aligned}$$
(14)

4 Simulation

The simulated satellite was defined as a 3U CubeSat, total mass of 3.3 kg, and size of \(10 \times 10 \times 30\) cm, and the resulting inertia matrix was \(\textbf{J} = \texttt{diag}\begin{bmatrix} 0.0275&0.0275&0.0055\end{bmatrix}\,\text {kg\,m}^2\). The orbit was circular, with an altitude of 500 km. Complete orbital elements are shown in Table 1.

Table 1 Initial orbital elements

Attitude determination measurements were delivered by a dedicated coarse sun sensor, a 3-axis magnetometer, and a 3-axis gyroscope.

The sun sensor measurements were generated by adding a white noise at azimuth and elevation angles, relative to the satellite body, from the modeled sun position. The standard deviation of white noise was 0.035 rad. The sun’s position model is described in [25], and the eclipse model is described in [26].

The magnitude of Earth’s magnetic field was calculated using the IGRF-13 model [27], and magnetometer measurements were generated by adding a white noise on each magnetometer axis, with a standard deviation of \(3\cdot 10^{-7}\) T.

Gyroscope measurements were simulated as the sum of the true vehicle rotation rate, constant bias (given in Table 2), and white noise with a standard deviation of \(5\cdot 10^{-3}\,\text {rad/s}\).

The sensors’ noise standard deviation values are consistent with COTS components.

This simulation was carried out for 5 orbital periods. A B-dot controller, driven by magnetic torquers, is actuating the entire period. Sensors have a sampling rate of 1 Hz. Initial values of Euler angles (ZYX convention) and angular velocity are shown in Table 2.

Table 2 Initial parameters for simulation

Kalman filters initial values were initialized as shown in Table 3.

Table 3 Filter initialization parameters

5 Results and discussion

Results are presented in terms of quaternion errors at each epoch k:

$$\begin{aligned} \hat{\textbf{q}}_{\text {err},k} = \textbf{q}_o^b \otimes \left( \hat{\textbf{q}}_k^+\right) ^{-1} \end{aligned}$$
(15)

Here, \(\textbf{q}_o^b\) is the attitude quaternion given by simulation, and \(\hat{\textbf{q}}_k^+\) is the estimated attitude quaternion. Results are also presented in terms of Euler angle errors, defined as the difference between estimated and simulated Euler angles.

Figure 1 shows results of attitude estimation using the CDKF (described in Sect. 2). In Fig. 1a, the vector part of the quaternion error is shown. The scalar part is calculated in such a way as to maintain the quaternion unity norm, and it is not shown. In Fig. 1b, corresponding Euler angle errors are presented.

Fig. 1
figure 1

Attitude errors with CDKF

Filter covariances for each state are shown in Fig. 2.

Fig. 2
figure 2

Covariance of CDKF

Table 4 shows error statistics (mean and standard deviation, std.dev.) for quaternions, Euler angles, and estimated gyroscope bias errors. All statistics are calculated after filter convergence and excluding eclipse periods.

Table 4 Quaternion, Euler angles, and bias errors statistics for CDKF

To compare CDKF performance, attitude estimation results from the EKF and UKF are shown. Figures 3 and 4 show errors for EKF and UKF, in terms of quaternion and Euler angles, respectively.

Fig. 3
figure 3

Attitude errors with EKF

Fig. 4
figure 4

Attitude errors with UKF

Statistics for EKF and UKF are shown in Tables 5 and 6, respectively.

Table 5 Quaternion, Euler angles, and bias errors statistics for EKF
Table 6 Quaternion, Euler angles, and bias errors statistics for UKF

The occurrence of large initial errors in CDKF is due to the satellite entering an eclipse before the filter converges.

CDKF can estimate gyroscope bias more accurately than both EKF and UKF, so the attitude cannot be reliable during eclipses using these filters. When the bias is accurately estimated, the attitude can be obtained from magnetometer measurements alone. This can be observed in subsequent eclipse periods. However, some strategies for estimating or monitoring the bias during eclipses should be considered. Nevertheless, no strategy was adopted as this is outside the scope of this work.

5.1 Processing time

Figure 5 shows processing time, and Table 7 presents the mean and standard deviation for each filter. The sigma point approach has improved precision in estimates, but its computational burden is also higher. CDKF shows a processing time slightly smaller than UKF, although both filters are based on the sigma point approach.

Fig. 5
figure 5

Processing time

Table 7 Processing time for each filter

6 Conclusion

In this work, an attitude and gyroscope bias estimation method using CDKF was implemented, and the results were compared with those obtained using EKF and UKF.

In terms of precision, estimates of Euler angles in CDKF have a standard deviation of \(1.5^\circ\), and in EKF, \(1.5^\circ\) to \(3.5^\circ\). UKF has slightly higher values than CDKF, of about 1.5 to \(2^\circ\). The precision of bias estimation is about 10 times smaller for CDKF, \(0.5\cdot 10^{-3}\) rad/s. UKF and MEKF are about \(4\cdot 10^{-3}\) and \(3\cdot 10^{-3}\) rad/s, respectively.

Processing time is adequate for all filters for real-time applications. However, CDKF presents a processing time 6 times larger than MEKF, but smaller than UKF. In CubeSats, a dedicated processor may be considered for onboard attitude determination.

During eclipse periods and lack of information from sun sensors, estimation may be impaired. A possible way to estimate the attitude during eclipses is to ensure that the bias estimate is accurate so that the gyroscope measurements do not deteriorate substantially during this period. Otherwise, it is necessary to adopt a different strategy to estimate the attitude and biases during eclipses.

In future work, a method must be developed to ensure that a reliable attitude can be obtained. Future work could also include testing this filter on an actual processor and using real data.