菜鸟教程小白 发表于 2022-12-12 19:21:06

ios - 基于磁力计和陀螺仪的北向计算


                                            <p><p>我需要计算“朝向”(不管它是基于真北还是磁北)。正如在 iOS 设备上看到的那样,<code>CLLocationManager</code> 返回的 <code>CLHeading</code> 对象通过相应的属性为我们提供了真航向和磁航向。此外,我们可以很容易地看到,这些值与设备的顶部(设备坐标系的正 Y 轴)有关,这对我的目的不利。</p>
<p>我真正需要的是计算与设备屏幕(Z轴)相关的朝向,因为我不需要指南针,而是AG应用程序之王。问题是当您将设备旋转到横向时,您会从面向方向获得向左或向右的航向值,这就是我最终需要的。
据我所知,我可以获得磁力计“原始”数据(以微特斯拉单位提供,每个设备轴的值从 128 到 -128)以及陀螺仪“原始”数据(有三种类型:欧拉天使,旋转矩阵或四元数)。我需要知道,我需要应用哪些计算来获得“面向”方向而不是“航向”。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我已经做了一段时间了,因为我没有看到任何答案,所以我决定将我的解决方案放在这里,以供那些将搜索相同问题的答案的人...</p>

<pre><code>_motionManager = [init];

    if (_motionManager.gyroAvailable) {
      _motionManager.deviceMotionUpdateInterval = 1.0/20.0;
      
                                          withHandler:^(CMDeviceMotion *motion, NSError *error)
         {
             CMAcceleration gravity = motion.gravity;
             CGPoint tiltVector = CGPointMake(-gravity.x, -gravity.y);
             _tiltAngle = ;

             CLLocationDirection heaqding = [ heading].trueHeading;
             double newHeading = fmod(heaqding + _tiltAngle, 360.0);
             self.azimuth = degreesToRadian(newHeading);

             ; //this function updates my ui for the new heading
         }];
    } else {
      NSLog(@&#34;No gyroscope on device.&#34;);
      ,_motionManager = nil;
    }
</code></pre>

<p>这里有一些额外的片段可能有助于理解这个例子:</p>

<pre><code>-(double)angleYAxisToVector:(CGPoint)vector{
    double dX = vector.x;
    double dY = vector.y;

    if(dY == 0){
      if(dX &gt; 0){
            return 0.0;
      }else{
            if(dX &lt; 0){
                return 180.0;
            }else{
                return -1;
            }
      }
    }

    double beta = radiansToDegrees(atan(dX/dY));
    double angle;
    if(dX &gt; 0){
      if (dY &lt; 0){
            angle = 180 + beta;
      }else{
            angle = beta;
      }
    }else{
      if (dY &lt; 0){
            angle = 180 + beta;
      }else{
            angle = 360 + beta;
      }
    }
    //    NSLog(@&#34;angle = %f, normalized = %f&#34;,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)
</code></pre>

<p>编码愉快...</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 基于磁力计和陀螺仪的北向计算,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/9260033/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/9260033/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 基于磁力计和陀螺仪的北向计算