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

san*_*edi 6 objective-c accelerometer magnetometer gyroscope indoor-positioning-system

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

x= x(previous)+step length * sin(heading direction)
y= y(previous)+step length *cos(heading direction )
Run Code Online (Sandbox Code Playgroud)

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

我跟着像许多在线资源这个,这个,这个这个做一个PDR应用.我的应用程序可以检测步骤并正确地给出步长,但其输出充满错误.我认为错误是由于缺乏合适的航向.我使用以下关系从磁力计获得前进方向.

magnetometerHeading = atan2(-self.motionManager.magnetometerData.magneticField.y, self.motionManager.magnetometerData.magneticField.x);
Run Code Online (Sandbox Code Playgroud)

同样,来自陀螺仪:

grysocopeHeading +=-self.motionManager.gyroData.rotationRate.z*180/M_PI;
Run Code Online (Sandbox Code Playgroud)

最后,我给前一个标题干涉,gryoscopeheading和磁力计的比例权重如下:

headingDriection = (2*headingDirection/5)+(magnetometerHeading/5)+(2*gryospoceHeading/5);
Run Code Online (Sandbox Code Playgroud)

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

任何帮助,将不胜感激.

谢谢.

编辑

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

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;

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