フィルタリングデータ (以前のバージョン)

データのスループットとバッテリー寿命を最適化するには、センサーデバイスでフィルター条件をデータ更新イベントに適用して、必要なときにのみ発生させる必要があります。 このフィルター処理により、(センサーのスループットが低下するため) CPU 使用率が低下し、電力消費量が少なくなります (センサーと CPU の両方)。

センサーデバイスのフィルター条件をサポートするふたつの値 (またはプロパティ) があります。 ひとつ目は現在のレポート間隔 (CRI) で、ふたつ目は変更感度 (CS) です。 これらのプロパティはどちらも、センサー Win32 アプリケーションで設定できます。

現在のレポート間隔は、意味のある変更が発生したときにクライアントが受け取るデータ更新の間の最小期間 (ミリ秒単位) です。 変更の感度は、意味のある変更を指定するために使用される値 (または割合) です。

そのため、気象ステーションアプリケーションでは、60,000 (1 分) の温度センサーの現在のレポート間隔 (CRI) を指定できます。 また、温度センサーには、変化感度値 (パーセンテージではなく) が必要です。 この温度センサーが摂氏を返し、変化の感度値の温度が 2.0 の場合、この特定のセンサーでは、要求されたレポート間隔にわたって温度が 2.0 度上昇または減少したときにのみ、データ更新イベントが発生します。

環境光センサー (ALS) は、変更感度をパーセンテージで指定する必要があるセンサーの例です。 たとえば、照度の変更感度値が 2.0 の場合、このセンサーは値をパーセンテージとして解釈し、LUX 値が 2% 低下または増加した場合にのみデータ更新イベントを発生させます。

次の表に、6 つの一般的なセンサー、それぞれに関連付けられているデータ、および対応する変更の感度を示します。

Sensor データ フィールド 感度値の変更
光センサー LUX ルクスの変化率
加速度計 Acceleration X Acceleration G-force
Acceleration Y Acceleration G-force
Acceleration Z Acceleration G-force
3D Gyrometer Angular Speed X Angular Speed (度/秒)
Angular Speed Y Angular Speed (度/秒)
Angular Speed Z Angular Speed (度/秒)
Compass Magnetic North Heading
True North Heading
Inclinometer Yaw
ピッチ
Roll
デバイスの向き 四元数 度の移動
回転マトリックス 度の移動

次の表に、望ましい現在のレポート間隔 (CRI) の既定値を示します。

センサーの種類 望ましい既定のレポート間隔
環境光 5000
加速度計 100
Gyrometer 100
Compass 100
Inclinometer 50
オリエンテーション 50

次の表に、望ましい変更感度 (CS) の既定値を示します。

センサーの種類 望ましい感度の既定値の変更
環境光 50
加速度計 0.02
Gyrometer 0.50
Compass 0.20
Inclinometer 0.50
オリエンテーション 0.50

傾斜計および方位センサーの感度の変更 (CS)

傾斜計と方位センサーの変更感度は、2 つの四元数の間の角度として計算する必要があります。 数学的に次のように表されます。

2*cos⁻1(dot product(q1, q2))

この計算により、デバイスの方向間での一貫性が確保されます。

有効な現在のレポート間隔 (CRI) と変更感度 (CS)

複数のアプリケーションで、特定のセンサーの現在のレポート間隔 (CRI) プロパティと Change Sensitivity (CS) プロパティの両方を設定できます。 要求されたプロパティが適用されるかどうかを判断するのは、ドライバーの責任です。 ドライバーによって設定されたプロパティは、有効な現在のレポート間隔 (E-CRI) と有効な変更感度 (E-CS) と呼ばれます。

クライアントアプリケーションの E-CRI と E-CS の設定

クライアントアプリケーションがセンサーへの接続を確立するたびに、ドライバーは E-CRI と E-CS の値を設定する必要があります。 これらの値は、クライアントコンテナーと呼ばれるものに格納されます。 次の表に、センサードライバーでサポートされる 6 つのメソッドを示し、ドライバーがクライアントコンテナーと E-CRI および E-CS プロパティで実行する必要がある操作を指定します。

関心のあるイベント イベントハンドラーアクティビティ
ISensorDriver::OnClientConnect クライアントコンテナーにクライアント項目を追加します。

必要に応じて既定の CRI と CS の値を読み取り、クライアントコンテナーに格納します
ISensorDriver::OnClientDisconnect クライアントコンテナーからクライアントを削除し、既存のクライアントに基づいて必要に応じて E-CRI と E-CS を設定します
ISensorDriver::OnClientSubscribeToEvents 対象のセンサーの「イベントのサブスクリブ」のフィールド ー (true に設定) を更新します。 センサーからのイベントレポートを有効にします。
ISensorDriver::OnClientUnSubscribeToEvents 対象のセンサーの「イベントのサブスクリブ」のフィールド ー (false に設定) を更新します。 サブスクライバーが存在しない場合は、デバイスからのイベントレポートをオフにします。
ISensorDriver::OnSetProperties CS または CRI プロパティが設定されている場合は、適切なクライアントのコンテナーフィールドを更新します。
IFileCallbackCleanup::OnCleanupFile クライアントがクラッシュしたか、応答を停止しました。 クライアントをクライアントコンテナーから削除する必要があります。

次の表は、4 つの接続されたクライアント アプリケーションを持つ 3D 加速度計のクライアントコンテナーを表しています。 これらのクライアントアプリのうち 2 つ (2 行目と 4 行目に対応) がイベントをサブスクライブしています。

クライアントファイルハンドル イベントをサブスクライブする CRI CS (X) CX (Y) CS (Z)
FF80A267 FALSE 50 0.001 0.001 0.001
FF802489 TRUE 70 0.02 0.02 0.02
FF80D345 FALSE 15 NULL NULL NULL
FF803287 TRUE 100 0.005 0.005 0.005

ドライバーは、接続されているクライアントのこのセットを評価した後、E-CRI と E-CS の次の値を選択します。

  • E-CRI: 70 ms
  • E-CS 値:(最小のしきい値を使用して単一の値に折りたたまれる可能性があります)
    • X:0.005
    • Y:0.005
    • Z: 0.005

イベントフィルター処理はそれらのクライアントには適用されないため、この例では、イベントシンクセット (1 行目と 3 行目) を持たないクライアントは無視されます。

有効な CRI 値と CS 値を評価してデータ更新イベントをフィルター処理する (E-CRI、E-CS)

現在の E-CRI と E-CS の値が決定され、センサー接続状態の変化に応じて更新されると、センサーデバイスはこれらの値を使用して、接続されたクライアントのアプリケーションに発生するイベントをフィルター処理します。 これらの値は、「現在の」データ値と以前のデータ値の差と比較されます。 E-CS 値が E-CRI 以上の期間に超えている場合は、データイベントを発生させる必要があります。 唯一の例外は、クライアントが適切な通知を受信できるように既定値が適用されている場合のセンサーデバイスの起動です。

次の図は、生のセンサーデータの時間フィルター処理を評価して、データイベントを発生させるタイミングを決定する方法を示しています。

Illustration of time-filtered sensor data.

前の図では、図の下部にある赤いデータは、生のセンサーデータを表しています。 緑色の線は、データをポーリングするクライアントに返されるデータを表し (この動作を実装する多くの方法のひとつ)、赤色の X 値はデータイベントが発生したときに表します。 青い線は、E-CS 境界のしきい値です (最後のデータ イベント値を基準とした +/- E-CS)。

このイベントのフィルタリングロジックを実装することで、更新されたデータイベントの数を大幅に減らすことができます。また、センサーデータに意味のある変更が発生しても、アプリケーションに通知を受け取ることができます。

データフィルター処理のためのデバイスランタイムの最適化

このセクションでは、センサードライバーを開発するときに考慮する必要があるいくつかのランタイム最適化について説明します。

割り込みをサポートします

ドライバーは、デバイスをポーリングする代わりに割り込みに依存する必要があります。 これにより、パフォーマンスと電源管理が向上します。 また、次の改善点があります。

  1. デバイスは、現在の変更の感度とレポート間隔に基づいて、より低い電力状態に入ることができます。
  2. 割り込みを使用すると、ドライバーとセンサーファームウェアの両方で不要なコード実行が減ります。
  3. 割り込みを使用すると、バスのアクティビティが減少します。

Note

ドライバーが割り込みに依存しているが、現在のレポート間隔と変更感度ロジックがドライバーに存在する場合、ドライバーは、データ更新プログラム間の割り込みの数が多くなる可能性があります。 その結果、ドライバーは、現在のレポート間隔の有効期限が切れるまで、割り込みを無効にする (またはマスクする) 必要があります。

変更感度のサポートのデバイスへの移動

センサーのハードウェアまたはファームウェアでしきい値検出がサポートされている場合は、この機能を使用して変更感度をサポートする必要があります。 サポートをデバイスに移動し、対応する割り込みに応答することで、ドライバーの処理オーバーヘッドを減らすことができます。

レポート間隔のサポートのデバイスへの移動

センサーハードウェアまたはファームウェアがレポート間隔の概念をサポートしている場合は、この機能を使用する必要があります。

センサーでネイティブレポート間隔のサポートが提供されない場合は、現在のレポート間隔のサブセットに対して割り込みを無効にすることを検討してください。 次に、この時間が経過したら、現在のデバイスデータを取得します。