一覧に戻る

EPSON スマートグラス向けのキャリブレーション

2018.02.07Epsonスマートグラス

EPSON スマートグラス向けのキャリブレーション

このトピックでは、EPSON スマートグラス向けのキャリブレーションについて説明します。

キャリブレーション

Wikitude SDKでは、ユーザーのニーズに応じて各デバイスを較正するためのキャリブレーションの仕組みが提供されています。各デバイスにはカメラの配置によって差があり、また各ユーザーによってデバイスを見る方法が異なるので、Wikitudeでは各デバイスに対してキャリブレーションを行う簡単な処理が含まれています。キャリブレーション処理は簡単で、最良のキャリブレーションを識別するためにコンピュータビジョンのアルゴリズムを使用します。プロファイルはデバイス上に永続的に保存できます。このトピックでは、キャリブレーション処理と、独自のアプリにキャリブレーションを含めてCI/CDと整列する場合のプロセス全体をカスタマイズする方法を説明します。

キャリブレーション処理

最初にデバイスでArchitectViewを実行する際にWikitude SDKはキャリブレーションプロファイルがあるかどうかを確認します。キャリブレーションプロファイルが検出された場合は直ちに使用されます。あるいは、キャリブレーション処理が開始され、ユーザーが独自のデバイスに対してキャリブレーションを行いたい場合は処理が説明されます。

キャリブレーション処理は、以下の手順で行います。

  1. 近い距離で左目のキャリブレーション
  2. 近い距離で右目のキャリブレーション
  3. 遠い距離で左目のキャリブレーション
  4. 遠い距離で右目のキャリブレーション
  5. キャリブレーション結果の検証

前提条件

  • 印刷された画像:A4(PDF A4)またはUSレター(PDF US-letter)サイズで、100% スケールのキャリブレーション画像を印刷する必要があります。そうしなければ、キャリブレーション結果が正しく出力されません。印刷された画像の高さは189ミリメートル/ 7.44インチであることを確認してください。
  • 良好な結果を得るためには、明るい部屋の壁に印刷したキャリブレーション用のターゲット画像を置きます。ターゲット画像の中心が目と同じ高さである必要があります。
  • 目を切り替えるときはキャリブレーション用のターゲット画像をまっすぐに見て、頭を回転させずに、下の図のように横に移動してください。

手順1~4

キャリブレーション用の目、キャリブレーションボックスのサイズ(キャリブレーション用のターゲット画像までの距離)の違いだけで、以下の手順は前述したキャリブレーション処理の1~4の手順に適用することができます。

  • ディスプレイに表示される指示をお読みください。
  • 指定された目を閉じて、印刷したキャリブレーション用のターゲット画像とボックスの位置を合わせます。
  • 緑色のボックスはキャリブレーション用のターゲット画像が認識されたことを表します。ボックスが赤色の場合はボックスをターゲット画像の近くに移動して緑色になるように調整します。
  • ボックスが緑色の場合は、どこかをクリックして1.5秒くらい待ちます。キャリブレーションが実行されていることを示すプログレスバーが画面上に表示されます。処理中はできるだけボックスの位置を動かさずに保持します。
  • 上記の手順を実行した後、次の手順のために指示が表示されます。

    ターゲット画像が認識されないときのキャリブレーションボックス


    ターゲット画像が認識されたときのキャリブレーションボックス

手順5

ボックスを4回合わせた後、キャリブレーションプロファイルを検証するためにキャリブレーションターゲットの周囲に長方形が表示されます。キャリブレーションが正しく行われた場合は、[続行]ボタンを押してプロファイルを保存します。適切にキャリブレーションができなかった場合は、キャリブレーション処理をもう一度行うことができます。


キャリブレーションの検証

カスタマイズ

キャリブレーションをカスタマイズする方法は以下の通りです。

  • キャリブレーションストレージパス
  • キャリブレーション体験
  • ターゲット画像
  • キャリブレーションの遠近の距離
  • キャリブレーションを行う目の順序
  • それぞれの目に対してキャリブレーションを行う時間
  • 検証の拡張
  • キャリブレーションのリセット

キャリブレーションストレージパス

キャリブレーションプロファイルは、デフォルトでexternal-storage/Wikitude/calibration.jsファイルに格納されます。Wikitude SDKはこのパスを検索するので、Wikitude SDKを使用する他のアプリはこのプロファイルを使用できます。このパスを変更する場合は他のアプリはプロファイルを使用できないので、architectView.onPostCreate()を呼び出してデフォルトのキャリブレーションストレージパスを使用することをお勧めします。これを変更するには、ActivityのonPostCreateメソッドにarchitectView.onPostCreate('path to calibration')を設定します。

キャリブレーション体験

キャリブレーションをカスタマイズするには、自身のAR体験を作成する必要があります。カスタムキャリブレーション体験のためには最初にAR.CalibrationTrackerとAR.ImageTrackableが必要となります。最後の検証手順では画像の拡張が使用されます。

this.resource= new AR.TargetCollectionResource("assets/calibration.wtc");
this.calibrationTracker = new AR.CalibrationTracker(resource);
var i = new AR.ImageResource("assets/verification.png");
var id = new AR.ImageDrawable(i, 1, {
    enabled: false
});

this.imageDrawable = id;

var obj = new AR.ImageTrackable(this.calibrationTracker, "*", {
    drawables: {
        cam: [this.imageDrawable]
    },
    onImageLost: this.calibrationDisallowed,
    onImageRecognized: this.calibrationAllowed
});

ターゲット画像がトラッキングされたら、キャリブレーションを行うことができるかどうかを決定するためにonImageLostとonImageRecognizedメソッドを使用します。

calibrationAllowed: function() {
    this.isAllowed = true;
},
calibrationDisallowed: function() {
    this.isAllowed = false;
    this.lostTracking = true;
},

好みのキャリブレーションボックスのレイアウトを選択できますが、アスペクト比は4:3にする必要があります。キャリブレーションボックスはそれぞれの目に対して大きくまたは小さく表示されます。デフォルトのキャリブレーションボックスは赤と緑の境界線を表示するシンプルなdiv要素です。ターゲット画像とボックスが重なったことを確認した場合はcalibrationTracker.calibrateGlasses('current eye', 'calibration box height')を呼び出す必要があります。「current eye」は、必ず以下のいずれかになります。

  • calibrationTracker.Step.LEFT_NEAR
  • calibrationTracker.Step.LEFT_FAR
  • calibrationTracker.Step.RIGHT_NEAR
  • calibrationTracker.Step.RIGHT_FAR

現在の目のキャリブレーションを終了するために指定時間後に(例えばデフォルトのキャリブレーション体験では1.5秒)calibrationTracker.stopCalibration()を呼び出す必要があります。

if (this.isAllowed == true) {
    this.calibrationTracker.calibrateGlasses('current eye', 'calibration box height')

    setTimeout(function() {
        if (this.lostTracking == true) {
            // Handle loss of tracking
        } else {
            this.calibrationTracker.stopCalibration()
            //call next step
        }
    }, 'time to calibrate in milliseconds');
}

近い距離と遠い距離で両方の目のキャリブレーション手順を行うと、calibrationTracker.finishCalibration()が呼び出され、検証のためにAR.ImageDrawableが表示されます。

this.calibrationTracker.finishCalibration();
this.imageDrawable.enabled = true;

キャリブレーションが正常に行われた場合は、その結果を保存するためにcalibrationTracker.exitCalibration()を呼び出します。キャリブレーションをやり直すには、上記の手順を再実行します。
キャリブレーション体験がある場合はarchitectView.onPostCreate()の前にarchitectView.setCalibrationWorldLocation('path to calibration experience')を呼び出してそのローケションをWikitude SDKに通知します。

ターゲット画像

ターゲット画像は、体験に含まれるwtcファイルに定義されます。新しいwtcファイルを作成するには、Wikitudeの「ターゲット管理」を使用します。独自のキャリブレーション画像を使用したい場合は画像をキャリブレーション体験に含めて呼び出す必要があります。

this.calibrationTracker = new AR.CalibrationTracker('your TargetCollectionResource or CloudRecognitionService', {
        physicalTargetImageHeights:  {
            'your target image name': 'target image height in mm'
        }
    }
);

ターゲット画像を変更する場合は画像のアスペクト比を4:3にして、物理的な高さをcalibrationTrackerに正しく設定する必要があります。高さを削除するとキャリブレーションは正しい結果が出ません。

キャリブレーションの遠近の距離

キャリブレーションの遠近の距離はキャリブレーションボックスのサイズによって設定できます。2つのボックスの間の差が大きくなると、キャリブレーションの遠近の距離も長くなります。

キャリブレーションを行う目の順序

calibrationTracker.calibrateGlasses('current eye', 'calibration box height')を4回呼び出すことで、キャリブレーション手順の順序を制御できます。

それぞれの目に対してキャリブレーションを行う時間

それぞれの目に対してキャリブレーション時間を設定することができますが、これはcalibrationTracker.calibrateGlasses('current eye', 'calibration box height')を呼び出す時間とcalibrationTracker.stopCalibration()を呼び出す時間の差になります。 

検証の拡張

検証の拡張を設定するには、画像に基づいて新しいAR.ImageResourceとAR.ImageDrawableを作成してAR.ImageTrackableに追加します。

var i = new AR.ImageResource('path to custom augmentation');
var id = new AR.ImageDrawable(i, 1, {
    enabled: false
});

var obj = new AR.ImageTrackable(this.calibrationTracker, "*", {
    drawables: {
        cam: id
    },
});

キャリブレーションのリセット

キャリブレーションをリセットするには、external-storage/Wikitude/calibration.jsまたはカスタムの場所から特定のファイルを削除します。また、リセットが成功したとき返すarchitectView.resetCalibration()を呼び出すことができます。