Windows Phone 7 数字罗盘使用指南

1. 什么是数字罗盘,和指南针有什么关系?

    指南针是我们外出旅游时,用来指示方向的一种工具。常见的机械式指南针,它是一种根据地球磁场的有极性制作的地磁指南针,但这种指南针指示的南北方向与真正的南北方向不同,存在一个磁偏角。电子器件的飞速发展,为我们带来了电子指南针,也就是所谓的数字罗盘,它采用了磁场传感器的磁阻技术,可很好地修正磁偏角的问题。有人会问,为了实现指向,直接使用GPS不就可以了吗?但现实情况是,如果我们处于建筑物内、或者一些无法接收卫星信号的地方,那么GPS就无法获取地理位置和方向信息了。在这种情况下,数字罗盘就可以发挥作用了。

2. 数字罗盘的种类

根据实现的原理,数字罗盘可以分为两种:magnetic compassgyro compass。前者指示的是地磁意义上的南北极,而后者指示的是地理意义上的南北极。注意,地磁南北极与地理南北极并不相同。地磁北极是地球表面地球磁场方向垂直向下的点,地磁北极点随时间不停的变化。另外,由于地球磁场并不是完全对称的,地磁北极与地磁南极并不是处在同一个轴上。地理北极(通常就简称为北极)是地球的自转轴与地球表面的两个交点之一(另一个点是南极,就在相对的另一面),地理上的北极是纬度为北纬90°的点,在方向上是真北,在这一点所指向的任何方向都是南方。

3. Windows Phone 7上的数字罗盘

为了方便我们的日常生活,传感器可以说是手机中必备的功能器件。常用的传感器包括加速度传感器、数字罗盘、GPS等等。当然,手机厂商对其的支持程度也会随着手机型号及其面向的用户而改变。对于Windows Phone 7而言,微软给各个手机生产厂商指定了一个硬件规格,包括CPU、屏幕分辨率、内存容量和传感器等等。具体来说,Windows Phone OS 7.0(Windows Phone RTM)支持加速度传感器,但却并不支持数字罗盘(Compass)(确切的说,应该是没有向用户开放Compass的API)。但是,这一情况从Windows Phone OS 7.1(Mango)发布以后就得到了改观,Compass API是其引入的新特性之一。下图就显示了Windows Phone RTM和Mango这两个版本对各种传感器的支持情况。

Sensor

Windows Phone RTM

Windows Phone Mango

Accelerometer

支持

支持

Microphone

支持

支持

A-GPS

支持

支持

Camera

支持

支持

Compass

不支持

可选

Gyro

不支持

可选

Motion

不支持

可选

FM Radio

支持

支持

图1:WP7两个版本间传感器支持的差异

需要注意的是,对于Windows Phone 7设备来说,Compass并不是必须的。换句话说,微软并没有对其进行强制规定,硬件厂商可以根据自己的意愿来选择是否对其生产的Windows Phone 7设备加入数字罗盘的支持。例如,对于我的三星Focus i917而言,它支持加速度传感器和Compass,但是却并不支持Gyro。

4.  如何判断你的Windows Phone 7设备是否支持数字罗盘

如何判断Windows Phone 7设备是否支持某种传感器,我们可以通过Microsoft.Devices.Sensors命名空间下,各个传感器的IsSupported属性获得。例如,判断设备是否支持数字罗盘,我们可以使用下面的语句:

   1:  Compass compass;
   2:  if (!Compass.IsSupported)
   3:  {
   4:      statusTextBlock.Text = "device does not support compass";
   5:      ApplicationBar.IsVisible = false;
   6:  }

5. Compass提供的数据

Windows Phone 7的Compass,可以提供的数据及其含义如下:

  •     (1)HeadingAccuracy -- 数字罗盘方向指示的精度,该数值一般用来指示是否需要校准。
  •     (2)MagneticHeading -- 与地磁北极的偏角,一般用角度来表示。     (3)TrueHeading -- 与地理北极的偏角,一般用角度来表示。     (4)MagnetometerReading -- 从磁力计得到的原始数据,以微特斯拉为单位,用XNA中的 Vector3 作为数据类型。

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

    注:Windows Phone 7的Compass提供了TrueHeading,从数字罗盘的分类上看,它还实现了gyro的功能。但是,从MSDN的文档《Sensors Overview for Windows Phone》来看,其compass提供的应该是与地磁北极的偏角:

    “The Compass, or magnetometer, sensor can be used to determine the angle by which the device is rotated relative to the Earth’s magnetic north pole. An application can also use raw magnetometer readings to detect magnetic forces around the device.”

    所以,对于这一点,我还是存在疑惑。

6. 如何为Windows Phone 7应用程序加入Compass?

关于这一点,我们可以参考MSDN上的这篇文章:《How to: Get Data from the Compass Sensor for Windows Phone》。需要注意的有以下几点:

    (1)我们需要添加对Microsoft.Devices.Sensors以及Microsoft.Xna.Framework的引用。

    (2)我们需要在xaml对应的cs文件中,声明对命名空间的引入:

   1:  using Microsoft.Devices.Sensors;
   2:  using Microsoft.Xna.Framework;
   3:  using System.Windows.Threading;

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

(3)手机竖屏模式与横屏模式对Compass的影响。应用程序从Compass类中获得的角度信息会根据手机的姿态有所调整,其中主要是横屏和竖屏模式的区别。判断手机处于哪种状态,可以通过加速度传感器中Z轴的值来实现。

   1:  void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
   2:  {
   3:    Vector3 v = e.SensorReading.Acceleration;
   4:   
   5:    bool isCompassUsingNegativeZAxis = false;
   6:   
   7:    if (Math.Abs(v.Z) < Math.Cos(Math.PI / 4) &&
   8:                  (v.Y < Math.Sin(7 * Math.PI / 4)))
   9:    {
  10:      isCompassUsingNegativeZAxis = true;
  11:    }
  12:   
  13:    Dispatcher.BeginInvoke(() => { orientationTextBlock.Text = (isCompassUsingNegativeZAxis) ? "portrait mode" : "flat mode"; });
  14:  }

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

7. Compass的校准

    由于受到外部电磁场的干扰,会使得手机的Compass数据精度降低,在这种情况下,我们必须提示用户远离磁场干扰,并且对Compass进行校准。在Windows Phone 7上,与CurrentValueChanged一样,OS为Compass提供了校准事件处理compass_Calibrate。在OS检测到heading accuracy的绝对值大于20度时,就会触发该事件。在对Compass进行校准时,一般显示一个图片,提示用户对手机进行绕“8”字移动。

   1:  void compass_Calibrate(object sender, CalibrationEventArgs e)
   2:  {
   3:    Dispatcher.BeginInvoke(() => { calibrationStackPanel.Visibility = Visibility.Visible; });
   4:    calibrating = true;
   5:  }

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

8. 实际测试结果分析

对三星Focus i917(已升级到Mango,版本号为7720.68)进行Compass测试,获得的结果如下图2所示:

图2:三星Focus i917设备的Compass测试结果

    进行测试时,手机处于竖屏模式(flat mode),而非横屏模式(portrait mode)。另外,从magnetic heading与true heading的结果来看,这两个数值相同,因此,我猜想:由于受设备的传感器的限制,OS并没有区分地磁南北极与地理南北极,而是把地磁的南北极等同于地理的南北极。

    希望有HTC设备的朋友们可以测试一下,是否支持Gyro?如果支持的话,从Compass获得的magnetic heading与true heading值是否一致?

参考链接:

1. MSDN:How to: Get Data from the Compass Sensor for Windows Phone

2. Wiki:magnetic compass and gyro compass

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

GSM Hacking Part ②:使用SDR捕获GSM网络数据并解密

本文作者:雪碧0xroot@漏洞盒子安全团队 0×00 在文章第一部分 GSM Hacking Part ① :使用SDR扫描嗅探GSM网络搭建了嗅探GSM流量...

35780
来自专栏Golang语言社区

Oculus + Node.js + Three.js 打造VR世界

Oculus Rift 是一款为电子游戏设计的头戴式显示器。这是一款虚拟现实设备。这款设备很可能改变未来人们游戏的方式。 周五Hackday Showcase的...

63180
来自专栏静晴轩

Sublime Text 最新注册码分享

SublimeText,她作为强大而小巧,性感且快捷的编辑器,长时间以来,受众人青睐;对于个人来说,也是最常用代码编辑器,且没有之一(目前同时也会用 VsCod...

38630
来自专栏FreeBuf

极客DIY:教你做一个简单的“太阳能”移动电源

在这篇分享中,我将向大家一步一步的展示如何手工制作一个简单的太阳能移动电源。同时因为我个人的喜好,漂亮且艺术感十足的木质外在的制作过程也会包含其中。 类似的分享...

20990
来自专栏静晴轩

Windows下效率必备软件

工欲善其事,必先利其器! 工欲善其事,必先利其器! 工欲善其事,必先利其器!重而说三。 AutoHotKey: 神器!神器!神器!当然也得看使用者咯(^__^)...

43980
来自专栏IT平头哥联盟

做完小程序项目、老板给我加了6k薪资~

  大家好,这里是@IT·平头哥联盟,我是首席填坑官——苏南(South·Su),今天要给大家分享的是最近公司做的一个小程序项目,过程中的一些好的总结和遇到的坑...

18940
来自专栏知晓程序

举报!这里有人,在光天化日之下聚众撸猫

但并不是每个人都有机会成为「猫奴」。这时候,你需要 「吸猫君」 ,来帮你开启「云吸猫」的生活。

9420
来自专栏针针小站

【System】Windows 10 RS4 1803 春季创意者镜像分享

20430
来自专栏木子昭的博客

Django网页模板的继承include与复用extends

Django使用网页模板的方式分为两种, 一是建立代码块, 在新的页面导入代码块, 关键词为include 二是建立模板,新的页面在模板基础上扩充, 关键词为e...

20010
来自专栏工科狗和生物喵

C++初入门,写个弱智银行卡系统

写在前面: 自从课程设计之后,我们就开始了生产实习,我们老师找的是河南卫华集团的技术部实习,经过一阵子的不适应(比如说河南这边的基本没味道的伙食,我们现在两个人...

488110

扫码关注云+社区

领取腾讯云代金券