如何在安卓智能手机上使用加速度传感器来计算位移距离?

4

我有一部安卓智能手机,其中包含加速度传感器、指南针传感器和陀螺仪传感器。

我想使用这些传感器计算位移距离。

我已经尝试了基本方法,即:

最终速度 = 初始速度 + (加速度 × 时间)
距离 = 时间 × 速度

但是我无法得到正确的位移距离。每次尝试相同的位移距离时,我都会得到不同的结果。


2
几乎不可能使用手机传感器进行位移计算。这里有一个相关的问题:https://dev59.com/QWsz5IYBdhLWcg3wiYY0 - JiTHiN
还有其他特定的传感器可用于计算距离吗?@rIHaN JiTHiN - vishnu vigneshwar
你尝试过使用“计步器API”吗?它并不完全是位移测量,但可以检查一下是否有用。 - JiTHiN
我已经尝试了步数计数API用于行人,但现在我正在尝试将其应用于我的遥控轮式汽车,对此我不知道该怎么做。@rIHaN JiTHiN - vishnu vigneshwar
手机连接到车上了吗? - JiTHiN
是的,智能手机将附在汽车仪表板上。 - vishnu vigneshwar
2个回答

5
您可能正在寻找的方程式是:

您可能正在寻找的方程式是:

Velocity = (Gravity*Acceleration)/(2*PI*freq)

这个方程的正确单位使用(公制)应该是:

Gravity = mm/s squared = 9806.65
Acceleration = average acceleration over 1 second
Frequency = Hz (of the acceleration waveform over 1 second)

例如,如果您从加速度计的所有三个轴收集数据,则需要执行以下操作以获取3D空间中的加速度波形(以原始值表示):
inputArray[i] = sqrt(X*X + Y*Y + Z*Z);

当数据被收集后,仅使用波形中将要收集的样本数量(如果值之间有1ms延迟,则仅使用1000个值)。

将这些值相加并除以样本数,即可得到平均值(如果加速度计数据有负值,则可能需要将所有值变为正数),您可以在查找平均值之前使用此算法来完成此操作。

for(i = 0; i < 1000; i++){
    if(inputArray[i] < 0){
        inputArray[i] = inputArray[i] - (inputArray[i]*2);
    }
}

一旦您获得了加速度的平均输出,您需要执行上述方程式。

static double PI = 3.1415926535897932384626433832795;
static double gravity = 9806.65;

double Accel2mms(double accel, double freq){
    double result = 0;
    result = (gravity*accel)/(2*PI*freq);
    return result;
}

一个示例是,在秋千上平均加速度为3 g,持续1秒钟:

注意:此计算基于正弦波形,因此频率代表的是加速器的物理运动而非采样率的频率。

Accel2mms(3, 1);

每秒3个1秒内的振荡,频率为1(一个方向上的一次摆动)= 4682.330468毫米/秒或4.7米。

希望这是你想要的内容。

请注意,此计算基于正弦波形,但正在适应根据单个运动(频率1)进行计算,因此可能不太准确。但理论上应该有效。


如果频率为0.5,该方法仍然返回mm/s吗? - Ajay
我正在尝试进行更多的计算,即使这样会降低精度。 - Ajay
1
正如帖子中所说,这个计算的结果在理论上是正确的,但频率为1时,输入数据的准确性必须精确才能得到准确的结果。这个方程最初用于分析加速度计的波形,因此将0.5作为输入的频率会产生无用的结果,因为加速度的周期不能减半,因为在那段时间或距离内经历的总加速度可能不是线性的。 - Sam
太棒了,谢谢!但频率是否等于运动所需的时间? - Ajay
1
不,完全不行。对于您的使用,您可以从方程式中完全省略freq变量,并拥有一个简单的转换函数来处理任何一次加速度实例。 - Sam

0
如@rIHaNJiTHiN在评论中提到的,没有可靠的方法从二阶和三阶传感器(测量位移导数如速度和加速度的传感器)获取位移信息。
GPS是唯一可以测量绝对位移的方法,但其精度和准确性在短距离和短时间内并不高(在某些信号不好的地方尤其如此)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接