当前位置: 首页 > news >正文

加速度传感器检测物体倾角的原理

  检物体倾角的一种常用方法是对陀螺仪输出的角速度进行积分。虽然这种方法直截了当,但误差会随着积分时间的增加而快速累积。在某些应用中,若整个时间范围内物体运动缓慢(忽略惯性力等因素的影响,物体只受重力作用),那么可以使用加速度计来测量物体的倾斜角度。该方法利用重力矢量及其在加速度计轴上的投影来确定倾斜角度。

  以两轮平衡小车(倒立摆模型)为例,当检测到倾角存在时要控制小车以一定的加速度运动,才能维持平衡而不至于倒下。因此倾角的测量成为控制小车直立的关键。而在实际小车运动过程中,由于小车本身的运动所产生的加速度会产生很大的干扰信号叠加在上述测量信号上,使得输出信号无法准确反映车模的倾角(加速度计输出值除了重力加速度的部分也可能会将小车前进的加速度也包含在内,导致难以区分哪一部分是重力加速度)。

  小车运动产生的加速度使得输出电压在实际倾角电压附近波动,虽然可以通过数据平滑滤波将其滤除。但是平滑滤波也会使得信号无法实时反映小车倾角的变化,从而减慢对于车轮的控制,使得小车无法保持平衡,这种情况就需要结合使用陀螺仪来测量。而在其他要求不高的情况下则可以对原始加速度信号进行处理,移除信号中的高频成分,因此一定程度的交流分量也是可以接受的。

  在使用惯性传感器检测物体运动姿态时,最直观的想法是通过加速度传感器直接测量角度,通过陀螺仪测量角速度,但实际使用中由于传感器本身的特性会存在很多干扰。

  常用的解决方法是结合加速度计和陀螺仪各自的优势进行互补滤波(陀螺仪:动态特性好,积分计算姿态有累积误差;加速度计:动态响应差,但没有累积误差)。它们在频域上特性互补,可以采用互补滤波提高测量精度和系统的动态性能。另一种常见的方法是采用卡尔曼滤波。

  • 使用单轴数据计算倾角

  如下图所示,假设X轴上测到的加速度值为ax,则倾角α的值为:α = arcsin(ax/g).  如果倾角只在很小的范围内变化,则可以使用近似公式sinα≈α,于是α ≈ k·(ax/g),比例系数k用于倾角的线性近似计算。

  X轴指向旋转360°,ax读数将在-1g~1g变化。从曲线可以看出,在接近±90°的位置处,输出值灵敏度很低(同样角度变化引起的读数改变较小),而在0°附近灵敏度最高。另外也可以看出正弦曲线在[0° 45°], [135° 225°]和[315° 360°] 的线性度较好。

   使用单轴数据测量倾角除了灵敏度问题外,另一个限制是仅使用单轴数据无法进行360°的测量。因为在倾角N°时加速度计的读数与倾角180°−N°时的加速度读数相同。

  • 使用双轴数据计算倾角

  如下图所示,加速度传感器在X-Y平面内旋转,由于X轴与Y轴正交,X轴检测到重力加速度的正弦分量,Y轴检测到重力加速度的余弦分量。旋转时随着一条轴的灵敏度下降,另一条轴的灵敏度将会上升。

  这时倾角可以通过计算X轴和Y轴比值的反正切来得到:

  如果操作数ax/ay为正值,反正切函数会返回第一象限中的值;如果操作数为负值,则反正切函数会返回第四象限中的值(标准反正切函数atan的值域是-90°~90°,也就是它只处理第一、四象限)。而通过使用C语言标准库中的另一个反正切函数atan2(a, ay),可以计算出原点至点(ax,ay)的方位角,可以理解为复数ax+ayi的辐角,取值范围为(-180°,180°]。因此,增加一个轴的好处之一是,能够区分各个象限并在整个360°范围内测量倾角。

  使用双轴数据计算倾角的另一个优势是:与单轴解决方案不同,增加一个轴后,即使第三个轴上存在倾斜,也可以测出精确值。通过下图来进行说明:如果XY平面不是严格的平行于重力方向,而存在一个较小的偏差角β(β角无法准确测出),此时第三根轴即Z轴将承受一部分重力的分力。如果只是用单轴数据来测量,则根据公式有α = arcsin(ax/(g·cosβ)),β较小时cosβ接近1。由此看出,只是用单轴数据会造成一定的误差。如果运用X和Y轴的数据,通过反正切来求α,则可以消除偏差角β的影响。

  • 使用3轴数据计算倾角

  假设传感器的X轴与水平面xy之间的夹角为α(称为俯仰角,pitch),Y轴与水平面间的夹角为β(称为滚转角,roll),Z轴与重力方向夹角为γ。

  重力加速度在XYZ三个轴上的投影即为三个轴传感器的读数,因此可计算出:

  根据三个轴加速度的矢量和等于重力加速度,即:

  可以推导出计算三个角度的另一种表达式:

  由于采用反正切函数和加速度之比,因此具有双轴示例中提及的优势。

  •  平方根倒数速算法
float InvSqrt(float x)
{
    float xhalf = 0.5f*x;
    int i = *(int*)&x;        // get bits for floating VALUE
    i = 0x5f375a86- (i>>1); // gives initial guess y0
    x = *(float*)&i;         // convert bits BACK to float
    x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
    return x;
} 

 

 

参考:

使用加速度计进行倾斜检测

使用双轴加速度计进行倾斜测量

利用加速度传感器测量物体的倾斜角度

互补滤波器-集成加速度计和陀螺测量平衡的解决办法

atan2 - Wikipedia

Fast inverse square root

关于平方根倒数速算法

转载于:https://www.cnblogs.com/21207-iHome/p/6059260.html

相关文章:

  • codeforces 734E(DFS,树的直径(最长路))
  • php-fpm服务启动脚本
  • html关于图片和链接的笔记
  • jQuery 语法
  • 【FFMPEG】FFMPEG介绍
  • [原创软件]Maya语言切换工具
  • 【GoLang】GoLang 错误处理 -- 异常处理思路示例
  • Tower 实战一:MavLink的连接与通信
  • hive 数据清理--数据去重
  • rails生成器生成自定义controller模板
  • 关于适配器中设置显示与隐藏的问题
  • 递归的例子
  • 各种居中对齐
  • 面向对象 封装 、继承
  • [学习笔记]背包问题(一)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • classpath对获取配置文件的影响
  • CSS相对定位
  • ES学习笔记(12)--Symbol
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • October CMS - 快速入门 9 Images And Galleries
  • 今年的LC3大会没了?
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 悄悄地说一个bug
  • 日剧·日综资源集合(建议收藏)
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何选择开源的机器学习框架?
  • 使用权重正则化较少模型过拟合
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​低代码平台的核心价值与优势
  • ​虚拟化系列介绍(十)
  • # Apache SeaTunnel 究竟是什么?
  • ###项目技术发展史
  • #include到底该写在哪
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #Z0458. 树的中心2
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • #预处理和函数的对比以及条件编译
  • (bean配置类的注解开发)学习Spring的第十三天
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (二)学习JVM —— 垃圾回收机制
  • (十一)手动添加用户和文件的特殊权限
  • (一)VirtualBox安装增强功能
  • (转)IOS中获取各种文件的目录路径的方法
  • .NET 5种线程安全集合
  • .Net 垃圾回收机制原理(二)
  • .net开发引用程序集提示没有强名称的解决办法
  • 。Net下Windows服务程序开发疑惑
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [AIGC] Spring Interceptor 拦截器详解
  • [Android]Tool-Systrace