我试图弄清楚如何计算头部运动的倾斜角度,只是上下运动,而不是左右移动。我有一个可穿戴设备(我想移动设备的问题会是相同的),加上一个加速计传感器,它放在我的额头上。
到目前为止,我认为最好不要使用线性加速度,而只是使用重力加速度。我正在阅读和阅读,试图更好地了解我究竟在寻找什么,但我的大脑不是数学材料。在站立静止的起始位置(静止位置),所有重力加速度都落在一个轴上,比方说X.当我开始用我的头开始运动时,例如向下移动我的头部(就像看着地面一样),加速重力不仅仅落入一个轴,而是两个轴(对于X和Z之间的实例,将共享)。如果我是对的,这是正确的方法(是吗?)......
为了说清楚,让我们想象一下我的设备轴放在与这张照片相同的位置,并且在起始位置,重力落入X轴(横向位置)。
修改
使用以下公式进行俯仰和滚动(感谢@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。
解
以防将来有人碰到类似的事情。主要问题是原始数据的范围。一旦我将其映射到[-1g,1g]范围并修复了一些关于它工作的坐标的东西。
答案 0 :(得分:1)
仅测量重力方向。我知道有两种方法
1.使用平滑(FIR)滤镜来过滤掉快速更改
2.检查加速度矢量大小
并忽略与重力不匹配的所有测量值
a=sqrt( ax^2 + ay^2 + az^2 )
if (fabs(a*scale-9.81)>0.1) ignore...
其中a是加速度矢量的大小
现在公式应该可行,从我读到的轴是
红色是你的俯仰角(ang)
ang=asin(az*scale/9.81)
不要忘记避免在参数超出范围时使用asin&lt; -1.0,+ 1.0&gt; !!! 强>