前回はWSL+VS Codeという環境でOpenCVのプログラミングをしてみました。
前回の例では静止画ファイルを読み込み表示しましたが、OpenCVを使うならカメラを利用したくなるものです。
そこで今回はWSL2でUSBカメラを利用してみたいと思います。長くなりそうなので前編と後編の2部構成となります。
前編ではWSL2でUSBデバイスを認識できる子とまで進めたいと思います。
環境
今回はWindows 11にWSL2を利用して導入したUbuntu 20.04LTSを利用します。
また、WSLのLinuxカーネルは更新して「5.10.102.1」となっています。
Ubuntuでuname -rの結果は次のようになります。
$ uname -r 5.10.102.1-microsoft-standard-WSL2
Microsoftの情報によるとWSL2でUSBを使う場合は下記の条件があるそうです。
- Windows 11 (ビルド22000以降)であること
- Linuxカーネルは5.10.60.1以上であること
- USBデバイスを利用したいLinuxディストリビューションがデフォルトになっていること
Windows10でもいろいろ頑張ればできるようですが、今回は紹介しません。
USBIPD-WINの導入
まずはWindows上での作業になります。
WSL2でUSBを利用するためには、USBのデータをネットワーク形式(IP)に変換するツールであるUSBIPD-WINをインストールする必要があります。
USBIPD-WINのインストール
USBIPD-WINプロジェクトのリリースページから最新のMSI形式ファイル(インストーラ)をダウンロードしましょう。
私が試したときには「2.2.0」が最新でした。
ダウンロードしたファイルをダブルクリックすればインスートールすることができます。
インストールの確認
ダウンロードしたUSBIPD-WINのインストールが完了したら正常に動いているかどうかを確認してみましょう。
「Windowsアイコンを右クリック」→「コンピュータの管理」を選択し、「サービスとアプリケーション」から「サービス」を選択してみましょう。
表示されるサービスに「USBIP Device Host」が存在し、状態が「実行中」になっていればOKです。
USBIPの導入
次はUbuntu上での作業になります。
ここではネットワーク(IP)経由でUSBデバイスの情報を受け取るUSBIPと呼ばれるツールを導入します。
$ sudo apt-get install linux-tools-5.4.0-77-generic hwdata $ sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20
これでUSBIPの導入は完了です。
USBデバイスをWSL2で検出する
最初に使用したいUSBデバイス(USBカメラ)をWindows PCに接続しておきましょう。またWSL2(Ubuntu)も起動して利用できる状態にしておきます。
USBカメラについては、今回は手持ちの「Microsoft LifeCam HD-3000」というWebカメラを利用しました
Windows上では次のように認識されています。
準備が整ったら管理者モードでPowerShell (あるいはWindows Terminal)を開きます。これは「Windowsアイコンを右クリック」→「PowerShell (管理者)」あるいは「Windows Terminal (管理者)」を選択します。
PowerShell(あるいはWindows Terminal)が開いたら次のコマンドを入力します。
usbipd wsl list
これでWindowsに接続されているUSBデバイスの一覧が表示されます。私の場合は次のようになりました。
この中でWSLで利用したいデバイス(USBカメラ)を探し、その「BUSID」を覚えておきます。私の場合は「5-6」になります。
つづいて次のコマンドを入力します。
usbipd wsl attach --busid 5-6
最後に「5-6」の場合は先ほど調べたBUSIDですので、適宜変更してください。
ここまできたら次はUbuntuでの確認です。Ubuntuで次のコマンドを実行してみましょう。先ほどアタッチしたデバイスが表示されれば成功です。
$ lsusb
私の場合は次のようになりました。
ちゃんと「Microsoft LifeCam HD-3000」がWSL2のUbuntu上で認識されています。
ちなみにdmesgの方は次のようになっていました。
usbipdコマンドでattachをしたときにエラーっぽいメッセージが出ましたが、これを見る限りは特にエラーは発生していないようです。
本来はこのようにUSBデバイスをWSL2のLinuxから認識できればそのデバイスを利用できるのですが、WSL2のLinuxにはUSBカメラのドライバが含まれていないため利用できません。
USBシリアルデバイスの場合はドライバが含まれているので、ここまでの手順で利用できるようになると思います。
USBデバイスの利用をやめる
WSL2上でUSBカメラが認識できていることを確認できたら、USBデバイスの利用を終了しておきましょう。
管理者モードのPowerShell (あるいはWindows Terminal)で次のコマンドを実行します。
usbipd wsl detach --busid 5-6
最後に「5-6」の場合は先ほど調べたBUSIDですので、適宜変更してください。
USBデバイスを物理的に取り外しても良いようです。
このようにデタッチしておかないと、このUSBデバイスをWindows上から使おうとしたときに不具合が発生する可能性があるので注意しましょう。
まとめ
今回はWSL2のUbuntuでUSBデバイスを認識できるようにしてみました。
WSL2は仮想マシンのようなものなので物理的なUSBポートは有りませんが、USBIPD-WINというツールを使うことでWindowsに接続されたUSBデバイスを認識することができます。
ただWSL2のLinux kernelにはUSBカメラのドライバが含まれていないため、USBカメラを使うにはもう一工夫必要です。
次回はWSL2のLinux kernelを変更してUSBカメラを使えるようにしたいと思います。
コメント