首页 文章

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

提问于
浏览
0

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

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

  • 如何在不做疯狂数学的情况下计算出这个角度?

  • 这个问题与计算加速度计的俯仰角完全相同?

  • 我可以用于此原始数据还是需要校准数据?

为了说清楚,让我们想象我的设备轴放置在与该照片相同的位置,并且在起始位置,重力落入X轴(横向位置) .

enter image description here

EDIT

使用以下公式进行俯仰和滚动(感谢@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度) . 只是提出一个问题......我应该使用校准数据而不是原始数据吗?

Edit 2

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

Edit adding some pictures and information

将节距计算为pitch = atan2(xVal,sqrt(pow(yVal,2)pow(zVal,2)))*(180 / PI),我获得以下角度 . 以防万一有用,位置1的加速度计值(原始数据)为:ACCX 2936 ACCY 2152 ACCZ 1883

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

位置2(从起点旋转约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

SOLUTION

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

1 回答

  • 1

    只测量重力方向 . 我知道有两种方法

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

    • 例如记住最后N次测量

    • 并输出他们的平均值

    • 这是 easycontinuousnot precise

    2.检查加速度矢量大小

    • 并忽略与重力不匹配的所有测量值
    a=sqrt( ax^2 + ay^2 + az^2 )
    if (fabs(a*scale-9.81)>0.1) ignore...
    
    • 其中a是加速度矢量的大小

    • (ax,ay,az)是测量的加速度矢量(设备的本地)

    • scale是加速度计的比例,用于将值转换为实际单位,如[m / s ^ 2]或[N / kg]

    • 设备加速度计通常已经在[g]中,因此比例为9.81

    • 9.81是测量区域的重力

    • 0.1是加速度大小检查的准确性(根据您的需要改变)

    • 这种方法有点慢

    • not continuous 因为在加速期间不会测量输出(可以使用上一个有效输出)

    • 但它是 much more precise

    现在公式应该起作用,从我读到你的轴

    • x - 向上,向下

    • y - 左,右

    • z - 前进,后退

    • 不知道方向所以如果我以错误的方式击中它就会否定输出角度

    axises

    • 绿色是引力

    • 蓝色是测量值

    • 红色是你的俯仰角(ang)

    ang=asin(az*scale/9.81)
    
    • do not forget to avoid using asin with parameter out of range < -1.0 , +1.0 > !!!

相关问题