65.9K
CodeProject 正在变化。 阅读更多。
Home

2012 Rocking the Windows 8 Sensors on the Intel IvyBridge Ultrabook

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2012 年 11 月 29 日

CPOL

7分钟阅读

viewsIcon

8558

2012 年在英特尔 IvyBridge 超级本上玩转 Windows 8 传感器。

优秀的传感器和使用 Windows 8 传感器 API 的简便性相结合,必将为一些出色的应用程序打开大门。在这最后的评测中,我将介绍核心传感器、它们的表现以及如何使用它们。

多年来,我收到过一些用于评测的硬件和软件。不幸的是,我收到的一些硬件远未达到我的期望,几乎从未再次使用过。但对于我收到的这款运行 Windows 8 Pro 的英特尔 IvyBridge 超级本,情况绝非如此。在这段时间内,我的使用体验令我在速度、便携性、触摸屏以及各种传感器方面印象深刻。

据我所知,这款机器本身可能不会在商店里销售,而是英特尔用来展示 OEM 厂商可以为 Windows 8 创造出何种产品的模型。我的这款没有品牌,底部贴满了“非零售”的标签。然而,这款设备中的英特尔组件将出现在您可以购买的设备中。

您可以在 这里 阅读我对 IvyBridge 超级本的初步印象,以及 我两周后的后续反馈。这款超级本非常便携,内置了许多端口,因此我无需携带大量转接器。这对我这样经常出差和演示的人来说至关重要。我可以轻松地将其放入包中,随身携带进行演示,并在上面完成大量工作。

它速度很快。我主要使用 Visual Studio 2012 和其他几个开发工具。速度和性能对我来说不是“锦上添花”,而是“必需品”。尽管这款超级本的 RAM 和 CPU 比我通常的配置要低,但它在这方面表现出色。我喜欢 i7 处理器,但不得不承认,对于这款超级本来说,i5 已经绰绰有余(也许是 Windows 8 及其声称的高效性,也许只是超快的 180 GB SSD)。无论如何,我对这款 IvyBridge 超级本的速度非常满意。

去年 10 月,我使用这款设备测试了我和 Dan WahlinPluralsight 编写的一些 Windows 8 课程材料。我同时使用了不少程序,包括 Visual Studio 2012、Powerpoint 和 OneNote。在这款设备上一切都很顺利。您可以通过点击下方的图片了解更多关于这个 Windows 8 入门课程的信息。

传感器

Windows 8 提供了各种 API 来访问设备传感器。Windows 团队提供了几个示例应用程序,以便您可以测试传感器。您可以找到包括(但不限于)以下传感器在内的 API:

  • 加速度计(沿 3 个轴的加速度)
  • 指南针(方向和位置)
  • 陀螺仪(角速度)
  • 倾斜仪(倾斜角度)
  • 光线传感器(环境光照)
  • 方向传感器(结合加速度计、指南针、陀螺仪以获得更灵敏的运动检测)
  • 简单方向(设备的方向,包括正面朝上或朝下)

我使用这些示例应用程序测试了传感器。

下面所有的代码示例均直接来自 Windows 8 示例应用程序,您可以通过此链接下载

加速度计

应用程序应能理解运动和屏幕旋转,这需要加速度计。加速度计测量重力引起的力以及设备自身的运动。加速度计传感器沿 3 个轴(x、y 和 z)跟踪加速度。示例应用程序“Accelerometer sensor sample”(加速度计传感器示例)跟踪报告给传感器的加速度值,并且对于跟踪设备何时被摇动很有用。在我的测试中,示例应用程序立即且如预期般报告了加速度和摇动。
那么这有多简单呢?实际上非常简单。首先,您需要获取传感器 API 的引用。这就是您在下面的代码中看到的 `Accelerometer.GetDefault()`。然后,一个简单的空值检查可以确定您是否可以访问传感器及其数据。该示例获取传感器支持的最小报告间隔(这决定了传感器报告其数据的频率/间隔)。
private Accelerometer _accelerometer;
private uint _desiredReportInterval;

public Scenario1()
{
    this.InitializeComponent();

    _accelerometer = Accelerometer.GetDefault();
    if (_accelerometer != null)
    {
        // Select a report interval that is both suitable for the purposes of the app and supported by the sensor.
        // This value will be used later to activate the sensor.
        uint minReportInterval = _accelerometer.MinimumReportInterval;
        _desiredReportInterval = minReportInterval > 16 ? minReportInterval : 16;
    }
    else
    {
        rootPage.NotifyUser("No accelerometer found", NotifyType.StatusMessage);
    }
}
现在我们已经获得了对加速度计传感器的句柄,我们可以连接一个事件处理程序来捕获数据。
_accelerometer.ReadingChanged += 
    new TypedEventHandler<Accelerometer, AccelerometerReadingChangedEventArgs>(ReadingChanged);

然后,获取数据就像在事件参数中读取 `AccelerometerReading` 对象一样简单(使用异步处理程序)。数据逐一推送到屏幕的 TextBlocks 中。

async private void ReadingChanged(object sender, AccelerometerReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt;
    {
        AccelerometerReading reading = e.Reading;
        ScenarioOutput_X.Text = String.Format("{0,5:0.00}", reading.AccelerationX);
        ScenarioOutput_Y.Text = String.Format("{0,5:0.00}", reading.AccelerationY);
        ScenarioOutput_Z.Text = String.Format("{0,5:0.00}", reading.AccelerationZ);
    });
}

我们还可以通过连接事件处理程序来检查设备是否被摇动。

_accelerometer.Shaken += 
    new TypedEventHandler<Accelerometer, AccelerometerShakenEventArgs>(Shaken);
正如下面所示(来自同一示例的场景 2),可以通过一个简单的计数器来检索摇动次数。
async private void Shaken(object sender, AccelerometerShakenEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt;
    {
        _shakeCount++;
        ScenarioOutputText.Text = _shakeCount.ToString();
    });
}

指南针

指南针传感器会报告设备的方向和位置信息。与我拥有的其他指南针相比,英特尔 IvyBridge 超级本上的传感器通过指南针很好地检测到了位置。您可以使用 Windows 8 示例应用程序“Compass sensor sample”(指南针传感器示例)来检测方向(北、南、东、西),以度为单位进行测量。首先,您获取指南针对象。

private Compass _compass;
然后连接事件处理程序
_compass.ReadingChanged += 
    new TypedEventHandler(ReadingChanged);
在事件处理程序中获取读数并将位置显示为度数。
CompassReading reading = e.Reading;
ScenarioOutput_MagneticNorth.Text = String.Format("{0,5:0.00}", reading.HeadingMagneticNorth);

陀螺仪

陀螺仪传感器沿 3 个轴测量角速度。英特尔 IvyBridge 超级本设备上的陀螺仪非常灵敏(这是好事),并且与其他传感器(如指南针)结合使用时,在运动和位置感应系统(例如游戏)中可能非常有用。您可以使用“Gyrometer sensor sample”(陀螺仪传感器示例)来测试陀螺仪。首先获取陀螺仪对象
private Gyrometer _gyrometer;
然后连接事件处理程序
_gyrometer.ReadingChanged += 
    new TypedEventHandler(ReadingChanged);
最后,在事件处理程序中读取角速度数据。
async private void ReadingChanged(object sender, GyrometerReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt;
    {
        GyrometerReading reading = e.Reading;
        ScenarioOutput_X.Text = String.Format("{0,5:0.00}", reading.AngularVelocityX);
        ScenarioOutput_Y.Text = String.Format("{0,5:0.00}", reading.AngularVelocityY);
        ScenarioOutput_Z.Text = String.Format("{0,5:0.00}", reading.AngularVelocityZ);
    });
}

倾斜仪

倾斜仪测量倾斜角度,暴露设备的偏航、俯仰和滚转读数。偏航是设备的 z 旋转,滚转是 y 旋转,俯仰是 x 旋转。我使用 Windows 8 示例“Inclinometer sensor sample”(倾斜仪传感器示例)来访问这些 API。同样,英特尔 IvyBridge 超级本的传感器表现得相当好,报告了倾斜仪的读数。您可以按照我之前展示的其他 API 的熟悉模式来访问此 API。首先获取倾斜仪对象
private Inclinometer _inclinometer;
然后连接事件处理程序
_inclinometer.ReadingChanged += 
    new TypedEventHandler(ReadingChanged);
最后,在事件处理程序中读取偏航、俯仰和滚转数据。
async private void ReadingChanged(object sender, InclinometerReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt;
    {
        InclinometerReading reading = e.Reading;
        ScenarioOutput_X.Text = String.Format("{0,5:0.00}", reading.PitchDegrees);
        ScenarioOutput_Y.Text = String.Format("{0,5:0.00}", reading.RollDegrees);
        ScenarioOutput_Z.Text = String.Format("{0,5:0.00}", reading.YawDegrees);
    });
}

光线传感器

英特尔 IvyBridge 设备有一个环境光传感器,可以报告亮度级别。这可用于多种目的,包括在光线变化的房间中调整显示器的亮度。我在黑暗房间、明亮房间、室内和室外进行了测试,并通过将一个明亮的灯(台灯)移近超级本进行了测试。在我的所有测试中,传感器都报告了稳定且符合预期的数据。
访问光线传感器非常简单,只需获取 LightSensor 对象(请注意,此传感器名称带有“sensor”后缀,而我之前提到的传感器 API 则没有)。您可以在名为“LightSensor sample”(光线传感器示例)的 Windows 8 示例中亲自查看。
private LightSensor _sensor;
然后连接事件处理程序
_sensor.ReadingChanged += 
    new TypedEventHandler(ReadingChanged);

最后,在事件处理程序中读取照度数据(以勒克斯为单位)。

async private void ReadingChanged(object sender, LightSensorReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt;
    {
        LightSensorReading reading = e.Reading;
        ScenarioOutput_LUX.Text = String.Format("{0,5:0.00}", reading.IlluminanceInLux);
    });
}

方向传感器

OrientationSensor 结合了加速度计、指南针和陀螺仪,可报告比传感器单独运行时更灵敏的运动。例如,您可以通过读取设备方向、屏幕方向和加速度计来使用此功能来定向屏幕上的图像。

首先获取 `OrientationSensor` 对象

private OrientationSensor _sensor;
然后连接事件处理程序
_sensor.ReadingChanged += 
    new TypedEventHandler(ReadingChanged);
然后在事件处理程序中读取 `OrientationSensorReading` 对象的数据。
async private void ReadingChanged(object sender, OrientationSensorReadingChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt;
    {
        OrientationSensorReading reading = e.Reading;

        // Quaternion values
        SensorQuaternion quaternion = reading.Quaternion;   // get a reference to the object to avoid re-creating it for each access
        ScenarioOutput_X.Text = String.Format("{0,8:0.00000}", quaternion.X);
        ScenarioOutput_Y.Text = String.Format("{0,8:0.00000}", quaternion.Y);
        ScenarioOutput_Z.Text = String.Format("{0,8:0.00000}", quaternion.Z);
        ScenarioOutput_W.Text = String.Format("{0,8:0.00000}", quaternion.W);

        // Rotation Matrix values
        SensorRotationMatrix rotationMatrix = reading.RotationMatrix;
        ScenarioOutput_M11.Text = String.Format("{0,8:0.00000}", rotationMatrix.M11);
        ScenarioOutput_M12.Text = String.Format("{0,8:0.00000}", rotationMatrix.M12);
        ScenarioOutput_M13.Text = String.Format("{0,8:0.00000}", rotationMatrix.M13);
        ScenarioOutput_M21.Text = String.Format("{0,8:0.00000}", rotationMatrix.M21);
        ScenarioOutput_M22.Text = String.Format("{0,8:0.00000}", rotationMatrix.M22);
        ScenarioOutput_M23.Text = String.Format("{0,8:0.00000}", rotationMatrix.M23);
        ScenarioOutput_M31.Text = String.Format("{0,8:0.00000}", rotationMatrix.M31);
        ScenarioOutput_M32.Text = String.Format("{0,8:0.00000}", rotationMatrix.M32);
        ScenarioOutput_M33.Text = String.Format("{0,8:0.00000}", rotationMatrix.M33);
    });
}

总结

Windows 8 传感器 API 使得访问设备传感器变得容易。这使得设备实现传感器并以密集且准确的间隔报告数据变得至关重要。我发现我测试过的英特尔 IvyBridge 超级本设备在所有这些传感器方面表现都非常出色。我很高兴看到会有哪些类型的应用程序能够利用这些传感器和 Windows 8。

披露物质联系:我免费收到了一项或多项上述产品或服务,希望能在我的博客上提及。无论如何,我只推荐我个人使用并且认为我的读者会喜欢的产品或服务。我正在根据《美国联邦贸易委员会》的 16 CFR 第 255 部分:“关于在广告中使用认可和推荐的指南”披露这一点。

© . All rights reserved.