基于磁力计和陀螺仪的北向计算
Posted
技术标签:
【中文标题】基于磁力计和陀螺仪的北向计算【英文标题】:North calculation based on magnetometer and gyroscope 【发布时间】:2012-03-04 19:49:36 【问题描述】:我需要计算“朝向”(不管它是基于真北还是磁北)。正如在 ios 设备上看到的那样,CLLocationManager
返回的CLHeading
对象通过相应的属性为我们提供了真航向和磁航向。此外,我们可以很容易地看到,这些值与设备的顶部(设备坐标系的正 Y 轴)有关,这对我的目的不利。
我真正需要的是计算与设备屏幕(Z轴)相关的朝向,因为我不需要指南针,而是AG应用程序之王。问题是当您将设备旋转到横向时,您会从面向方向获得向左或向右的航向值,这就是我最终需要的。 据我所知,我可以获得磁力计“原始”数据(以微特斯拉为单位,每个设备轴的值从 128 到 -128)以及陀螺仪“原始”数据(有三种类型:欧拉天使,旋转矩阵或四元数)。我需要知道,我需要应用哪些计算来获得“面向”方向而不是“航向”。
【问题讨论】:
【参考方案1】:我不久前就成功了,因为我没有看到任何答案,所以我决定将我的解决方案放在这里,以供那些将搜索相同问题的答案的人...
_motionManager = [[CMMotionManager alloc]init];
if (_motionManager.gyroAvailable)
_motionManager.deviceMotionUpdateInterval = 1.0/20.0;
[_motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler:^(CMDeviceMotion *motion, NSError *error)
CMAcceleration gravity = motion.gravity;
CGPoint tiltVector = CGPointMake(-gravity.x, -gravity.y);
_tiltAngle = [self angleYAxisToVector:tiltVector];
CLLocationDirection heaqding = [[SVSession sharedSession] heading].trueHeading;
double newHeading = fmod(heaqding + _tiltAngle, 360.0);
self.azimuth = degreesToRadian(newHeading);
[self updateLocations]; //this function updates my ui for the new heading
];
else
NSLog(@"No gyroscope on device.");
[_motionManager release],_motionManager = nil;
这里有一些额外的 sn-ps 可能有助于理解这个例子:
-(double)angleYAxisToVector:(CGPoint)vector
double dX = vector.x;
double dY = vector.y;
if(dY == 0)
if(dX > 0)
return 0.0;
else
if(dX < 0)
return 180.0;
else
return -1;
double beta = radiansToDegrees(atan(dX/dY));
double angle;
if(dX > 0)
if (dY < 0)
angle = 180 + beta;
else
angle = beta;
else
if (dY < 0)
angle = 180 + beta;
else
angle = 360 + beta;
// NSLog(@"angle = %f, normalized = %f",beta,angle);
return angle;
#define degreesToRadian(x) (M_PI * (x) / 180.0)
#define radiansToDegrees(x) ((x) * 180.0 / M_PI)
#define degreesToRadians(x) degreesToRadian(x)
#define radiansToDegree(x) radiansToDegrees(x)
编码愉快...
【讨论】:
哦...你不会找到它。这是我的一些课。我曾经把最后一个标题存储在那里。 这非常有用。对于那些发现这一点的人,可能不是 100% 清楚这段代码会做什么,但如果你想找出设备面对的方式,不管是横向还是纵向,这都能做到。以上是关于基于磁力计和陀螺仪的北向计算的主要内容,如果未能解决你的问题,请参考以下文章