Midnight Sun Firmware
Loading...
Searching...
No Matches
imu.h
1#pragma once
2
3/************************************************************************************************
4 * @file imu.h
5 *
6 * @brief Header file for imu
7 *
8 * @date 2025-12-31
9 * @author Midnight Sun Team #24 - MSXVI
10 ************************************************************************************************/
11
12/* Standard library Headers */
13
14/* Inter-component Headers */
15#include "can.h"
16#include "spi.h"
17
18/* Intra-component Headers */
19#include "bmi323.h"
20
27StatusCode imu_init(Bmi323Storage *storage, Bmi323Settings *settings);
28
29StatusCode imu_run();
30
31#define DELTA_T 0.1f
32#define PI 3.14159265358f
33#define GYRO_MEAN_ERROR (PI * (5.0f / 180.0f))
34#define BETA 0.8660254f * GYRO_MEAN_ERROR
35
36#include <math.h>
37#include <stdio.h>
38
39struct quaternion {
40 float q1;
41 float q2;
42 float q3;
43 float q4;
44};
45
46extern struct quaternion q_est;
47
48struct quaternion quat_mult(struct quaternion q_L, struct quaternion q_R);
49static inline void quat_scalar(struct quaternion *q, float scalar) {
50 q->q1 *= scalar;
51 q->q2 *= scalar;
52 q->q3 *= scalar;
53 q->q4 *= scalar;
54}
55static inline void quat_add(struct quaternion *Sum, struct quaternion L, struct quaternion R) {
56 Sum->q1 = L.q1 + R.q1;
57 Sum->q2 = L.q2 + R.q2;
58 Sum->q3 = L.q3 + R.q3;
59 Sum->q4 = L.q4 + R.q4;
60}
61
62static inline void quat_sub(struct quaternion *Sum, struct quaternion L, struct quaternion R) {
63 Sum->q1 = L.q1 - R.q1;
64 Sum->q2 = L.q2 - R.q2;
65 Sum->q3 = L.q3 - R.q3;
66 Sum->q4 = L.q4 - R.q4;
67}
68
69static inline struct quaternion quat_conjugate(struct quaternion q) {
70 q.q2 = -q.q2;
71 q.q3 = -q.q3;
72 q.q4 = -q.q4;
73 return q;
74}
75
76static inline float quat_Norm(struct quaternion q) {
77 return sqrt(q.q1 * q.q1 + q.q2 * q.q2 + q.q3 * q.q3 + q.q4 * q.q4);
78}
79
80static inline void quat_Normalization(struct quaternion *q) {
81 float norm = quat_Norm(*q);
82 q->q1 /= norm;
83 q->q2 /= norm;
84 q->q3 /= norm;
85 q->q4 /= norm;
86}
87
88void imu_filter(float ax, float ay, float az, float gx, float gy, float gz);
89void eulerAngles(struct quaternion q, float *roll, float *pitch, float *yaw);
90
StatusCode
StatusCodes for various errors.
Definition: status.h:27
Definition: bmi323.h:181
Storage struct for bmi323.
Definition: bmi323.h:190
Definition: imu.h:37