文章目录

  • 一、IMU原理
  • 二、源码

一、IMU原理

二、源码

源文件:

#include "IMU.h"
#include "math.h"#define Kp 1.6f                        // proportional gain governs rate of convergence to accelerometer/magnetometer
#define Ki 0.001f                      // integral gain governs rate of convergence of gyroscope biases
#define halfT 0.001f                   // half the sample period 采样周期的一半
#define Gyro_Gr     0.0010653f      //角速度变成弧度 此参数对应陀螺2000度每秒
#define Gyro_G      0.0610351f      //角速度变成度   此参数对应陀螺2000度每秒
#define FILTER_NUM  20float     AngleOffset_Rol=0,AngleOffset_Pit=0;
float q0 = 1, q1 = 0, q2 = 0, q3 = 0;  // quaternion elements representing the estimated orientation
float exInt = 0, eyInt = 0, ezInt = 0; // scaled integral errorFLOAT_XYZ     Acc,Acc_out,Gyro;                 //把陀螺仪的各通道读出的数据,转换成弧度制
FLOAT_ANGLE Att_Angle;void Prepare_Data(FLOAT_XYZ *acc_in,FLOAT_XYZ *acc_out)
{static uint8_t     filter_cnt=0;static int16_t    ACC_X_BUF[FILTER_NUM],ACC_Y_BUF[FILTER_NUM],ACC_Z_BUF[FILTER_NUM];int32_t temp1=0,temp2=0,temp3=0;uint8_t i;ACC_X_BUF[filter_cnt] = acc_in->X;ACC_Y_BUF[filter_cnt] = acc_in->Y;ACC_Z_BUF[filter_cnt] = acc_in->Z;for(i=0;i<FILTER_NUM;i++){temp1 += ACC_X_BUF[i];temp2 += ACC_Y_BUF[i];temp3 += ACC_Z_BUF[i];}acc_out->X = temp1 / FILTER_NUM;acc_out->Y = temp2 / FILTER_NUM;acc_out->Z = temp3 / FILTER_NUM;filter_cnt++;if(filter_cnt==FILTER_NUM)   filter_cnt=0;
}void IMUupdate(FLOAT_XYZ *gyr, FLOAT_XYZ *acc, FLOAT_ANGLE *angle)
{float ax = acc->X,ay = acc->Y,az = acc->Z;float gx = gyr->X,gy = gyr->Y,gz = gyr->Z;float norm;float vx, vy, vz;float ex, ey, ez;// 先把这些用得到的值算好float q0q0 = q0*q0;float q0q1 = q0*q1;float q0q2 = q0*q2;
//  float q0q3 = q0*q3;float q1q1 = q1*q1;
//  float q1q2 = q1*q2;float q1q3 = q1*q3;float q2q2 = q2*q2;float q2q3 = q2*q3;float q3q3 = q3*q3;if(ax*ay*az==0)return;gx *= Gyro_Gr;gy *= Gyro_Gr;gz *= Gyro_Gr;norm = sqrt(ax*ax + ay*ay + az*az);       //acc数据归一化ax = ax /norm;ay = ay / norm;az = az / norm;//   if(norm>16500)
//  {Rc_C.ARMED=0;}// estimated direction of gravity and flux (v and w)      估计重力方向和流量/变迁// 这是把四元数换算成《方向余弦矩阵》中的第三列的三个元素。// 根据余弦矩阵和欧拉角的定义,地理坐标系的重力向量,转到机体坐标系,正好是这三个元素。// 所以这里的vx\y\z,其实就是当前的欧拉角(即四元数)的机体坐标参照系上,换算出来的重力单位向量。      vx = 2*(q1q3 - q0q2);                                                vy = 2*(q0q1 + q2q3);vz = q0q0 - q1q1 - q2q2 + q3q3 ;// error is sum of cross product between reference direction of fields and direction measured by sensorsex = (ay*vz - az*vy) ;        //向量外积在相减得到差分就是误差                                       ey = (az*vx - ax*vz) ;ez = (ax*vy - ay*vx) ;exInt = exInt + ex * Ki;    //对误差进行积分eyInt = eyInt + ey * Ki;ezInt = ezInt + ez * Ki;// adjusted gyroscope measurementsgx = gx + Kp*ex + exInt;  //将误差PI后补偿到陀螺仪,即补偿积分漂移gy = gy + Kp*ey + eyInt;    gz = gz + Kp*ez + ezInt; //这里的gz由于没有观测者进行矫正会产生漂移,表现出来的就是积分自增或自减// integrate quaternion rate and normalise                       //四元素的微分方程,一阶毕卡求解法,更新四元数q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;// normalise quaternionnorm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);q0 = q0 / norm;q1 = q1 / norm;q2 = q2 / norm;q3 = q3 / norm;angle->yaw += -gyr->Z*Gyro_G*0.002f;angle->rol = -asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3 - AngleOffset_Pit; // pitchangle->pit = -atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3 - AngleOffset_Rol; // roll
}

头文件:

#ifndef _IMU_H_
#define _IMU_H_
#include  "stm32f1xx_hal.h"#define G          9.80665f                // m/s^2
#define RadtoDeg    57.324841f              //弧度到角度 (弧度 * 180/3.1415)
#define DegtoRad    0.0174533f              //角度到弧度 (角度 * 3.1415/180)//三轴浮点型
typedef struct
{int16_t X;int16_t Y;int16_t Z;
}FLOAT_XYZ;//姿态解算后的角度
typedef struct
{float rol;float pit;float yaw;
}FLOAT_ANGLE;extern FLOAT_XYZ   Acc,Acc_out,Gyro;                 //把陀螺仪的各通道读出的数据,转换成弧度制
extern FLOAT_ANGLE Att_Angle;
void Prepare_Data(FLOAT_XYZ *acc_in,FLOAT_XYZ *acc_out);
void IMUupdate(FLOAT_XYZ *Gyr_rad,FLOAT_XYZ *Acc_filt,FLOAT_ANGLE *Att_Angle);#endif

调用方式:

#include "IMU.h"Prepare_Data(&Acc,&Acc_out);//Acc输入、Acc_out输出
IMUupdate(&Gyro,&Acc_out,&Att_Angle);

IMU:姿态解算算法集合相关推荐

  1. 详解几种飞控的姿态解算算法

    姿态解算是飞控的一个基础.重要部分,估计出来的姿态会发布给姿态控制器,控制飞行平稳,是飞行稳定的最重要保障.有关姿态解算的基础知识,这里笔者不会细细描述,有关这方面的资料,网上已经有很多.主要是先掌握 ...

  2. bvp解算器是什么_几种飞控的姿态解算算法

    姿态解算是飞控的一个基础.重要部分,估计出来的姿态会发布给姿态控制器,控制飞行平稳,是飞行稳定的最重要保障.有关姿态解算的基础知识,这里笔者不会细细描述,有关这方面的资料,网上已经有很多.主要是先掌握 ...

  3. 四元数AHRS姿态解算和IMU姿态解算分析

    ref:https://blog.csdn.net/xiaoxie613520/article/details/78227170 AHRS是自动航向基准系统(Automatic Heading Ref ...

  4. imu matlab,IMU姿态解算matlab

    [实例简介] IMU姿态解算matlabIMU姿态解算matlabIMU姿态解算matlab [实例截图] [核心代码] GaitTrackingWithx-IMU └── Gait Tracking ...

  5. 十三. 四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算法<中>

    十二.四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算法(上) 十三.四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算法(中) 十四.四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算 ...

  6. 十四. 四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算法<下>

    十二.四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算法(上) 十三.四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算法(中) 十四.四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算 ...

  7. 十二.四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算法<上>

    这是"四轮车驱动控制"系列,分多个小节来介绍: 1. 八.四轮车驱动开发之一:正/逆向运动学分析 2. 九.四轮车驱动开发之二: 配置PWM驱动直流电机 3. 十.四轮车驱动开发之 ...

  8. 四元数姿态解算算法基础

    文章目录 姿态的表示方法 四元数表示姿态的物理意义 使用四元数进行载体姿态更新方程 四元数微分方程 四元数初始值确定 姿态的表示方法 载体姿态有多种表示方法,常见的三种:欧拉角,姿态矩阵,四元数. 欧 ...

  9. imu姿态解算+卡尔曼滤波融合JAVA版(此版本卡拉曼滤波奇点有错误)

    原版地址:IMU9轴卡尔曼滤波 增加mpu6050 陀螺仪零飘矫正,imu算法优化 KalmAndAndIMU 类: import java.util.Vector;public class Kalm ...

最新文章

  1. k8s中几种port介绍
  2. 谈题库系统(Samplx)项目之进展
  3. 数据结构实验之栈与队列十一:refresh的停车场
  4. python获取docx文档的内容(文本)
  5. 十大开源ERP点评 献给深水区的中小企业和CIO们
  6. 主席树——多棵线段树的集合
  7. 重磅发布 阿里云数据中台全新产品DataTrust聚焦企业数据安全保障
  8. 简单的选项卡功能实现
  9. HDU2176 取(m堆)石子游戏【Nim博弈】
  10. python整数类型进制表示_Python的基本数值类型
  11. Dynamics AX2012 Menu Items Type
  12. c语言三角波的mif文件,EDA课程设计报告-正弦波信号发生器的设计.doc
  13. java程序模拟QQ空间登录 - 并模拟刷说说的赞
  14. A1008 Elevater(20)
  15. Linux stress
  16. Win7旗舰版安装经验
  17. 水木周平戏说中国网络黑幽默!
  18. SAP Data Service操作简介
  19. 智佩店装完成千万级天使轮融资,深耕连锁店装
  20. MySQL修改密码(三种方法示例)

热门文章

  1. Java韩顺平02变量
  2. cocos creator Android 接入Google登陆sdk
  3. idea修改 项目代码,浏览器页面不生效 解决方案
  4. 【樂理】鋼琴琴鍵的頻率
  5. Web3 时代 传统品牌如何玩转 NFT 营销?
  6. 经典常用SQL语句大全(绝对的经典)
  7. Scipy库(win下安装)
  8. 如何优雅实现自动化部署
  9. Linux 机器重启reboot命令
  10. 成都软通动力的的OFFER