首页 > 其他分享 >对陀螺仪 Z 轴角度的线性化处理

对陀螺仪 Z 轴角度的线性化处理

时间:2023-08-10 22:12:21浏览次数:42  
标签:err 陀螺仪 double 圈数 角度 线性化 360

多数陀螺仪 Z 轴方向角度变化如下图所示:

为方便进行 PID,需要对其进行线性化处理

观察图像不难发现,由于非线性是跳跃间断点造成的,所以间断点两端会存在巨大的数值跳变,这个跳变就是我们可以利用的地方

定义一个圈数变量,初值为0,每判定一次越界则圈数变量的值发生 1 的变化 。假设采样频率无限大,那么检测到角度发生了360°变化时就可以判定发生了越界,圈数就可以相应变化,这种理想条件下的伪代码可以写成:

int 圈数 = 0;

if(这一圈角度 - 上一圈角度 == -360) 圈数++;
else if(这一圈角度 - 上一圈角度 == 360) 圈数--;

处理后的角度 = 圈数 * 360 + 这一圈角度;

但是实际情况下受采样周期的限制,这一圈角度和上一圈角度采样点可能像下图中 G 和 H 一样,
可以看到 G 和 H 之间的角度差就小于 360°

可以发现采样周期角速度与判定界限之间满足一下关系式:

同时还要防止误触发,也就是正常旋转的时候不能记成圈数变化:

综合上面两个式子,angelBound 为 180° 的时候,可以适应 最大的角速度 和 最低的采样频率

完整源码如下:

每次传入当前的角度,就会返回线性化处理后的角度

double getLinearAngel(double angelNow){
  static double angelLast = 0;
  static int roundCount = 0;
  double err = angelNow - angelLast;

  if(err < -180)  roundCount++;
  else if (err > 180) roundCount--;

  angelLast = angelNow;

  return roundCount * 360 + angelNow;
}

在此基础上可以进行推广,所有图像类似于下图的数据都可以用这种方法进行线性化处理,记最大值为 max,最小值为 min,则最优界限为 (max + min)/2

代码也可以推广为:

double getLinearData(double dataNow){
  static double dataLast = 0;
  static int count = 0;
  double err = dataNow - dataLast;

  if(err < -BOUND)  count++;
  else if (err > BOUND) count--;

  dataLast = dataNow;

  return count * BOUND * 2 + dataNow;
}

标签:err,陀螺仪,double,圈数,角度,线性化,360
From: https://www.cnblogs.com/Sound-Sleep/p/linearGryo.html

相关文章

  • 从开发角度设计服务端测试用例
    [本文出自天外归云的博客园]下面对一些服务端测试用例的设计思路做一个简单总结异常参数值组合测试涉及:接口测试、单元测试方法:构造足够多种“异常类型数据”以及足够多种“异常参数组合”对接口或函数进行接口测试或单元测试非法请求测试涉及:接口测试方法:请求接口时,......
  • 陀螺仪的使用及四元数解算(MPU6050为例)
    陀螺仪的介绍常用的六轴陀螺仪有MPU6050,icm-20602。MPU6050基本上只用软件IIC驱动,速率较慢,数据漂移也相对大一点。陀螺仪的使用以MPU6050为例。软件IIC驱动->MPU6050寄存器基本配置->读取原始数据->将原始数据滤波后使用。原始数据可以使用互补滤波,卡尔曼滤波,解算四元......
  • 站在营销的角度浅谈直播行业
    直播开发这个行业,在成就了一批网红、暴发户的同时,也给平台和商家带来了丰厚的利益,从直播程序定位搭建方案到最后的测试上架,每一步都要条理清晰,营销是一门学问,今天就来浅谈一下直播行业的营销机制。1.平台选择:营销机制首先就是选择合适的平台。由于用户群体和特点不同,因此根据目标群......
  • H5 陀螺仪
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title></hea......
  • R语言ggplot绘图调整刻度线标签文件的角度
     001、dat<-data.frame(a=1:5,b=1:5)datlibrary(ggplot2)p<-ggplot(data=dat,aes(x=a,y=b))+geom_point()##默认绘图p 002、调整y轴刻度线标签的角度p+theme(axis.text.y=element_text(angle=90,face="bold"))##y轴调整为90度......
  • 【雕爷学编程】Arduino动手做(152)---BMI160 六轴陀螺仪模块2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 已知两点坐标及角度获取圆心
    方法一:`//////获取逆时针圆心坐标////////////////////////privatevoidCalcCenter(doublex1,doubley1,doublex2,doubley2,doubletheta,outdoublecx,outdoublecy){cx=0;cy=0;if(theta==0){thrownewArgumentException("thera......
  • 计算角度
    load('convex_subpixel_ptmean_03_SNR_30_sigma_1_Nb_2_Train')load('最终vca提取mat')duanyuan=[E_t,E_minus]wavelength=wavelength/1000;sum=0fori=1:4sum=sum+acos(dot(duanyuan(1:211,i),end_member(1:211,i))/(norm(duanyuan(1:211,i))*norm(end_m......
  • JavaCV实现旋转图像识别和旋转角度预测
    引言本文将介绍如何使用JavaCV库来实现图像识别和旋转角度预测,并结合直方图统计和dhash算法来比较图片的相似度。JavaCV是一个基于OpenCV的Java库,提供了丰富的图像处理和计算机视觉功能。环境搭建在开始之前,需要安装JavaCV库和相关依赖。可以通过Maven或手动下载jar包的方式进......
  • 分布式ID|从源码角度深度解析美团Leaf双Buffer优化方案
    分布式ID的使用场景基于MySql的初步方案第一次优化:Leaf-segment数据库方案第二次优化:Leaf-segment双buffer优化源码解析双buffer优化方案 背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产......