如何在iPhone中使用加速度计,gryoscope和磁力计获取用户位置?

时间:2017-10-06 08:56:10

标签: objective-c accelerometer gyroscope indoor-positioning-system magnetometer

使用内置惯性测量单元(IMU)(也称为行人航位推算(PDR))的用户位置简单公式如下:

x= x(previous)+step length * sin(heading direction)
y= y(previous)+step length *cos(heading direction )

我们可以使用CMMotionManager类的motionManager属性来访问加速度计,陀螺仪和磁力计的原始值。此外,我们可以获得attitudes值作为滚动,俯仰和偏航。步长可以计算为加速度的双平方根。但是,我对标题方向感到困惑。一些已发表的文献使用磁力计和陀螺仪数据的组合来估计航向。我可以看到CLHeading也提供了标题信息。有一些在线教程,特别是像this这样的Android平台来估计用户位置。但是,它没有给出任何适当的数学解释。

我已经关注了许多在线资源,例如thisthisthisthis来制作PDR应用。我的应用程序可以检测步骤并正确地给出步长,但其输出充满错误。我认为错误是由于缺乏合适的航向。我已经使用以下关系从磁力计获得航向。

magnetometerHeading = atan2(-self.motionManager.magnetometerData.magneticField.y, self.motionManager.magnetometerData.magneticField.x);

同样,来自陀螺仪:

grysocopeHeading +=-self.motionManager.gyroData.rotationRate.z*180/M_PI;

最后,我对前一个标题的干燥,gryoscopeheading和磁力计的比例给出了如下比例:

headingDriection = (2*headingDirection/5)+(magnetometerHeading/5)+(2*gryospoceHeading/5);

我从已发表的期刊论文中采用了这种方法。但是,我的工作中出现了很多错误。我的方法有误吗?我究竟应该做些什么来获得正确的航向方向,以使定位估计误差最小?

任何帮助将不胜感激。

谢谢。

修改

我注意到在使用陀螺仪数据计算航向时,我没有将旋转速率(以弧度/秒为单位)与增量时间相乘。为此,我添加了以下代码:

CMDeviceMotion *motion = self.motionManager.deviceMotion; [_motionManager startDeviceMotionUpdates]; if(!previousTime) previousTime = motion.timestamp; double deltaTime = motion.timestamp - previousTime; previousTime = motion.timestamp;

然后我更新了陀螺仪标题:

gyroscopeHeading+= -self.motionManager.gryoData.rotationRate.z*deltaTime*180/M_PI;

本地化结果仍未接近真实位置。我的方法是否正确?

0 个答案:

没有答案