我试图弄清楚如何计算头部运动的倾斜角度,只是上下运动,而不是左右移动 . 我有一个可穿戴设备(我想移动设备的问题会是相同的),加上一个加速计传感器,它放在我的额头上 .
到目前为止,我认为最好将线性加速度保持在外,并且只需使用重力加速度即可 . 我正在阅读和阅读,试图更好地了解我究竟在寻找什么,但我的大脑不是数学材料 . 在站立静止的起始位置(静止位置),所有重力加速度都落在一个轴上,比方说X.当我开始用我的头开始运动时,例如向下移动我的头部(就像看着地面一样),加速重力不仅仅落入一个轴,而是两个轴(对于X和Z之间的实例,将共享) . 如果我是对的,这是正确的方法(是吗?)......
-
如何在不做疯狂数学的情况下计算出这个角度?
-
这个问题与计算加速度计的俯仰角完全相同?
-
我可以用于此原始数据还是需要校准数据?
为了说清楚,让我们想象我的设备轴放置在与该照片相同的位置,并且在起始位置,重力落入X轴(横向位置) .
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 .
SOLUTION
以防万一将来碰到类似的东西 . 主要问题是原始数据的范围 . 一旦我将其映射到[-1g,1g]范围并修复了一些关于它工作的坐标的东西 .
1 回答
只测量重力方向 . 我知道有两种方法
1.使用平滑(FIR)滤镜来过滤掉快速变化
例如记住最后N次测量
并输出他们的平均值
这是 easy 和 continuous 但 not precise
2.检查加速度矢量大小
其中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 - 前进,后退
不知道方向所以如果我以错误的方式击中它就会否定输出角度
绿色是引力
蓝色是测量值
红色是你的俯仰角(ang)