测试传感器:MPU9250,九轴传感器,其中有三个轴就是陀螺仪的三个方向角速度。

陀螺仪在每个采样点获得:采样时刻(单位微妙),XYZ三个方向的角速度(单位弧度/秒),记为:wx, wy, wz。陀螺仪静止时,wx, wy, wz也是有读数的,这就是陀螺仪的零漂。

实验一:将陀螺仪绕X轴旋转时,只有wx有读数;将陀螺仪绕Y轴旋转时,只有wy有读数;将陀螺仪绕Z轴旋转时,只有wz有读数;

实验二:将陀螺仪绕XY面上的轴旋转,wz读数为零,即与旋转轴垂直的轴上的角速度为零。

因为陀螺仪采样率很高(1000Hz),通过瞬时读数计算姿态,可以看做:先绕X轴旋转,再绕Y轴旋转,再绕Z轴旋转。

下面这段代码实现了一个简单的陀螺仪姿态算法,开机并静置几十秒后,拿着陀螺仪旋转,十几分钟内姿态是正确的,之后由于积分累积,误差就越来越大了。

// 参数说明:
// sampleTS   : 采样时刻,单位:微秒
// wx, wy, wz :陀螺仪采样,单位:弧度/秒
void GyroExperiment(uint64_t sampleTS, float wx, float wy, float wz)
{// 传感器启动时刻static uint64_t s_lasttime = 0;static uint64_t s_lastlog = 0;if(s_lasttime == 0){s_lasttime = sampleTS;s_lastlog = sampleTS;return;}// 采用启动后5秒-35秒的采用平均值作为陀螺仪零漂// 在此期间,应保持陀螺仪静止static float s_wx = 0, s_wy = 0, s_wz = 0;    // 陀螺仪零漂static uint64_t s_elapsed = 0;if(s_elapsed < 35000000){static int s_SampleCnt = 0;if(s_elapsed > 5000000){s_wx += (wx - s_wx) / (s_SampleCnt + 1);s_wy += (wy - s_wy) / (s_SampleCnt + 1);s_wz += (wz - s_wz) / (s_SampleCnt + 1);s_SampleCnt++;}s_elapsed += (sampleTS - s_lasttime);s_lasttime = sampleTS;}// 初始姿态,采用三个轴向量表示static float Xx=1,Xy=0,Xz=0;    // X轴static float Yx=0,Yy=1,Yz=0;    // Y轴static float Zx=0,Zy=0,Zz=1;    // Z轴// 根据陀螺仪读数计算三个轴的旋转量float interval = (sampleTS - s_lasttime) / 1e6;float rx = (wx - s_wx) * interval;float ry = (wy - s_wy) * interval;float rz = (wz - s_wz) * interval;// 分别构造绕三个轴旋转的四元数float cos,sin;cos = cosf(rx/2); sin = sinf(rx/2); Quaternion qx(cos, Xx * sin, Xy * sin, Xz * sin);cos = cosf(ry/2); sin = sinf(ry/2); Quaternion qy(cos, Yx * sin, Yy * sin, Yz * sin);cos = cosf(rz/2); sin = sinf(rz/2); Quaternion qz(cos, Zx * sin, Zy * sin, Zz * sin);// 依次旋转三个轴向量Quaternion q = qx*qz*qy; q.normalize(); Quaternion qi = q.inverse();Quaternion QX(0, Xx, Xy, Xz); QX = q*QX*qi; QX.normalize(); Xx = QX.q2; Xy = QX.q3; Xz = QX.q4;        // 旋转X轴;Quaternion QY(0, Yx, Yy, Yz); QY = q*QY*qi; QY.normalize(); Yx = QY.q2; Yy = QY.q3; Yz = QY.q4;        // 旋转Y轴;Quaternion QZ(0, Zx, Zy, Zz); QZ = q*QZ*qi; QZ.normalize(); Zx = QZ.q2; Zy = QZ.q3; Zz = QZ.q4;        // 旋转Z轴;// 每1秒输出一次姿态数据s_lasttime = sampleTS;if(sampleTS - s_lastlog > 1000000){console->printf("attitude: [%f, %f, %f]; [%f, %f, %f]; [%f, %f, %f]\n", Xx, Xy, Xz, Yx, Yy, Yz, Zx, Zy, Zz);s_lastlog = sampleTS;}
}

转载于:https://www.cnblogs.com/zhuyingchun/p/5882194.html

MEMS陀螺仪姿态算法入门相关推荐

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

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

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

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

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

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

  4. 公开课 | 让机器读懂你的意图——人体姿态估计入门

    机器视觉的主要任务是让机器看懂世界,而世界的主要组成是人类社会.我们一直在围绕物和人的识别展开研究:物品检测识别.行人检测与跟踪.人脸识别. 事实上,行人检测是人的整体粗粒度识别,人脸识别是人的局部特 ...

  5. 【转】MEMS陀螺仪的简要介绍(性能参数和使用)

    MEMS传感器市场浪潮可以从最早的汽车电子到近些年来的消费电子,和即将来到的物联网时代.如今单一的传感器已不能满足人们对功能.智能的需要,像包括MEMS惯性传感器.MEMS环境传感器.MEMS光学传感 ...

  6. MEMS 陀螺仪资料整理之《MEMS 陀螺仪简介及其应用》

    一.MEMS是什么? MEMS是英文MicroElectro Mechanical systems的缩写,即微电子机械系统.微电子机械系统(MEMS)技术是建立在微米/纳米技术(micro/nanot ...

  7. MEMS陀螺仪如何进行信号温漂补偿

    MEMS陀螺仪具有尺寸小.能耗低.质量轻.价格低等优点,应用广泛,但由于加工工艺的原因,目前微机械陀螺仪精度相对较低,陀螺仪结构尺寸.材料性质及检测电路中电子器件均会受温度影响,克服温度漂移.随机误差 ...

  8. MEMS 陀螺仪抗震动

    学习使用CSDN的博客 @TOC 目前我正研究如何消除机械振动对MEMS陀螺仪输出信号的影响,很辛苦,终于确定了方案,软硬件都确定了,算法虽然复杂,但效果很好, 欢迎使用Markdown编辑器 你好! ...

  9. matlab陀螺仪飞行器滤波补偿,实验证明,MEMS陀螺仪如何进行信号温漂补偿

    MEMS陀螺仪具有尺寸小.能耗低.质量轻.价格低等优点,应用广泛,但由于加工工艺的原因,目前微机械陀螺仪精度相对较低,陀螺仪结构尺寸.材料性质及检测电路中电子器件均会受温度影响,克服温度漂移.随机误差 ...

最新文章

  1. 你只使用到了 VS Code 20% 的功能?让 VS Code 首著作者带你玩转 VS Code!
  2. rails 数据库相关操作命令
  3. 优化 bulk insert
  4. OSS音频编程概述(DSP部分)
  5. 学习笔记之23-typedef
  6. Exchange 2013 SP1部署系列7:发送连接器的配置
  7. linux设置php时间,修改 linux 时区时间和 php 时区(示例代码)
  8. 手把手教你构建食物识别AI:小白轻易可上手,人气高赞有Demo | 资源
  9. repo/git提交代码
  10. 将Maven项目转换成Eclipse支持的Java项目
  11. Eclipse: the import java.util cannot be resolved
  12. android 新版本gradle,Android:更新到新版本的gradle后出现“Manife...
  13. 《JAVA并发编程实践JavaConcurrencyinPractice-中文-高清-带书签-完整版(Doug Lea)》
  14. 2020年第六届 美亚杯电子取证 团体赛 wp
  15. LCD的控制驱动及基与MCU接口的特点
  16. 【“玩物立志”-scratch少儿编程】亲手实现小猫走迷宫小游戏:其实挺简单
  17. 7.6批量下载网易云歌曲
  18. 系列一:HIDS初识
  19. 样本方差为什么要除n-1,而不是n
  20. 7-2 愿天下有情人都是失散多年的兄妹

热门文章

  1. 电视剧《武林外传》在线点播
  2. 从此以后 陌路此生。伤感日志
  3. IDEA报错:The injection point has the following annotations:....
  4. SpringBoot配置文件分类
  5. Git实用教程 3.0:查看工作状态和历史提交
  6. 计算机硬件耗电,【求助】我想查询我的电脑每一种硬件的耗电功率,谁能给个查询软件?...
  7. STM32的SPI的原理与使用(W25Q128附代码)
  8. 我对CTO的理解【转】
  9. android 百度定位只定位一次,解决百度定位,只能定位一次,后面没办法定位的方法(超级简单,一次见效)...
  10. 分享30个免费主机的网站