Surface Book で Kinect v2 が認識されない

ある時の Windows Update 以降、
Surface Book に Kinect v2 (Xbox One Kinect センサー) を USB で接続しても認識されなくなりました。

Kinect Sensor is not recognized on a Surface Book によると、
「Surface USB Hub Firmware Update driver」の変更が原因であるとしています。

また、この記事には回避策が載っています。以下ではその手順を実行した様子について書いていきます。
ただし、「問題調査中」とあり、これは一時的な措置のように見えます。

 

手順

[regedit] を実行してレジストリ エディターを起動します。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36fc9e60-c465-11cf-8056-444553540000}

に移動します。

Kinect-v2-Firmware-1

[LowerFilters] をダブルクリックします。値の編集画面が現れます。
元の値は「SurfaceUsbHubFwUpdate」です。これを削除して空文字列にします。

Kinect-v2-Firmware-2

Kinect-v2-Firmware-3

[OK] をクリックすれば完了です。

Kinect-v2-Firmware-4

すぐに認識しない場合は、PC を再起動したり Kinect v2 の電源を入れ直せば認識されるはずです。

参照
Kinect Sensor is not recognized on a Surface Book

カテゴリー: 周辺機器. タグ: , . Leave a Comment »

スティック PC をリモートで操作できるようにする

マウスコンピューターのスティック PC「MS-NH1-W10」を購入直後にセットアップしたときのメモです。
他の PC からリモートで接続できるように設定するところまでです。

スティックPC MS-NH1-W10
スティックPC MS-NH1-W10

搭載されている OS は Windows 10 Home です。
初回は USB 接続のキーボードまたはマウスが必要になります。ここではマウスのみで操作してみます。

 

OS 初期設定まで

初めて電源をオンにすると、OS の初期設定が始まります。

  • スティック PC 本体を電源、マウス、ディスプレイと接続する
  • 電源をオンにする
  • ネットワーク設定はスキップでよい
  • ユーザー名を入力する
    • 以降はパスワードの入力なしで OS を起動させるため、パスワードは設定しない
    • 入力にはスクリーン キーボードを利用

 

OS 起動後

OS が起動したら、まずは次のようなスクリーン キーボードを使えるようにします。

スクリーン キーボード

スクリーン キーボードを起動するには、[設定] → [簡単操作] → [キーボード] の画面で設定するか、
スタート メニューの [Windows 簡単操作] から選択します。

1-Keyboard-Settings

1-Keyboard-Start

 

スクリーン キーボードを使えるようになったら、コンピューター名 (PC 名) を変更して再起動します。

2-ComputerName

 

リモート接続

Windows 10 Home では、OS 標準のリモート デスクトップ接続を利用できません。
そこで、TeamViewer などを利用してリモート接続できるようにします。

  • ネットワークに接続 (ワイヤレス LAN)
  • TeamViewer を検索してダウンロード
  • TeamViewer をインストールしてリモート接続設定

以上の設定ができれば、このスティック PC に他の PC からリモート接続できるようになり、
これ以降、USB 接続のマウスは不要となります。

Leap Motion v1 が自動でアップグレードされないようにする

Leap Motion Controller のソフトウェアは、v2 よりも v1 のほうがトラッキングの精度自体は高いため、
v1 を利用したいケースも依然としてあります。

Leap Motion v1 の実行環境をセットアップするには、
Leap Motion のセットアップで書いた通りインストーラーを実行したあと、
コントロール パネルを開いて [最新版を自動的にインストール] のチェックをオフに設定します。

Leap-v1-ControlPanel

この設定変更をしないと、しばらく経つと自動的に v2 のインストーラーをダウンロードしてアップグレードしてしまいます。

問題はここからです。
v2 にアップグレードしてしまったとしても「v2 アンインストール& v1 再インストール」でやり直せると思いきや、
なんと v1 を再インストールした直後に間髪入れずに v2 にアップグレードされてしまいます。

これはどうやら、最初に v2 にアップグレードしたときに使用したインストーラーが
    C:\Windows\Temp\leap
に残っていることが原因のようです。

Leap 2.3.1 Installer

このインストーラーを削除してから v1 のインストーラーを再実行すれば解決します。

// 他にも、ユーザー フォルダーの「AppData\Local\Temp\~nsu.tmp」フォルダーに .exe ファイルが残ってたりしますが、
// こちらは直接影響しないようです。

 

2018.02.03 追記:
Windows 10 Fall Creators Update が適用されてから、Leap Motion Controller を USB で接続しても認識されなくなりました。
既定のドライバーでは動作しないようです。
Leap Motion のインストール フォルダーにある次のドライバーを追加でインストールすることで解決しました (64 ビットの場合)。
    C:\Program Files (x86)\Leap Motion\Core Services\Drivers\dpinst64.exe

 

参照
Leap Motion のセットアップ
Leap Motion driver broken on Windows Fall Creators Update

カテゴリー: 周辺機器. タグ: , . 1 Comment »

Leap Motion で手の回転状態を取得する

Leap Motion Controller の公式 SDK では、手の回転の状態をオイラー角で取得できるようになっています。
具体的には、Hand.Direction (Vector オブジェクト) の Yaw, Pitch, Roll プロパティが用意されています。
ただし、Hand クラスの説明を参照すると、 ロールについては Direction.Roll ではなく PalmNormal.Roll を使うように書かれています。

float pitch = hand.Direction.Pitch;
float yaw = hand.Direction.Yaw;
float roll = hand.PalmNormal.Roll;

しかし、これらの値を使って実装してみても、期待通りの動作にはなりません。

そこで、前回の 3D における回転の表現と相互変換の内容をもとに、手の回転の状態を取得する機能を自作しました。

Hand.Direction と Hand.PalmNormal はともに長さ 1 で直交しているため、
これらをそれぞれ (0, 0, -1) と (0, -1, 0) の回転後のベクトルと見なして、
前回作成した Rotation3DHelper クラスを利用してオイラー角を求めれば OK です。

全体のソースコードは HandRotationLeap (GitHub) にあります。
このサンプルでは、手とさいころの回転の状態を同期させています。

Hand Rotation by Leap Motion Controller

前回: 3D における回転の表現と相互変換

バージョン情報
.NET Framework 4.5
Leap Motion SDK 2.3.1

参照
Hand クラス

Kinect for Windows v1 の KinectInteraction

Kinect for Windows Developer Toolkit には、KinectInteraction という、
つまむ操作 (Grip) や押す操作 (Press) を判定するためのライブラリが含まれています。
今回は、KinectInteraction でこれらのジェスチャ認識を実装するための方法について説明します。
Kinect for Windows のバージョンは 1.8 とします。

Kinect for Windows Developer Toolkit に付属するサンプルの中にある「ControlsBasics-WPF」では、
Microsoft.Kinect.Toolkit.Controls プロジェクトの中で UI コントロールまで作り込まれていますが、
ここでは KinectInteraction を単独で利用してみます。

KinectInteraction を利用するには、次の DLL が必要になります。

  • Microsoft.Kinect.dll
  • Microsoft.Kinect.Toolkit.Interaction.dll
  • KinectInteraction180_32.dll (ネイティブ、32 ビット向け)
  • KinectInteraction180_64.dll (ネイティブ、64 ビット向け)

ちなみに、Microsoft.Kinect.Toolkit.dll は KinectInteraction とは直接には関係がないため不要です。

 

■ プロジェクトの作成と参照の追加

Visual Studio で、WPF アプリケーション プロジェクトを作成します。
既定では [プラットフォーム ターゲット] が Any CPU、[32 ビットの優先] がオンに設定されています。
この設定のままであれば、32 ビット用の DLL を利用します。

64 ビットで動作させたい場合は、
[プラットフォーム ターゲット] を x64 に設定するか、[32 ビットの優先] をオフに設定して、
64 ビット用の DLL を利用します。

.NET の DLL への参照は、[参照の追加] から 1 つずつ追加してもよいのですが、
なるべく環境変数を利用したいので、プロジェクト ファイル (.csproj) を直接編集します。
次のように、Kinect に関連する部分を ItemGroup に追加します。


<Reference Include="Microsoft.Kinect">
  <HintPath>$(KINECTSDK10_DIR)Assemblies\Microsoft.Kinect.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Kinect.Toolkit.Interaction">
  <HintPath>$(KINECT_TOOLKIT_DIR)Redist\Microsoft.Kinect.Toolkit.Interaction.dll</HintPath>
</Reference>


次に、ネイティブの DLL をビルド時にコピーさせるための設定です。
プロジェクト ファイルの下のほうに、次の ItemGroup を追加します。


<ItemGroup>
  <Content Include="$(KINECT_TOOLKIT_DIR)Redist\x86\KinectInteraction180_32.dll">
    <Link>KinectInteraction180_32.dll</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>


 

プロジェクトのプロパティ

 

■ 実装について

今回は、取得できるプロパティの値の一覧を表示するアプリケーションを実装します。
次のコードはその一部です (全体のソースコードは KinectInteraction (GitHub) にあります)。

InteractionStream のコンストラクターには、IInteractionClient オブジェクトを渡す必要があります。
IInteractionClient インターフェイスの実装については公式ドキュメントも存在しないようで、詳細は不明です。
ここでは、とくに何の処理もしない DummyClient クラスを用意しています。
(サンプルの「ControlsBasics-WPF」には、 IInteractionClient インターフェイスを実装した KinectAdapter クラスが存在します。)

InteractionStream クラスは、DepthImageStream と SkeletonStream を拡張したクラスとなっており、
AllFramesReady イベント ハンドラーでそれぞれのデータを InteractionStream に渡します。
すると、InteractionFrameReady イベントで UserInfo のコレクションを取得できます。
最大で 2 人まで同時に認識できるようです。

次の図は、アプリケーションを実行した結果です。

InteractionWpf

表示されているのは、主に InteractionHandPointer クラスのプロパティの値です。
IsInteractive が true となるには、それぞれの手が有効な範囲に入る必要があります。
有効な範囲とは、左手であれば左肩周辺、右手であれば右肩周辺です。
この領域の左上が (X, Y) = (0, 0)、右下が (X, Y) = (1, 1) となります。

IsTracked は有効な範囲に入っていなくても true になることがあります。
IsInteractive は、IsTracked かつ (X ,Y) が (0, 0) から (1, 1) までの四角形の範囲に入っている状態です。

座標を取得するためのプロパティとして、X, Y, PressExtent, RawX, RawY, RawZ があります。
X, Y と RawX, RawY はそれぞれ同じ値のようです。
PressExtent ≧ 1 のとき、IsPressed が true となります。
PressExtent は、下限値が 0 で、1 より大きい値にもなります。

有効な範囲が高い位置にあるため、少し下の位置で使えるようにしたいとは思うのですが、
とくに PressExtent と RawZ は、有効な範囲にないときの値はあまり信用できません。
このためか、IsInteractive でないときも IsPressed になることがあるため注意が必要です。
したがって、ジェスチャを判定するときは先に IsInteractive が true であることを確認しましょう。

 

作成したサンプル
KinectInteraction (GitHub)

バージョン情報
.NET Framework 4.5
Kinect for Windows SDK 1.8

参照
KinectInteraction
Microsoft.Kinect.Toolkit.Interaction Namespace

Kinect for Windows SDK のセットアップ

カテゴリー: 周辺機器. タグ: . Leave a Comment »