Add bare-metal TDK IMU ESKF fusion

This commit is contained in:
2026-07-13 18:26:06 +03:00
parent 4edb665d52
commit f16ac8aa80
29 changed files with 5097 additions and 9 deletions
@@ -0,0 +1,42 @@
#ifndef FUSION_BUS_H
#define FUSION_BUS_H
#include <stdbool.h>
#include <stdint.h>
#include "fusion_measurement.h"
#ifndef FUSION_IMU_QUEUE_CAPACITY
#define FUSION_IMU_QUEUE_CAPACITY 256u
#endif
#ifndef FUSION_GPS_QUEUE_CAPACITY
#define FUSION_GPS_QUEUE_CAPACITY 8u
#endif
typedef struct {
fusion_imu_measurement_t imu_queue[FUSION_IMU_QUEUE_CAPACITY];
fusion_gps_measurement_t gps_queue[FUSION_GPS_QUEUE_CAPACITY];
volatile unsigned int imu_head;
volatile unsigned int imu_tail;
volatile unsigned int gps_head;
volatile unsigned int gps_tail;
volatile uint64_t imu_overflow_count;
volatile uint64_t gps_overflow_count;
} fusion_bus_t;
void fusion_bus_init(fusion_bus_t* bus);
/* Single producer (TDK ISR), single consumer (foreground). */
bool fusion_bus_publish_imu(fusion_bus_t* bus,
const fusion_imu_measurement_t* measurement);
bool fusion_bus_take_imu(fusion_bus_t* bus,
fusion_imu_measurement_t* measurement_out);
/* Single producer (GPS WLS foreground), single fusion consumer. */
bool fusion_bus_publish_gps(fusion_bus_t* bus,
const fusion_gps_measurement_t* measurement);
bool fusion_bus_take_gps(fusion_bus_t* bus,
fusion_gps_measurement_t* measurement_out);
#endif