使用加速度计的头部跟踪角度

时间:2014-05-17 16:06:56

标签: android math geometry accelerometer physics

我试图弄清楚如何计算头部运动的倾斜角度,只是上下运动,而不是左右移动。我有一个可穿戴设备(我想移动设备的问题会是相同的),加上一个加速计传感器,它放在我的额头上。

到目前为止,我认为最好不要使用线性加速度,而只是使用重力加速度。我正在阅读和阅读,试图更好地了解我究竟在寻找什么,但我的大脑不是数学材料。在站立静止的起始位置(静止位置),所有重力加速度都落在一个轴上,比方说X.当我开始用我的头开始运动时,例如向下移动我的头部(就像看着地面一样),加速重力不仅仅落入一个轴,而是两个轴(对于X和Z之间的实例,将共享)。如果我是对的,这是正确的方法(是吗?)......

  1. 如何在不做疯狂数学的情况下计算出这个角度?
  2. 这个问题与计算加速度计的俯仰角完全相同?
  3. 我可以使用此原始数据还是需要校准数据?
  4. 为了说清楚,让我们想象一下我的设备轴放在与这张照片相同的位置,并且在起始位置,重力落入X轴(横向位置)。

    enter image description here

    修改

    使用以下公式进行俯仰和滚动(感谢@Nuclearman链接)

    Roll = atan2(Y, Z) * 180/M_PI; 
    Pitch = atan2(X, sqrt(Y*Y + Z*Z)) * 180/M_PI
    

    我写的这段代码:

    /**
    * Function to calculate the inclination angle or pitch of the head movement
    */
    float calcInclinationAngle(int iDataPos){
    
      float xVal = fAccel[0][iDataPos];
      float yVal = fAccel[1][iDataPos];
      float zVal = fAccel[2][iDataPos];
      float pitch = 0;
      //Pitch in rad format
      pitch = atan2(xVal, sqrt(pow(yVal,2)+pow(zVal,2)));
      //Pitch in degrees
      pitch = pitch * 180/PI;
      return pitch;
    

    我总是弄错了角度。当重力完全在X轴上时,我得到大约45度(而不是0度),如果我将设备移动180度(只是改变重力信号),我会得到大约17-18度。我一直在玩atan2参数,但角度范围总是相同的(25-35度)。只是提出一个问题......我应该使用校准数据而不是原始数据吗?

    修改2

    由于我完全陷入困境,我做了一些“作弊”的进展。现在我将数据标准化,而不是使用atan,我做pitch = 1 / sin(xVal),这实际上给了我90度的范围,这似乎适合我的设备旋转(尽管例如它给了我135度而不是... 45,但我“修复”所有角度减去90度)。无论如何,我需要一个180度的范围,因为此刻向后或向前移动并不会对获得的角度产生影响。

    修改添加一些图片和信息

    将音高计算为音高= atan2(xVal,sqrt(pow(yVal,2)+ pow(zVal,2)))*(180 / PI),我得到以下角度。如果有用,位置1的加速度计值(原始数据)为:ACCX 2936 ACCY 2152 ACCZ 1883

    位置1(重力落入X轴):45-46度

    位置2(从起点旋转aprox 45):38

    位置3(从起点旋转aprox 90):28

    位置4(从起点旋转aprox 180):18-19

    位置5(> 180 <360):18-46。

    enter image description here enter image description here height enter image description here enter image description here

    以防将来有人碰到类似的事情。主要问题是原始数据的范围。一旦我将其映射到[-1g,1g]范围并修复了一些关于它工作的坐标的东西。

1 个答案:

答案 0 :(得分:1)

仅测量重力方向。我知道有两种方法

1.使用平滑(FIR)滤镜来过滤掉快速更改

  • 例如记住最后N次测量
  • 并输出他们的平均值
  • 轻松连续不准确

2.检查加速度矢量大小

  • 并忽略与重力不匹配的所有测量值

    a=sqrt( ax^2 + ay^2 + az^2 )
    if (fabs(a*scale-9.81)>0.1) ignore...
    
  • 其中a是加速度矢量的大小

  • (ax,ay,az)是测量的加速度矢量(设备的本地)
  • 比例是加速度计的比例,用于将值转换为实际单位,如[m / s ^ 2]或[N / kg]
  • 设备加速度计通常已经在[g]中,因此比例为9.81
  • 9.81是测量区域的重力
  • 0.1是加速度大小检查的准确性(根据您的需要改变)
  • 这种方法有点慢
  • 不连续因为在加速期间不会测量输出(可以使用上一个有效输出)
  • 更精确

现在公式应该可行,从我读到的轴是

  • x - up,down
  • y - 左,右
  • z - 前进,后退
  • 不知道方向,所以如果我用错误的方式点击输出角度

axises

  • 绿色是引力
  • 蓝色是测量值
  • 红色是你的俯仰角(ang)

    ang=asin(az*scale/9.81)
    
  • 不要忘记避免在参数超出范围时使用asin&lt; -1.0,+ 1.0&gt; !!!