设为首页 收藏本站
查看: 1246|回复: 0

Windows Phone 7 Motion Sensor 使用指南

[复制链接]

尚未签到

发表于 2015-5-8 11:50:14 | 显示全部楼层 |阅读模式
  1. 为什么要引入Motion API?   
      在上一篇《Windows Phone 7 数字罗盘使用指南》中,我们已经对WP7中的传感器有所了解,事实上,WP7正是通过这些传感器来获取手机当前的姿态和位置等信息。但是,对于开发者来说,他们所关心的并不是这些数据的值本身,而是这些数据所表示的含义。举个例子,之前做Windows Mobile设备定位应用的时候,一般会涉及到GPS数据的获取。在WM2003平台上,开发者需要自己写串口通信类,实现NEMA数据的解析。分析这个过程,最终我们提供给应用的有意义的数据其实就是经纬度和时间等信息,而并不是原始的NEMA协议数据。因此,微软在WM5.0平台中引入了GPSID(即GPS中间层驱动),对于应用程序来说,GPSID为其提供经纬度等信息;而与GPS硬件打交道的过程,就交给了GPSID。这样一来,应用程序开发者就从中解脱出来了。
      那么,在我看来,Motion API所做的事情,其实质就和GPSID类似。在应用程序开发过程中,如果我们开发者获取原始的传感器数据,然后对其数据进行分析,从而去判断手机的姿态和移动方向,这样一个处理流程确实有点复杂,而且有时候也很难处理,如加速度传感器的返回值中,不仅仅包含了手机移动的加速度,还包括了重力加速度(事实上,在Windows Phone OS 7.0上,处理加速度传感器时,我们的确是需要经历上面的过程)。
      因此,在Windows Phone OS 7.1(Mango)中,引入了Motion API,用它来对底层的传感器数据进行分析和处理,从而得到开发者需要的信息,如设备的姿态(yaw, pitch, and roll)、旋转加速度和线性加速度。我们可以对原始的加速度传感器信息与Motion API中的加速度传感器信息进行对比,了解它们的区别。如下图1所示,左边是获取加速度传感器原始数据的页面,右边是获取Motion数据的页面。
DSC0000.jpg DSC0001.jpg

图1:加速度传感器的原始数据与Motion获取的数据对比

   从Y轴的数据来看,原始的加速度传感器数据包含了重力加速度与手机在外力作用下的加速度,而从Motion API获取到的加速度数据来看,它已经为我们排除了重力加速度的影响。因此,对于开发者而言,Motion API有助于简化应用程序的开发。
  
  2. 使用Motion API的前提
      首先,需要注意的是,一代的Windows Phone 7手机没有开放Motion API。因此,如果想要在Windows Phone OS 7.0上写基于Motion的应用程序,那是无法实现的。但是,自从这个月初微软提供了Mango升级以后,很多设备厂商都对其生产的WP7推送了Mango更新。在OS升级以后,有些设备就提供了对Motion API的支持。如我的三星Focus i917就支持,因此才有了以下的尝试。下文中的内容,参考了MSDN上的文章:How to: Use the Combined Motion API for Windows Phone。
  
  3. 如何在应用程序中使用Motion API?
  这里以silverlight应用程序为例,展示了在应用程序中使用Motion API的方法。
  (1)添加对Microsoft.Devices.Sensors与Microsoft.Xna.Framework的引用,如下图2所示:
DSC0002.png

图2:添加Motion API相关的namespace

  (2)在主页面的XAML中,加入6个Textblock,表示手机姿态的yall、pitch、roll和加速度传感器的三个返回值。为了使得表现形式更加得直观,引入三个三角形,用其旋转的角度来表征yall、pitch、roll的数值,同时引入三个相互垂直的轴线,用来表示加速度传感器的值,其代码如下:

   1:            2:             3:                 4:                 5:             6:      7:             8:                 9:                10:                    11:                    12:                    13:                14:                15:                    16:                        17:                            18:                        19:                        20:                            21:                        22:                    23:                    24:                        25:                            26:                        27:                        28:                            29:                        30:                    31:                    32:                        33:                            34:                        35:                        36:                            37:                        38:                    39:                40:                41:                42:                    43:                    44:                    45:                46:                47:                    48:                    49:                    50:                51:            
  (3)在主页面的MainPage.xaml.cs中,声明一个Motion类的对象。
  (4)重写页面的OnNavigatedTo(NavigationEventArgs)方法,检查设备是否支持Motion,初始化Motion对象,添加CurrentValueChanged事件,代码如下:


   1:  protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)   2:  {   3:    // Check to see whether the Motion API is supported on the device.   4:    if (! Motion.IsSupported)   5:    {   6:      MessageBox.Show("the Motion API is not supported on this device.");   7:      return;   8:    }   9:     10:    // If the Motion object is null, initialize it and add a CurrentValueChanged  11:    // event handler.  12:    if (motion == null)  13:    {  14:      motion = new Motion();  15:      motion.TimeBetweenUpdates = TimeSpan.FromMilliseconds(20);  16:      motion.CurrentValueChanged += new EventHandler(motion_CurrentValueChanged);  17:    }  18:     19:    // Try to start the Motion API.  20:    try  21:    {  22:      motion.Start();  23:    }  24:    catch (Exception ex)  25:    {  26:      MessageBox.Show("unable to start the Motion API.");  27:    }  28:  }  
  (5)通过周期性地调用CurrentValueChanged事件获得Motion数据,但是该事件是在后台进程中调用,无法对UI元素进行更改。因此,我们需要在UI线程中使用BeginInvoke来调用CurrentValueChanged。
  (6)创建CurrentValueChanged方法,在其中设置6个Textblock和4个图的内容。使用XNA Framework中的MathHelper类实现弧度和角度的转换,代码如下:


   1:  private void CurrentValueChanged(MotionReading e)   2:  {   3:    // Check to see if the Motion data is valid.   4:    if (motion.IsDataValid)   5:    {   6:      // Show the numeric values for attitude.   7:      yawTextBlock.Text = "YAW: " + MathHelper.ToDegrees(e.Attitude.Yaw).ToString("0") + "°";   8:      pitchTextBlock.Text = "PITCH: " + MathHelper.ToDegrees(e.Attitude.Pitch).ToString("0") + "°";   9:      rollTextBlock.Text = "ROLL: " + MathHelper.ToDegrees(e.Attitude.Roll).ToString("0") + "°";  10:     11:      // Set the Angle of the triangle RenderTransforms to the attitude of the device.  12:      ((RotateTransform)yawtriangle.RenderTransform).Angle = MathHelper.ToDegrees(e.Attitude.Yaw);  13:      ((RotateTransform)pitchtriangle.RenderTransform).Angle = MathHelper.ToDegrees(e.Attitude.Pitch);  14:      ((RotateTransform)rolltriangle.RenderTransform).Angle = MathHelper.ToDegrees(e.Attitude.Roll);  15:     16:      // Show the numeric values for acceleration.  17:      xTextBlock.Text = "X: " + e.DeviceAcceleration.X.ToString("0.00");  18:      yTextBlock.Text = "Y: " + e.DeviceAcceleration.Y.ToString("0.00");  19:      zTextBlock.Text = "Z: " + e.DeviceAcceleration.Z.ToString("0.00");  20:     21:      // Show the acceleration values graphically.  22:      xLine.X2 = xLine.X1 + e.DeviceAcceleration.X * 100;  23:      yLine.Y2 = yLine.Y1 - e.DeviceAcceleration.Y * 100;  24:      zLine.X2 = zLine.X1 - e.DeviceAcceleration.Z * 50;  25:      zLine.Y2 = zLine.Y1 + e.DeviceAcceleration.Z * 50;  26:    }  27:  }  
  4. 测试结果
  对三星Focus i917(已升级到Mango,版本号为7720.68)进行Compass测试,获得的结果如下图3所示:
DSC0003.jpg

图3:Focus上的Motion API测试结果

  
  参考链接:
  1. How to: Use the Combined Motion API for Windows Phone
  2. Sensors Overview for Windows Phone

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-64961-1-1.html 上篇帖子: 静静期待 Windows 7 的到来 下篇帖子: [翻译]Programming Windows Phone 7 Series简介以及开发环境搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表