Moverio Basic Function SDK

Android & Windowsデベロッパーズガイド

3. Windowsアプリ開発の概要

3.1. Windowsアプリ開発の概要

Moverio向けのWindowsアプリケーションを開発するために必要となる手順について以下に記載します。

Windows SDKの導入

以下の項目ではWindows10を搭載したパソコンにWindows SDKを導入する方法について記載します。

Visual Studio 2019の入手

Visual Studio 2019を下記のサイトからダウンロードします。(2020年7月時点の最新バージョンは、Visual Studio 2019)https://visualstudio.microsoft.com/vs/

Visual Studio 2019のインストール

Visual Studio Installerを起動し、指示に従いVisual Studio 2019をインストールします。

ワークロードの追加

Visual Studio Installerを起動し、ワークロードの画面で「Universal Windows Platform development」と「.NET desktop development」と「Desktop development with C++」を追加してインストールします。下記のサイトで詳細な手順を確認してください。
https://docs.microsoft.com/ja-jp/visualstudio/install/modify-visual-studio?view=vs-2019

困ったときは

Microsoft社のVisual Studioドキュメントを確認してください。
https://docs.microsoft.com/ja-jp/visualstudio/?view=vs-2019

アプリケーションの作成

本ドキュメントにおけるアプリケーションの作成は、デスクトップアプリの作成について記載します。お客様の開発するアプリケーションに合わせてワークロードを選択してください。

デスクトップアプリの作成

下記のサイトで詳細な手順を確認してください。
https://docs.microsoft.com/ja-jp/windows/win32/

3.2. ディスプレイ制御の概要(for Windows)

Moverioはシースルー型(透過型)のディスプレイを搭載しています。Windowsデスクトップアプリでのディスプレイ制御は、Windows標準のCOMポートアクセスAPIであるSystem.IO.Ports.SerialPortを使用し、専用のコマンドを送信することで制御することができます。専用のコマンドを使用することで、ディスプレイの明るさや2D/3D表示モードの切り替えなどを制御することができます。ディスプレイの明るさは専用のコマンドからの調整と周辺環境の照度に合わせた自動調整の方法を使用することができます。また、Side-by-Side方式の3Dコンテンツの表示に対応することが可能です。

ディスプレイの明るさの調整

Moverioはシースルー型のディスプレイを搭載しており、周辺環境の明るさの影響により表示映像の見やすさが変化します。周辺環境が明るい場合はディスプレイの明るさを強くし、周辺環境が暗い場合はディスプレイの明るさを弱くすることで表示映像を見やすくすることができます。
ディスプレイの明るさを調整するには、Windows標準のCOMポートアクセスAPIであるSystem.IO.Ports.SerialPortを使用し、専用のコマンド”setbright xx” (xxは0~20を指定)を実行してください。ディスプレイの明るさは、0~20の21段階で調整可能です。ディスプレイの明るさ調整モードを自動モードに設定するには、専用のコマンド”setbright 50”を実行してください。ディスプレイの明るさ調整モードが自動モードの場合に、専用コマンド”setbright xx” (xxは0~20を指定)を実行した場合は、明るさ調整モードが手動モードに切り替わります。
また、現在のディスプレイの明るさを取得するには、専用のコマンド”getbright”を実行してください。ディスプレイの明るさ調整モードが手動モードの場合はコマンドが0~20を返却し、自動モードの場合はコマンドが50を返却します。
調整できるディスプレイの明るさの範囲は、ディスプレイの明るさの範囲を参照してください。

2D/3D表示モードの切り替え

Moverioのディスプレイは、Side-by-Side方式の3Dコンテンツの表示に対応しています。Moverioで表示する映像がSide-by-Side方式の3Dコンテンツの場合でアプリから制御する場合は、Windows標準のCOMポートアクセスAPIであるSystem.IO.Ports.SerialPortを使用し、専用のコマンド”set2d3d 0”(2D表示モード)、
または、専用のコマンド”set2d3d 1”(3D表示モード)を実行してください。System.IO.Ports.SerialPortの使い方は、Microsoft社のSerialPortクラスのドキュメント(外部サイト)を参照してください。

Side-by-Side方式とは一つの画面に左右の画像を並べて格納する方式です。

Side-by-Side方式の映像を作成する場合は、映像の左半分と右半分に、それぞれ左目用映像と右目用映像を配置してください。

例えば、1280x720(HDサイズ)のSide-by-Side方式の映像を作成する場合は、下図のように左目用映像に640x720の映像を、右目用映像に640x720の映像を配置することでSide-by-Side方式の映像とすることができます。

ディスプレイの2D/3D表示モードの切り替えには、Windows標準のCOMポートアクセスAPIであるSystem.IO.Ports.SerialPortを使用し、専用のコマンド”set2d3d 0”(2D表示モード)、または、専用のコマンド”set2d3d 1”(3D表示モード)を実行してください。
また、現在のディスプレイの2D/3D表示モードを取得するには、専用のコマンド”get2d3d”を実行してください。ディスプレイの2D/3D表示モードが2D表示モードの場合はコマンドが0を返却し、3D表示モードの場合はコマンドが1を返却します。

ディスプレイの表示/非表示の設定

Moverioに表示されている映像を一時的に非表示にしたい場合は、Windows標準のCOMポートアクセスAPIであるSystem.IO.Ports.SerialPortを使用し、専用のコマンド”setmute 0”(ディスプレイ点灯)、または、専用のコマンド”setmute 1”(ディスプレイ消灯)を実行してください。

System.IO.Ports.SerialPortの使い方は、Microsoft社のSerialPortクラスのドキュメント(外部サイト)を参照してください。

ディスプレイの輻輳の調整

Moverioのディスプレイの表示距離を専用のコマンドで調整することができます。専用のコマンドは左右の表示映像を水平方向にシフトする機能があります。水平方向のシフト量に応じてディスプレイの輻輳を調整できます。

例えば、実際のオブジェクトがディスプレイの表示距離よりも近い位置にある場合は、下図のように左右の映像を内側にシフトします。
そうすることで、ディスプレイの仮想的な表示距離を近くにすることができます。

その他に、実際のオブジェクトがディスプレイの表示距離よりも遠い位置にある場合は、下図のように左右の映像を外側にシフトします。そうすることで、ディスプレイの仮想的な表示距離を遠くにすることができます。

ただし、この機能を利用することで左右の映像をシフトさせるため、左右の映像の端が途切れてしまいます。そのため、アプリケーションで映像のシフト量に応じた画面構成の配慮が必要になります。ディスプレイの仮想的な表示距離と映像のシフト量の関係性は、ディスプレイの仮想的な表示距離の調整の範囲と水平方向のシフト量を参照してください。

ディスプレイの仮想的な表示距離の調整には、Windows標準のCOMポートアクセスAPIであるSystem.IO.Ports.SerialPortを使用し、専用のコマンド”setdisplaydistance xx”(xxは画素シフト量を-32~256で指定)を実行してください。System.IO.Ports.SerialPortの使い方は、Microsoft社のSerialPortクラスのドキュメント(外部サイト)を参照してください。

専用コマンドで指定可能な画素シフト量は、ディスプレイの仮想的な表示距離の調整の範囲と水平方向のシフト量を参照してください。

また、現在の画素シフト量を取得するには、専用のコマンド”getdisplaydistance”を実行してください。

ディスプレイの自動スリープ設定

Moverioのディスプレイの自動スリープ設定を専用のコマンドで設定することができます。
ディスプレイの自動スリープ設定を有効化した場合は、Moverioを脱着して机上などに置くと、自動的にディスプレイを消灯します。また、Moverioを装着すると自動的にディスプレイを表示します。この機能を有効にすることで、Moverioを装着していない場合の消費電力を低減させることができます。
ディスプレイの自動スリープ設定には、Windows標準のCOMポートアクセスAPIであるSystem.IO.Ports.SerialPortを使用し、専用のコマンド”enableautosleep 0”(自動スリープOFF)、または、専用のコマンド”enableautosleep 1”(自動スリープON)を実行してください。
また、現在のディスプレイの仮想的な表示距離の調整値を取得するには、専用のコマンド”getautosleep”を実行してください。

ディスプレイのユーザースリープ設定

Moverioのディスプレイのユーザースリープ設定を専用のコマンドで設定することができます。
ディスプレイのユーザースリープ設定を有効化した場合は、Moverioの側面を軽くタップするとディスプレイを消灯します。また、再度Moverioの側面を軽くタップするとディスプレイを表示します。この機能は、Moverioの装着者が前面の映像を即座に消したい時などに利用できます。
ディスプレイのユーザースリープ設定には、Windows標準のCOMポートアクセスAPIであるSystem.IO.Ports.SerialPortを使用し、専用のコマンド”enableusersleep 0”(自動スリープOFF)、または、専用のコマンド”enableusersleep 1”(自動スリープON)を実行してください。System.IO.Ports.SerialPortの使い方は、Microsoft社のSerialPortクラスのドキュメント(外部サイト)を参照してください。
また、現在のディスプレイの仮想的な表示距離の調整値を取得するには、専用のコマンド”getusersleep”を実行してください。

シースルーを活かした映像の作り方

Moverioはシースルー型のディスプレイを搭載しており、Moverioの装着者は実空間で見えている景色を見ながら表示される映像を重ね合わせてみることができます。実空間で見えている景色にMoverioで表示したいオブジェクトの映像を重ね合わせて見る場合は、表示したいオブジェクトの背景を黒にすることで、シースルーを活かした映像を作ることができます。

3.3. センサー制御の概要(for Windows)

Moverioは動き、向き、環境を検知する様々なセンサーをヘッドセットに搭載しています。Windowsデスクトップアプリでのセンサー制御は、標準のセンサー制御APIであるSensor APIを使用します。センサーデータを使用することで、装着者の頭の動きを推測したり、周辺環境の明るさを推測したりできます。

関連する情報を参照してください。
センサーの種類
センサーの軸
Sensor APIについて(外部サイト)
センサー制御機能の機種対応表
APIリファレンス(外部サイト)
サンプルコード(外部サイト)

センサーの種類

Moverioは様々な種類のセンサーを搭載しています。センサーの中には、ハードウェアベースのセンサーとソフトウェアベースのセンサーがあります。ハードウェアベースのセンサーには、加速度、地磁気、角速度、環境照度などがあります。ソフトウェアベースのセンサーは、単体もしくは複数のハードウェアベースのセンサーの出力値を使用した仮想のセンサーです。ソフトウェアベースのセンサーには、回転ベクトルや重力などの推測が可能なものがあります。

センサー 種類 説明 使用例
SENSOR_TYPE_ACCELEROMETER_3D ハードウェア 重力を含むMoverioの加速度を3軸(x、y、z)の加速度[G]で測定します。 モーション検知(傾きなど)
SENSOR_TYPE_COMPASS_3D ハードウェア 周囲の地磁気を3軸(x、y、z)の地磁気[mG]で測定します。 方位検知
SENSOR_TYPE_GYROMETER_3D ハードウェア Moverioの角速度を3軸(x、y、z)の角速度[deg/s]で測定します。 モーション検知(回転など)
SENSOR_TYPE_AMBIENT_LIGHT ハードウェア 周囲の照度[lx]を測定します。 周囲の照度に合わせたディスプレイの明るさ調整
GUID_SensorType_GravityVector ソフトウェア 重力を3軸(x、y、z)の加速度[G]で測定します。 モーション検知(傾きなど)
GUID_SensorType_LinearAccelerometer ソフトウェア 重力を除いた3軸(x、y、z)の加速度[G]で測定します。 タップ、歩行の検出などへの応用
GUID_SensorType_RelativeOrientation ソフトウェア Moverioの向きを、地磁気を使用しないクォータニオンで測定します。 ヘッドトラッキングなど
SENSOR_TYPE_AGGREGATED_DEVICE_ORIENTATION ソフトウェア Moverioの向きをクォータニオンで測定します。 ヘッドトラッキングなど
SENSOR_TYPE_CUSTOM (0)*1 ハードウェア 重力を含むMoverioの加速度を未校正の3軸(x、y、z)の加速度[G]と推定バイアス補償の3軸(x_bias, y_bias, z_bias)で測定します。 モーション検知(傾きなど)、ヘッドトラッキングへの応用
SENSOR_TYPE_CUSTOM (1)*1 ハードウェア Moverioの角速度を未校正の3軸(x、y、z)の角速度[deg/s]と推定ドリフトの3軸(x_bias, y_bias, z_bias)で測定します。 モーション検知(回転など)、ヘッドトラッキングへの応用
SENSOR_TYPE_CUSTOM (2)*1 ハードウェア 周囲の地磁気を未校正の3軸(x、y、z)の地磁気[mG]と校正情報の3軸(x_bias, y_bias, z_bias)で測定します。 方位検知、ヘッドトラッキングへの応用
SENSOR_TYPE_CUSTOM (3)*1 ソフトウェア Moverioの静止/動作を検知します。 ヘッドセット着脱検知など
SENSOR_TYPE_CUSTOM (4)*1 ソフトウェア ヘッドセットのタップを検知します。 ヘッドセットタップ検知

*1 SENSOR_TYPE_CUSTOMの場合は、SENSOR_DATA_TYPE_CUSTOM_USAGEの数値と上表の括弧内の数値で照らし合わせて判別。

下記のサイトで詳細な情報を確認してください。

https://docs.microsoft.com/en-us/windows/desktop/sensorsapi/sensor-categories--types--and-datafields

https://docs.microsoft.com/en-us/windows-hardware/drivers/sensors/sensor-types

センサーの軸

Moverioのセンサーは、加速度センサーとそれ以外のセンサーで座標系が異なります。Moverioを装着した場合、加速度センサーのX軸は左方向を指し、Y軸は下方向を指し、Z軸は装着者の視線方向を指します。加速度センサー以外のX軸は右方向を指し、Y軸は上方向を指し、Z軸は装着者の方向を指します。

ヘッドセット(加速度センサーの場合)
ヘッドセット(加速度センサー以外)

3.4. カメラ制御の概要(for Windows)

Moverioは通常の撮影やマーカー認識などの用途で使うためにカメラをヘッドセットに搭載しています。Windowsデスクトップアプリでのカメラ制御は、Windows標準のカメラ制御APIであるMicrosoft Media Foundationを使用します。このAPIでは、動画撮影やプレビューの表示などができます。

関連する情報を参照してください。
Microsoft Media Foundationについて(外部サイト)
カメラ制御機能の機種対応表
APIリファレンス(外部サイト)
サンプルコード(外部サイト)

3.5. Windows audio control

Moverioは音源の聴取や音声通話などの用途で使うためにCTIA準拠のイヤホン・マイクを接続できます。Windowsデスクトップアプリでのオーディオ制御するためには、Windows標準のオーディオ制御APIであるCore Audio APIsを使用します。このAPIでは、音源のイヤホン出力や音声のマイク入力、イヤホン・マイクの各種パラメータ設定などができます。

関連する情報を参照してください。
Core Audio APIsについて(外部サイト)
音源のイヤホン出力
音声のマイク入力
各種パラメータ設定
ミュート設定
オーディオ制御機能の機種対応表
APIリファレンス(外部サイト)

音源のイヤホン出力

Moverioは、Core Audio APIsを利用して接続されたイヤホンから音源を聴取することができます。下記のサイトで詳細な情報を確認してください。
https://docs.microsoft.com/ja-jp/windows/win32/coreaudio/rendersharedeventdriven

音声のマイク入力

Moverioは、Core Audio APIsを利用して接続されたマイクから音声を入力することができます。下記のサイトで詳細な情報を確認してください。
https://docs.microsoft.com/ja-jp/windows/win32/coreaudio/capturesharedeventdriven

各種パラメータ設定

Moverioは、Core Audio APIsを利用して接続されたイヤホン・マイクの各種パラメータの設定が可能です。下記のサイトで詳細な情報を確認してください。
https://docs.microsoft.com/ja-jp/windows/win32/coreaudio/programming-guide

ミュート設定

Moverioは、Core Audio APIsを利用してイヤホン出力やマイク入力を一時的に停止(ミュート設定)することが可能です。下記のサイトで詳細な情報を確認してください。
https://docs.microsoft.com/ja-jp/windows/win32/api/audiopolicy/nf-audiopolicy-iaudiosessionevents-onsimplevolumechanged

3.6. デバイス管理の概要(for Windows)

Moverioは、ホスト機器とのディスプレイの表示開始、各種デバイスの温度異常などのMoverioを利用する上で重要なシステム状態の変化を監視することができます。また、Moverioの機器固有の情報を使用できます。システム状態の変化を監視することで、アプリケーションでデバイスが高温になったことを検知してユーザーへ通知することができます。そして、機器固有の情報を使用することで、アプリケーションで特定のMoverioのみを動作させる機器認証の仕組みを導入することができます。

関連する情報を参照してください。
Moverioのモデル判別
システム状態の変化の監視
機器固有の情報の取得
デバイス管理機能の機種対応表
Windows用コマンドリファレンス
System.IO.Ports.SerialPortクラス(外部サイト)

Moverioのモデル判別

USB Property BT-35E/30E BT-30C BT-40 BT-45C
Vendor ID VID_0483 VID_04B8 VID_04B8 VID_04B8
Product ID PID_5750 PID_0C0C PID_0D12 PID_0C0E

Windows端末に接続されたMoverioのUSB CDC情報を取得するためには、.NET APIのManagementClassクラスを使用します。このクラスのインスタンス生成時に"Win32_SerialPort"を指定し、ポートごとに"PNPDeviceID"の情報を取得し、上表と照らし合わせてモデルを判別します。

ManagementClass mcW32SerPort = new ManagementClass("Win32_SerialPort");
foreach (ManagementObject port in mcW32SerPort.GetInstances()) {
    string pnpDeviceId = (string)port.GetPropertyValue("PNPDeviceID");
    if (pnpDeviceId.Contains("VID_0483") && pnpDeviceId.Contains("PID_5750")) {
        Console.WriteLine("BT-35E/30E detected.");
    }
    else if (pnpDeviceId.Contains("VID_04B8") && pnpDeviceId.Contains("PID_0C0C")) {
        Console.WriteLine("BT-30C detected.");
    }
    else if (pnpDeviceId.Contains("VID_04B8") && pnpDeviceId.Contains("PID_0D12")) {
            Console.WriteLine("BT-40 detected.");
    } 
    else if (pnpDeviceId.Contains("VID_04B8") && pnpDeviceId.Contains("PID_0C0E")) {
        Console.WriteLine("BT-45C detected.");
    } 
    else {
        Console.WriteLine("Unknown device");
    }
}

下記のサイトでManagementClassクラスの詳細な情報を確認してください。
https://docs.microsoft.com/ja-jp/dotnet/api/system.management.managementclass?view=dotnet-plat-ext-3.1

システム状態の変化の監視

Windowsでは、ディスプレイの表示開始、各種デバイスの温度異常などのMoverioを利用する上で重要なシステム状態の変化を監視することができます。システム状態の変化を監視することで、アプリケーションでデバイスが高温になったことを検知してユーザーへ通知することができます。
システム状態の変化を監視する場合は、Windows標準のCOMポートアクセスAPIであるSystem.IO.Ports.SerialPortを使用し、専用のコマンド”getsystemstat”(システム状態取得)を実行してください。System.IO.Ports.SerialPortの使い方は、Microsoft社のSerialPortクラスのドキュメント(外部サイト)を参照してください。

専用のコマンドの実行結果は、下表の通りです。

戻り値 説明
0 電源OFF
1 Moverioのシステムを初期化している状態
2 ホスト機器から映像出力がない状態
3 映像表示中
4 ディスプレイ消灯
5 リカバリー状態
※静電気の発生などによりディスプレイ消灯が発生した場合の自動復帰機能の動作状態

機器固有の情報の取得

Moverioはヘッドセットシリアル番号の情報を使用できます。機器固有の情報を使用することで、アプリケーションで特定のMoverioのみを動作させる機器認証の仕組みを導入することができます。
機器固有の情報の取得には、Windows標準のCOMポートアクセスAPIであるSystem.IO.Ports.SerialPortを使用し、専用のコマンド”gethserial”(ヘッドセットシリアル番号取得)を実行してください。System.IO.Ports.SerialPortの使い方は、Microsoft社のSerialPortクラスのドキュメント(外部サイト)を参照してください。

Go to Top