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

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

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

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

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

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

  • 使用单轴数据计算倾角

  如下图所示,假设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

关于平方根倒数速算法

posted @ 2016-11-18 13:41  XXX已失联  阅读(11903)  评论(1编辑  收藏  举报