앱에 활기를 불어넣는 위치 및 센서 기능

Windows 8 앱 개발자 블로그

Windows 8 엔지니어링 팀에서 제공하는 Windows 8용 Metro 스타일 앱 개발의 이해

앱에 활기를 불어넣는 위치 및 센서 기능

  • Comments 0

Windows 8 태블릿 또는 컨버터블용 앱을 개발하는 개발자는 센서 및 위치에 대한 최첨단 하드웨어와 소프트웨어 서비스를 경험할 수 있습니다. 개발자는 이러한 하드웨어 기능을 활용하여 앱에 가치를 더하고 보다 재미있고 유용한 앱을 만들 수 있습니다.

사용자의 현재 위치를 바탕으로 자동적으로 3D 환경을 로드하고 태블릿을 3D 공간 주변으로 움직여 3D 세상(카메라 회전, 이동(상하))을 탐색할 수 있는 앱을 상상해 보세요. 다음 사진은 Photosynth 파노라마 앱이 센서 퓨전을 사용하여 장치의 방향과 Photosynth 파노라마 사이에 자연스러운 상호 작용을 하는 모습을 보여줍니다. 센서 퓨전은 이런 센서 중 하나를 사용할 때보다 더 나은 회전 경험을 제공하기 위해 가속도계, 자이로스코프 및 자력계의 출력 값을 조합하며, Windows.Devices.Sensors.OrientationSensor 런타임 형식을 통해 노출됩니다.

사용자가 장치를 수평으로 들고 있으면 Photosynth 파노라마에서 장면을 똑바로 볼 수 있습니다.

정면에서 바라본 파리 이미지, Copyright Felipe Garchet / 360 Cities

사용자가 장치의 포지션을 위로 기울이면 파노라마의 장면 역시 위로 기울어집니다.

고개 들어 바라본 파리 이미지, Copyright Felipe Garchet/360 Cities

사용자가 장치를 왼쪽이나 오른쪽으로 움직일 때도 동일한 상호 작용이 이루어지며, 마치 파노라마의 카메라가 태블릿의 방향에 바로 고정되어 있는 것처럼 보이게 됩니다. 따라서 개발자는 이러한 기능으로 구현할 수 있는 일인칭 게임, 지도 보기, 보행자 내비게이션 등 여러 가지 멋진 경험을 상상해 볼 수 있습니다. 그럼 Windows 8에서 이런 종류의 기능을 구현하는 방법에 대해 알아보겠습니다.

센서를 사용하는 이유

2011년 가을에 //Build 컨퍼런스에서 Microsoft 팀은 Windows 8의 위치 및 센서용 하드웨어 지원에 대한 세부 정보뿐만 아니라, 위치 및 센서용 Windows 런타임 API에 대한 정보도 공유했습니다. 센서를 지원하는 Windows 8을 통해 사용자는 화면 자동 회전 및 자동 밝기 조절과 같은 시스템 수준의 기능을 경험할 수 있습니다. 이런 기능도 대단하지만 정말 놀라운 즐거움을 주는 것은 위치 인식 및 센서 인식 앱입니다. Windows 8에서는 위치 및 센서를 통해 내비게이션과 나침반 시나리오, 캐주얼 게임, 증강 현실, 게임의 상호 작용 모션 컨트롤 등 다양한 경험을 할 수 있습니다.

모든 Windows 8 인증 태블릿 및 컨버터블은 다음과 같은 센서를 갖추게 됩니다.

  • 주위 밝기 센서(ALS)
  • 다음의 센서 하드웨어를 사용하는 9축 센서 퓨전 시스템:
    • 3D 가속도계
    • 3D 자이로
    • 3D 자력계

아울러, 모든 Windows 8 PC에는 Windows 위치 제공자(소프트웨어 위치 검색 서비스) 및 GPS(모바일 광대역 하드웨어를 장착한 PC용)가 포함됩니다.

따라서 센서와 위치 기능의 이상적인 조합을 경험할 수 있습니다. 또한 PC 폼 팩터에 따라 기능이 달라질 수 있으므로 개발자는 어떤 하드웨어 폼 팩터에 맞게 앱을 개발할지를 고려해야 합니다.

앱에서 위치 사용하기

앱에 위치 지원을 추가하는 것은 쉽고 간단합니다. 우선 앱의 매니페스트 파일에 위치 기능 선언을 추가해야 합니다. 이 선언으로 인해 시스템은 앱이 현재 위치에 액세스하려고 한다는 것을 알게 됩니다. 물론, 앱이 현재 위치를 액세스할지 여부에 대한 최종 승인은 사용자가 제어할 수 있으며, Visual Studio를 통해 이 선언을 추가할 수 있습니다. (솔루션 탐색기에서 [package.appxmanifest]를 두 번 클릭하고, [기능] 탭을 클릭한 다음, 목록에서 [위치 확인란]에 확인 표시를 합니다.)

위치 기능을 선언하면 매니페스트 편집기는 다음과 같이 보입니다.

위치 기능의 선언에 대한 UI

 

위치 기능을 선언하면 package.appxmanifest.xml 파일에서 스니펫은 다음과 같이 보입니다(Visual Studio에서 매니페스트 편집기를 사용한 경우의 예).

<Capabilities>
<DeviceCapability Name="location" />
</Capabilities>

앱에 위치 기능을 선언하고 나면, 이제 위치 데이터를 액세스하는 코드를 작성할 수 있습니다. 위치 기능은 Windows 런타임 API에 빌드되며, Windows.Devices.Geolocation 네임스페이스를 통해 액세스할 수 있습니다. 또는 JavaScript를 통해 위치용 W3C API를 사용할 수도 있습니다. 이 글은 Windows만의 다양성을 소개하는 것이 목적이므로, 위치용 W3C API 사용에 대한 자세한 내용은 빠른 시작: HTML5를 사용하여 위치 탐지하기(JavaScript 및 HTML을 사용하는 Metro 스타일 앱)를 참조하세요.

개발자가 위치 데이터를 액세스하는 방법에는 일회성 조회, 그리고 시스템이 위치의 변화를 감지할 때 발생하는 이벤트의 스트림 등 두 가지 기본적인 방법이 있습니다. 이제 각 액세스 모델에 대해 간략하게 살펴보고 나면 어느 모델이 자신의 앱에 적합한지 알 수 있을 것입니다.

일회성 위치 액세스

예를 들어, 사용자의 영역에서 관심 장소를 찾고, 위치 정보와 함께 설명을 나타내며 지도상에 사용자의 위치를 표시하는 등 요구에 따라 위치 정보에 액세스하는 경우, 몇 줄 되지 않는 코드로 이를 구현할 수 있으며 배터리 수명 단축도 최소화할 수 있습니다. 일회성 조회를 보여주는 코드 스니펫을 살펴보겠습니다.

JavaScript:

var loc = new Windows.Devices.Geolocation.Geolocator();
loc.positionAccuracy = Windows.Devices.Geolocation.PositionAccuracy.high;
loc.getGeopositionAsync().done(getPositionHandler, errorHandler);

function getPositionHandler(pos) {
var lat = pos.coordinate.latitude;
var long = pos.coordinate.longitude;
var acc = pos.coordinate.accuracy;
}

function errorHandler(err) {
// handle error
}

C#:

using Windows.Devices.Geolocation;

var loc = new Geolocator();

try
{
loc.DesiredAccuracy = PositionAccuracy.High;
Geoposition pos = await loc.GetGeopositionAsync();

var lat = pos.Coordinate.Latitude;
var long = pos.Coordinate.Longitude;
var acc = pos.Coordinate.Accuracy;
}
catch (System.UnauthorizedAccessException)
{
// handle error
}

그리고 다음을 참고하세요.

  • 지리위치자 개체(위치에 대한 루트 개체) 만들기
  • 위치 액세스가 거부되는 경우의 오류 처리와 함께 현재 위치를 검색하는 작업을 비동기식으로 호출��기

필요한 경우 GetGeopositionAsync에 진행중인 호출을 취소할 수 있습니다. 이를 보여주는 코드의 예제는 Windows 런타임 지리위치 SDK 샘플을 참조하세요. 일회성 위치 액세스에 대한 자세한 내용은 Geolocator.GetGeopositionAsync() | getGeopositionAsync() 메서드 및 지리위치 SDK 샘플을 참조하세요.

연속 위치 액세스

위치 데이터에 연속적으로 액세스할 필요가 있는 경우(예를 들어, 실시간 내비게이션과 같이 관심 장소가 근처에 있을 때 알림, 경로 기록 등등), 하나 이상의 위치 제공자가 시스템상에서의 위치 변화를 감지할 때 앱이 호출하는 이벤트 수신기를 추가할 수 있습니다. 위치의 변화를 수신하는 방법은 다음과 같습니다.

JavaScript:

var loc = new Windows.Devices.Geolocation.Geolocator();
loc.desiredAccuracy = Windows.Devices.Geolocation.PositionAccuracy.high;
loc.addEventListener("positionchanged", onPositionChanged);

function onPositionChanged(e) {
var lat = e.position.coordinate.latitude;
var long = e.position.coordinate.longitude;
var acc = e.position.accuracy;
}

C#:

using Windows.Devices.Geolocation;

private Geolocator loc = new Geolocator();

private void StartTracking(object sender, RoutedEventArgs e)
{
loc.DesiredAccuracy = PositionAccuracy.High;
loc.PositionChanged += new TypedEventHandler<Geolocator, PositionChangedEventArgs>(OnPositionChanged);
}

private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs e)
{
Geoposition pos = e.Position;

var lat = pos.Coordinate.Latitude;
var long = pos.Coordinate.Longitude;
var acc = pos.Coordinate.Accuracy;
}

기본적으로 일회성 검색의 경우와 동일한 코드가 있지만, 비동기 작업을 수행하는 대신 이벤트 처리를 위한 대리자를 전달하는 이벤트 수신기를 추가해 보겠습니다. 이제 포지션의 변화가 감지될 때마다 대리자가 호출되고 위치 데이터를 사용할 수 있지만 이 메서드가 앱에 필요합니다. 움직임에 대한 이벤트의 민감도를 조절할 경우 지리위치자 개체에서 MovementThreshold 속성을 설정할 수 있습니다.

세밀하게 다듬어진 위치 API 동작의 또 다른 측면은 지리위치자 개체에서의 DesiredAccuracy 속성을 설정하는 기능입니다. GPS 수준의 정확성이 필요하지 않는 앱의 경우(예: 날씨 앱), 이 속성을 기본으로 설정하여 위치 식별 시 GPS 장치를 사용하는데 제한을 두어 배터리를 절약할 수 있습니다.

앱에 위치 인식을 추가하는 자세한 내용은 MSDN에서 지리위치 샘플 , 위치 인식 응용 프로그램에 대한 지침Windows.Devices.Geolocation 네임스페이스를 참조하세요.

센서

Windows 8은 광범위하고 사용하기 쉬운 센서용 API 집합을 제공합니다. 이들 클래스는 Windows.Devices.Sensors 네임스페이스에서 찾을 수 있으며, 다음에 해당하는 기본 센서 하드웨어를 나타냅니다.

앞서 언급했던 상호 작용 Photosynth 파노라마에 대한 이야기를 다시 떠올려 보면 Windows 런타임 API를 통해 센서 퓨전을 사용하여 이런 종류의 상호 작용을 구현할 수 있다는 것이 입증됩니다. 장치 방향과 카메라 또는 Photosynth 파노라마의 뷰포인트 사이에 매끄럽고 즉각적인 반응을 원하기 때문에, Windows.Devices.Sensors.OrientationSensor 클래스를 통해 센서 퓨전을 사용해야 합니다. 센서 퓨전을 지원하는데 사용되는 기본 기술에 대해 자세히 알아보려면 Windows 8에서 지원하는 센서를 참조하세요. OrientationSensor 클래스는 장치 방향을 대표하는 2개의 데이터 필드, 즉 쿼터니언으로 불리는 4요소 벡터 및 회전 매트릭스로 불리는 3x3 매트릭스의 값을 나타냅니다. 이 2개의 데이터 필드는 동등한 데이터를 나타내지만 다른 형식으로 데이터를 패키징합니다.

쿼터니언 또는 회전 매트릭스 데이터(변환 등)를 통한 카메라 이동(좌우) 및 이동(상하)에 대한 지원을 구현하는 자세한 내용은 이 블로그 글의 범위를 벗어나지만, Windows 런타임 API를 통한 데이터 액세스 방법에 대해서 설명해 보겠습니다.

센서용 Windows 런타임 API의 모든 센서 개체는 이와 상당히 유사한 패턴을 따릅니다. 먼저, 센서 개체를 만듭니다. 다음으로 초기화를 수행하고 기본 설정(예: 원하는 보고서 간격 설정)을 적용한 다음 동기 호출에 의해서, 또는 이벤트 수신기를 추가함으로써 데이터에 액세스합니다.

동기식으로 데이터를 액세스하는 방법은 다음과 같습니다.

JavaScript:

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
// Select a report interval that works for the app and that the sensor supports.
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;

// Set the report interval to enable the sensor for polling
sensor.reportInterval = reportInterval;

var reading = sensor.getCurrentReading();
if (reading) {
var quaternion = reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}
}

C#:

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
// Select a report interval that works for the app and that the sensor supports.
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;

// Set the report interval to enable the sensor for polling
sensor.reportInterval = reportInterval;

var reading = sensor.getCurrentReading();
if (reading) {
var quaternion = reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}
}

이런 유형의 액세스는 사용자 동작에 대응하여 개체에 장치 방향을 태깅하는 것과 같이 특정 환경에서 데이터를 필요로 하거나 타이머(예를 들면 게임에서 렌더링 루프)에 대한 데이터 폴링이 필요한 경우에 선호될 것입니다. 데이터에 대한 폴링의 경우라 하더라도, 센서용 하드웨어/드라이버가 앱이 필요로 하는 비율로 데이터를 새로 고칠 수 있도록 여기서 제시하는 대로 보고서 간격을 설정해야 합니다.

다음으로 변경 이벤트 읽기에 대한 대응 방식을 알아보겠습니다.

JavaScript:

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;
sensor.reportInterval = reportInterval;

sensor.addEventListener("readingchanged", onDataChanged);
}

function onDataChanged(e) {
var quaternion = e.reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}

C#:

using Windows.Devices.Sensors;

private OrientationSensor sensor = OrientationSensor.GetDefault();

private void EnableReadings(object sender, RoutedEventArgs e)
{
if (sensor != null)
{
var minReportInterval = sensor.MinimumReportInterval;
var desiredReportInterval = minReportInterval > 20 ? minReportInterval : 20;

sensor.ReportInterval = desiredReportInterval;

sensor.ReadingChanged += new TypedEventHandler<OrientationSensor, OrientationSensorReadingChangedEventArgs>(ReadingChanged);
}
}

private void ReadingChanged(object sender, OrientationSensorReadingChangedEventArgs e)
{
SensorQuaternion quaternion = e.Reading.Quaternion;
var x = quaternion.X;
var y = quaternion.Y;
var z = quaternion.Z;
var w = quaternion.W;
}

이 코드 스니펫에서 OrientationSensor 개체를 얻고, 보고서 간격을 20 또는 최소 지원 값(센서 하드웨어가 데이터를 공급할 수 있는 가장 빠른 비율) 중 더 큰 값으로 설정합니다. 예를 들어, 이 앱에 대해서는 가능한 매 20밀리초에 근접한 간격으로 데이터를 구합니다. 앱에 적합한 간격(데이터가 필요한 정도로 빠른)을 사용하여 전원 및 성능에 부정적인 영향을 미치지 않도록 해야 합니다.

또한 이벤트 수신기 대리자에서 쿼터니언 데이터 [x,y,z,w]를 사용하는 적합한 변환을 적용하여 앱에서의 모션/방향 상호 작용을 지원하도록 합니다. 동등한 수준의 회전 매트릭스 데이터도 사용할 수 있습니다. 이 변환 코드는 이 블로그의 범위를 벗어나지만, 게임 제작 시나리오, 로봇 공학 등 쿼터니언 데이터를 사용하는 방법과 관련된 여러 온라인 소스가 있습니다. 오일러 각도 계산에 내재된 '짐벌록' 현상을 피하는 회전 데이터의 연속성이야말로 경사계 데이터에 대한 쿼터니언(또는 회전 매트릭스)을 사용함으로써 얻게 되는 이점이라 할 수 있습니다.

결론

앱에 센서 및 위치 기능을 추가하여 사용자에게 새롭고 신나는 경험을 제공할 수 있습니다. Windows 8에서 개발자는 센서와 위치 기능이 향상된 앱을 개발하기 위해 포괄적인 하드웨어 및 소프트웨어 지원, Visual Studio, 사용하기 쉬운 Windows 런타임 API, 다양한 프로그래밍 언어 등에 액세스할 수 있습니다. 그에 따라 앱에서 유익하고 간단한 이러한 기능들을 구현할 수 있습니다. 그럼, 멋진 앱을 개발해 보시기 바랍니다.

- Gavin Gear, 프로그램 관리자

- Dino Natucci, 프로그램 관리자

  • Loading...
Leave a Comment
  • Please add 5 and 7 and type the answer here:
  • Post