使用内置惯性测量单元(IMU)(也称为行人航位推算(PDR))的用户位置简单公式如下:
x= x(previous)+step length * sin(heading direction)
y= y(previous)+step length *cos(heading direction )
我们可以使用CMMotionManager
类的motionManager属性来访问加速度计,陀螺仪和磁力计的原始值。此外,我们可以获得attitudes
值作为滚动,俯仰和偏航。步长可以计算为加速度的双平方根。但是,我对标题方向感到困惑。一些已发表的文献使用磁力计和陀螺仪数据的组合来估计航向。我可以看到CLHeading
也提供了标题信息。有一些在线教程,特别是像this这样的Android平台来估计用户位置。但是,它没有给出任何适当的数学解释。
我已经关注了许多在线资源,例如this,this,this和this来制作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;
本地化结果仍未接近真实位置。我的方法是否正确?