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

概述        

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

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

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

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

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

 

1、使用单轴数据计算倾角

如下图所示,假设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°时的加速度读数相同。

2、使用双轴数据计算倾角

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

  

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

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

 

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

 

3、使用3轴数据计算倾角

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

 

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

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

 

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

 

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

4、 平方根倒数速算法

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;
}

参考文章:https://www.cnblogs.com/21207-iHome/articles/6059260.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于加速度计的倾角检测算法是一种用于检测物体相对于地球重力方向的倾斜角度算法。这种算法通常使用三轴加速度计来测量物体在三个不同方向上的加速度值,并通过这些值来计算出物体倾角。 在C语言中实现这种算法,我们可以按照以下步骤进行: 1. 首先,我们需要初始化加速度计的参数,例如设置采样率和测量范围。 2. 然后,我们使用C语言的函数来读取加速度计的原始数据。这些数据通常以三个方向的三个值形式提供。 3. 接下来,我们需要对原始数据进行预处理,例如校准和滤波处理。这些预处理可以保证测量结果的准确性。 4. 然后,我们根据测量范围和采样率来计算单位重力加速度的数值。 5. 接着,我们可以使用计算出的单位重力加速度和原始数据来计算物体在三个方向上的加速度值。 6. 最后,我们可以利用这些加速度值来计算物体相对于地球重力方向的倾角。常见的倾角计算方法包括三角函数法、卡尔曼滤波法等。 需要注意的是,在实现这个算法时,我们应考虑到加速度计的非线性误差和噪声,以及实时性要求等因素。因此,我们可能需要进行数据处理和滤波,以优化倾角的估计精度。 总之,基于加速度计的倾角检测算法是一种用于测量物体倾角算法,通过C语言程序,我们可以读取加速度计的原始数据,进行数据处理和滤波,计算出物体相对于地球重力方向的倾角

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值