Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测车内加速度(iPhone加速计)_Iphone_Objective C_Physics_Accelerometer - Fatal编程技术网

检测车内加速度(iPhone加速计)

检测车内加速度(iPhone加速计),iphone,objective-c,physics,accelerometer,Iphone,Objective C,Physics,Accelerometer,我正在开发一款iPhone应用程序,我们试图计算一辆行驶中汽车的加速度。类似的应用程序已经实现了这一点(dynolicous),但不同的是,该应用程序设计用于一般城市驾驶,而不是在拖带上 这让我们想到了Dynolicous幸运地避免了的一个大问题:山丘。是的,希尔 这有两个重要阶段:校准和实际驾驶 我们最初的运行很简单,并承受了后果。在校准阶段,我在手机上取平均力,在跑步过程中,我只是从当前力中减去平均力,得到这一帧的当前加速度。这方面的问题是,典型的汽车所受的力远不止前进力——从转向凹坑到其他

我正在开发一款iPhone应用程序,我们试图计算一辆行驶中汽车的加速度。类似的应用程序已经实现了这一点(dynolicous),但不同的是,该应用程序设计用于一般城市驾驶,而不是在拖带上

这让我们想到了Dynolicous幸运地避免了的一个大问题:山丘。是的,希尔

这有两个重要阶段:校准和实际驾驶

我们最初的运行很简单,并承受了后果。在校准阶段,我在手机上取平均力,在跑步过程中,我只是从当前力中减去平均力,得到这一帧的当前加速度。这方面的问题是,典型的汽车所受的力远不止前进力——从转向凹坑到其他一切都会导致数值与实际发生的情况不同步

下一步是增加一个条件,即iPhone的方向必须使屏幕朝向汽车后部。使用这种方法,我试图只跟随z轴上的力,但这显然会导致问题,除非iPhone由于重力直接垂直

后来我做了一些三角学,我成功地从方程式中计算出了重力,所以iPhone实际上可以非常非常好地读取汽车

直到我撞上斜坡。当汽车的角度改变时,我突然感觉到加速和减速都没有意义,我们又一次失去了同步

和一个比我聪明得多的人在数学上交谈,会引出一个解决方案,这个解决方案我一直在尝试实现,时间比我愿意承认的要长。其步骤如下:

1) 在校准过程中,将重力测量为矢量,而不是尺寸。存储该向量。 2) 当汽车最初向前移动时,取运动矢量并减去重力。以此作为前进的动力。(暂时忽略用户案例中的困难,让我们专注于数学:) 3) 从正向矢量和重力矢量,构造一个平面。 4) 每当收到力时,将其投射到所述平面上,以消除侧向力等。 5) 然后,使用该力、已知的重力大小和已知的向前运动方向来求解一个三角形,从而得到向前矢量

在这个新系统中造成最大困难的问题不是步骤5,我已经到了所有数字看起来都应该是的地步。困难的部分实际上是前向向量的检测。我选择了大小超过重力的向量,然后从中取平均值,减去重力。(我正在做一些错误检查,以确保我没有仅仅因为iPhone加速计关了一点而使用力,这比我希望的更频繁)。但是如果我画出我正在使用的这些向量,它们实际上会以大约20-30度的角度变化,这会导致一些严重的误差。最终的结果是,该应用程序现在比以前更加不准确

所以基本上-所有你的数学和iPhone大脑都在那里-有任何明显的错误吗?有可能更好的解决方案吗?有什么有用的经验吗


奖励:对第一个给出解决方案的答案给予250美元的奖励。

你需要一个陀螺仪。否则,在坡道上加速的汽车有多种配置,可以在加速计上产生完全相同的读数。它们将完全无法区分。这就是为什么惯性导航系统结合了陀螺仪和加速计

你不能这么做的原因是爱因斯坦说的!使用局部测量,无法区分重力和加速度。你确实有一些有用的非局部信息——假设这里的重力和那边几码的重力具有相同的值。但如果没有一种方法来进行所谓的“平行运输”,就无法比较两个不同位置的重力。这就是陀螺的作用

忘了250美元吧,但我想你应该给我一杯啤酒,以换取我为你节省的研发时间。:-)

一些想法:

  • 重力是一个矢量,而不是一个量级
  • 重力引起的加速度和其他力引起的加速度是无法区分的(你也无法区分转弯和翻车之间的区别)
  • 如果你有两个加速计,你的运气可能会更好,但是你需要两部手机
如果是我,我会写一份免责声明,说“这在山上不起作用,使用笔直、水平的道路进行测试。”


注:我喜欢回答的现金奖励,我一定会将其作为建议发布在meta.stackoverflow.com上:p

要解决这个问题,如果可能的话,你需要参考汽车外部的东西。可能使用GPS测量高程增益是最直接的方法。也就是说,使用测量的高程增益计算山丘的坡度,并使用此值补偿加速度测量

正如其他人所提到的,在非常深的层次上,没有办法区分重力和加速度;这被称为“宇宙观”(也是爱因斯坦最重要的见解之一)。因此,要解决这个问题,需要知道的不仅仅是加速度计的输出,这使得问题变得困难。有关解决此问题的各种方法,请参阅

你最好的希望是参考车外的东西,比如GPS信号,或者图片来测量车外东西位置的变化,或者地球磁场等。因为这将发生在很多金属(汽车)附近,地球磁场可能很难测量,一些参考物体(如太阳)的连续照片是ob