Sensor Fusion Library 0.6.1
Orientation sensing for Espressif (ESP32, ESP8266) processors
Loading...
Searching...
No Matches
magnetic.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015, Freescale Semiconductor, Inc.
3 * Copyright 2016-2017 NXP
4 * Copyright 2020 Bjarne Hansen
5 * All rights reserved.
6 *
7 * SPDX-License-Identifier: BSD-3-Clause
8 */
9
18#ifndef MAGNETIC_H
19#define MAGNETIC_H
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
25#ifndef F_USING_MAG
26#define F_USING_MAG 0x0002 // normally should be defined in build.h
27#endif
28
29#if F_USING_MAG
32#define MAGBUFFSIZEX 14
33#define MAGBUFFSIZEY (2 * MAGBUFFSIZEX)
34#define MINMEASUREMENTS4CAL 110
35#define MINMEASUREMENTS7CAL 220
36#define MINMEASUREMENTS10CAL 330
37#define MAXMEASUREMENTS 360
38#define CAL_INTERVAL_SECS 300
39#define MINBFITUT 10.0F
40#define MAXBFITUT 90.0F
41#define FITERRORAGINGSECS 86400.0F
42#define MESHDELTACOUNTS 50
43#define DEFAULTB 50.0F
45
58
61{
62 // start of elements stored to flash memory on Save (16 * 4 = 64 bytes)
63 float fV[3];
64 float finvW[3][3];
65 float fB;
66 float fBSq;
68 int32_t iValidMagCal;
69 // end of elements stored to flash memory
70 // start of working elements not stored to flash memory
71 float ftrV[3];
72 float ftrinvW[3][3];
73 float ftrB;
75 float fA[3][3];
76 float finvA[3][3];
77 float fmatA[10][10];
78 float fmatB[10][10];
79 float fvecA[10];
80 float fvecB[4];
81 float fYTY;
82 int32_t iSumBs[3];
83 int32_t iMeanBs[3];
84 int32_t itimeslice;
92};
93
94
95struct MagSensor; // actual typedef is located in sensor_fusion_types.h
96
102void fInitializeMagCalibration(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer);
103void iUpdateMagBuffer(struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag, int32_t loopcounter);
104void fInvertMagCal(struct MagSensor *pthisMag, struct MagCalibration *pthisMagCal);
105void fRunMagCalibration(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor* pthisMag, int32_t loopcounter);
106void fUpdateMagCalibration4(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag);
107void fUpdateMagCalibration7(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag);
108void fUpdateMagCalibration10(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag);
109void fUpdateMagCalibration4Slice(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag);
110void fUpdateMagCalibration7Slice(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag);
111void fUpdateMagCalibration10Slice(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag);
113#else // if F_USING_MAG
114struct MagBuffer
115{
116 void *placeholder;
117};
118
120struct MagCalibration
121{
122 void *placeholder;
123};
124#endif // if F_USING_MAG
125
126#ifdef __cplusplus
127}
128#endif
129
130
131#endif // #ifndef MAGNETIC_H
void fRunMagCalibration(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag, int32_t loopcounter)
Run the magnetic calibration. Calibration is done in time-slices, to avoid excessive CPU load during ...
Definition magnetic.c:352
#define MAGBUFFSIZEX
x dimension in magnetometer buffer (14x28 equals 392 elements)
Definition magnetic.h:32
#define MAGBUFFSIZEY
y dimension in magnetometer buffer (14x28 equals 392 elements)
Definition magnetic.h:33
int16_t tanarray[MAGBUFFSIZEX - 1]
array of tangents of (100 * angle)
Definition magnetic.h:55
int32_t index[MAGBUFFSIZEX][MAGBUFFSIZEY]
array of time indices
Definition magnetic.h:54
int16_t iMagBufferCount
number of magnetometer readings
Definition magnetic.h:56
int16_t iBs[3][MAGBUFFSIZEX][MAGBUFFSIZEY]
uncalibrated magnetometer readings
Definition magnetic.h:53
Magnetic Calibration Structure.
Definition magnetic.h:61
float finvA[3][3]
inverse of ellipsoid matrix A
Definition magnetic.h:76
float ftrFitErrorpc
trial value of fit error %
Definition magnetic.h:74
float fB
current geomagnetic field magnitude (uT)
Definition magnetic.h:65
int8_t iInitiateMagCal
flag to start a new magnetic calibration
Definition magnetic.h:87
float fFitErrorpc
current fit error %
Definition magnetic.h:67
float fA[3][3]
ellipsoid matrix A
Definition magnetic.h:75
int8_t i4ElementSolverTried
flag to denote at least one attempt made with 4 element calibration
Definition magnetic.h:89
int8_t i10ElementSolverTried
flag to denote at least one attempt made with 10 element calibration
Definition magnetic.h:91
float ftrV[3]
trial value of hard iron offset z, y, z (uT)
Definition magnetic.h:71
float ftrB
trial value of geomagnetic field magnitude in uT
Definition magnetic.h:73
float fV[3]
current hard iron offset x, y, z, (uT)
Definition magnetic.h:63
float fvecA[10]
scratch 10x1 vector used by calibration algorithms
Definition magnetic.h:79
float fmatB[10][10]
scratch 10x10 float matrix used by calibration algorithms
Definition magnetic.h:78
float finvW[3][3]
current inverse soft iron matrix
Definition magnetic.h:64
int32_t iSumBs[3]
sum of measurements in buffer (counts)
Definition magnetic.h:82
float ftrinvW[3][3]
trial inverse soft iron matrix size
Definition magnetic.h:72
int32_t iMeanBs[3]
average magnetic measurement (counts)
Definition magnetic.h:83
int8_t i7ElementSolverTried
flag to denote at least one attempt made with 7 element calibration
Definition magnetic.h:90
int8_t iNewCalibrationAvailable
flag denoting that a new calibration has been computed
Definition magnetic.h:86
float fBSq
square of fB (uT^2)
Definition magnetic.h:66
float fYTY
Y^T.Y for 4 element calibration = (iB^2)^2.
Definition magnetic.h:81
int8_t iCalInProgress
flag denoting that a calibration is in progress
Definition magnetic.h:85
int32_t itimeslice
counter for tine slicing magnetic calibration calculations
Definition magnetic.h:84
int32_t iValidMagCal
solver used: 0 (no calibration) or 4, 7, 10 element
Definition magnetic.h:68
int8_t iMagBufferReadOnly
flag to denote that the magnetic measurement buffer is temporarily read only
Definition magnetic.h:88
float fvecB[4]
scratch 4x1 vector used by calibration algorithms
Definition magnetic.h:80
float fmatA[10][10]
scratch 10x10 float matrix used by calibration algorithms
Definition magnetic.h:77
The MagSensor structure stores raw and processed measurements for a 3-axis magnetic sensor.