99 lines
1.8 KiB
C
99 lines
1.8 KiB
C
/*
|
||
开源的AHRS算法。
|
||
MadgwickAHRS
|
||
*/
|
||
|
||
#pragma once
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#include "user_math.h"
|
||
|
||
/* 欧拉角(Euler angle) */
|
||
typedef struct {
|
||
float yaw; /* 偏航角(Yaw angle) */
|
||
float pit; /* 俯仰角(Pitch angle) */
|
||
float rol; /* 翻滚角(Roll angle) */
|
||
} AHRS_Eulr_t;
|
||
|
||
/* 加速度计 Accelerometer */
|
||
typedef struct {
|
||
float x;
|
||
float y;
|
||
float z;
|
||
} AHRS_Accl_t;
|
||
|
||
/* 陀螺仪 Gyroscope */
|
||
typedef struct {
|
||
float x;
|
||
float y;
|
||
float z;
|
||
} AHRS_Gyro_t;
|
||
|
||
/* 磁力计 Magnetometer */
|
||
typedef struct {
|
||
float x;
|
||
float y;
|
||
float z;
|
||
} AHRS_Magn_t;
|
||
|
||
/* 四元数 */
|
||
typedef struct {
|
||
float q0;
|
||
float q1;
|
||
float q2;
|
||
float q3;
|
||
} AHRS_Quaternion_t;
|
||
|
||
/* 姿态解算算法主结构体 */
|
||
typedef struct {
|
||
/* 四元数 */
|
||
AHRS_Quaternion_t quat;
|
||
|
||
float inv_sample_freq; /* 采样频率的的倒数 */
|
||
} AHRS_t;
|
||
|
||
/**
|
||
* @brief 初始化姿态解算
|
||
*
|
||
* @param ahrs 姿态解算主结构体
|
||
* @param magn 磁力计数据
|
||
* @param sample_freq 采样频率
|
||
* @return int8_t 0对应没有错误
|
||
*/
|
||
int8_t AHRS_Init(AHRS_t *ahrs, const AHRS_Magn_t *magn, float sample_freq);
|
||
|
||
/**
|
||
* @brief 姿态运算更新一次
|
||
*
|
||
* @param ahrs 姿态解算主结构体
|
||
* @param accl 加速度计数据
|
||
* @param gyro 陀螺仪数据
|
||
* @param magn 磁力计数据
|
||
* @return int8_t 0对应没有错误
|
||
*/
|
||
int8_t AHRS_Update(AHRS_t *ahrs, const AHRS_Accl_t *accl,
|
||
const AHRS_Gyro_t *gyro, const AHRS_Magn_t *magn);
|
||
|
||
/**
|
||
* @brief 通过姿态解算主结构体中的四元数计算欧拉角
|
||
*
|
||
* @param eulr 欧拉角
|
||
* @param ahrs 姿态解算主结构体
|
||
* @return int8_t 0对应没有错误
|
||
*/
|
||
int8_t AHRS_GetEulr(AHRS_Eulr_t *eulr, const AHRS_t *ahrs);
|
||
|
||
/**
|
||
* \brief 将对应数据置零
|
||
*
|
||
* \param eulr 被操作的数据
|
||
*/
|
||
void AHRS_ResetEulr(AHRS_Eulr_t *eulr);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|