android 计算像素距离,android – 如何根据手机加速度计算距离

基础很简单在模拟世界中,你使用连续的数学,它是:

velocity = integrate(acceleration)

distance = integrate(velocity)

在数字世界中更容易,您使用离散数学,其中集成成为总和:

velocity = sum(acceleration)

distance = sum(velocity)

只要继续加上你读取的所有加速度值,你最终会得到距离.

这个最大的问题是,地球上的地球有一个恒定的加速度,由于重力而下降约10m / s / s.弄清楚你的矢量哪一部分是重力是困难的部分.

BTW,重力是加速度计可以如何检测倾斜.不过,您可以这样做,除非您可以独立于加速度计计算倾斜度(例如借助陀螺仪),您的代码将主要是测量倾斜而不是距离.

哈!我刚才从最后一个声明中意识到,很多iPhone应用程序都不会在空间上工作:-P

附加答案:

基于OP发布的“评论”(作为答案低于或高于此答案),看起来我需要提供进一步的解释.实际上真的很简单,不熟悉数学的人会认为这一点比这更复杂.伪代码如下:

// Set distance to zero at start-up:

var distance_X = 0

var velocity_X = 0

function update_acceleration_X (acceleration_X) {

velocity_X = velocity_X + acceleration_X

distance_X = distance_X + velocity_X

}

// To use the distance value just read the distance_X variable:

function get_distance_X_and_reset () {

x = distance_X

distance_X = 0

return x

}

距离始终从软件首次启动的位置测量,除非将距离变量重置为零.必须不断地读取加速度计(优选地以加速度计本身测量力的速率),并相应地更新速度和距离的值.当你想知道从起点的距离只是读取距离变量.

几件事:任意数量的倾斜,无论多么微小,都会增加漂移.意味着除非倾斜本身的角度不断被跟踪,否则在一个方向上将总是存在少量恒定的加速度.即使是核潜艇,配备高精度加速度计和陀螺仪,因为GPS不能在水下工作,需要定期地与GPS同步,以纠正这种漂移.

二,加速度计测力,不动.测量任何一种力.我提到重力,但它也可以测量与桌子的摩擦引起的颠簸,你的脉搏作为你的心跳和呼吸导致你的手轻轻晃动,任何东西.好消息是,从长远来看,所有这些力量都会平均出来,公式仍然是正确的.但在短期内,这意味着你的阅读会变得嘈杂.人们已经提出了很多技巧,以使用诸如Weiner和Kalman滤波器之类的东西来最小化这种噪声.

第三,您可能已经注意到,加速度计读数不是恒定的.我不是只是意味着每次阅读它们的价值观都是不同的,这是很明显的,但它也会改变读数之间的价值.我们想念的每个价值都会影响我们的准确性,所以重要的是尽可能多地读取这些值.现在的好消息是,从长远来看,所有这些由缺失值引起的错误都应该平息,因为它们主要是由于动作或振动的原因造成的,我们的公式仍然是正确的.但这又意味着在短期内这会给我们的系统带来噪音.如果您使用像卡尔曼滤波器这样好的折衷滤波器,那么它应该能够解释这一点,但较弱的滤波器可能需要一些帮助.这样做的一个方法是用先前的读数来平均每个加速度读数.请注意,它必须是以前的“真实”读数,而不是以前的平均读数.

比惯性测量单位(IMU)和惯性指导以及许多相当毛重的向量和矩阵数学的准确度更高.有开源项目这样做(不到10年前,这个东西是严格的军事,因为你知道,潜艇和巡航导弹使用它们).

这些Sparkfun文章在底部有一些很好的链接和一些参考代码:

希望这一切有所帮助.如果有任何人链接到任何可能有帮助的文章,请评论.

当然,如果你想要真实的单位,你需要缩放样品率.例如以9m / s / s加速80ms意味着你的速度是(9m / s / s * 0.08s)= 0.72m / s.假设你不在乎单位,上面的伪代码是简化的.最终的值仍然代表距离作为一个数字,只是数字与任何现实世界的测量单位几乎没有关系.您可以简单地应用一个缩放函数,校准到您的像素值.无论如何,这里有一个真实世界单位的例子来澄清发生了什么:

given the following acceleration readings:

9m/s/s

3m/s/s

0m/s/s

0m/s/s

0m/s/s

-5m/s/s

-7m/s/s

assuming an 80ms sample rate

we can derive the following velocities:

0.72m/s (what you get from accelerating 9m/s for 80ms)

0.96m/s

0.96m/s

0.96m/s

0.96m/s

0.56m/s

0m/s

from that we can derive the following distances:

57.6mm (what you get from moving at 0.72m/s for 80ms)

134.4mm

211.2mm

288mm

364.8mm

409.6mm

现在,如果您采取衍生距离,并按照惯例进行反向计算(v =(s2-s1)/ t和a =(v2-v1)/ t),则应该得到加速读数.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值