WSL2でUSBカメラを使う – 前編

WSL2でUSBカメラを使う 前編 WSL
スポンサーリンク

前回はWSL+VS Codeという環境でOpenCVのプログラミングをしてみました。

前回の例では静止画ファイルを読み込み表示しましたが、OpenCVを使うならカメラを利用したくなるものです。

そこで今回はWSL2でUSBカメラを利用してみたいと思います。長くなりそうなので前編と後編の2部構成となります。

前編ではWSL2でUSBデバイスを認識できる子とまで進めたいと思います。

スポンサーリンク

環境

今回はWindows 11にWSL2を利用して導入したUbuntu 20.04LTSを利用します。

UbuntuをWindows 11上で動かす その1: 準備とインストール
今回はWindows Subsystem for Linux (WSL2)を使ってWindows11にUbuntuをインストールしてみます。WSLを利用するためには以前は複数のステップが必要でしたが、ついにwslコマンド一発で導入できるようになりました。WSLを使う敷居がますます低くなったように感じます。

また、WSLのLinuxカーネルは更新して「5.10.102.1」となっています。

UbuntuをWindows11上で動かす その7: WSLのLinuxカーネルをアップデートする
今回はWSLのLinuxカーネルをアップデートする方法を紹介します。Linux kernelは不具合修正でどんどん更新されていくので、パッチレベルが高いものを使った方が安心です。デフォルトだとWSLのLinuxカーネルは更新されないので、定期的にwslコマンドで手動更新するか、Windows Updateの設定を変えて自動配信されるようにしておいたほうが良さそうです。

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形式ファイル(インストーラ)をダウンロードしましょう。

Releases · dorssel/usbipd-win
Windows software for sharing locally connected USB devices to other machines, including Hyper-V guests and WSL 2. - dorssel/usbipd-win

私が試したときには「2.2.0」が最新でした。

USBIPD-WIN

ダウンロードしたファイルをダブルクリックすればインスートールすることができます。

インストールの確認

ダウンロードしたUSBIPD-WINのインストールが完了したら正常に動いているかどうかを確認してみましょう。

「Windowsアイコンを右クリック」→「コンピュータの管理」を選択し、「サービスとアプリケーション」から「サービス」を選択してみましょう。

USBIPD-WINにより導入されたサービス

表示されるサービスに「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上では次のように認識されています。

Windows上で認識されたUSBカメラ

準備が整ったら管理者モードでPowerShell (あるいはWindows Terminal)を開きます。これは「Windowsアイコンを右クリック」→「PowerShell (管理者)」あるいは「Windows Terminal (管理者)」を選択します。

PowerShell(あるいはWindows Terminal)が開いたら次のコマンドを入力します。

usbipd wsl list

これでWindowsに接続されているUSBデバイスの一覧が表示されます。私の場合は次のようになりました。

usbipd wsl listの結果

この中でWSLで利用したいデバイス(USBカメラ)を探し、その「BUSID」を覚えておきます。私の場合は「5-6」になります。

つづいて次のコマンドを入力します。

usbipd wsl attach --busid 5-6

最後に「5-6」の場合は先ほど調べたBUSIDですので、適宜変更してください。

私の場合はこれを実行すると「ファイルシステムの1つをマウント中にエラーが発せしました。詳細については、『dmesg』を実行してください。」というメッセージが出ましたが気にしなくても良さそうです。

アタッチした際のメッセージ

ここまできたら次はUbuntuでの確認です。Ubuntuで次のコマンドを実行してみましょう。先ほどアタッチしたデバイスが表示されれば成功です。

$ lsusb

私の場合は次のようになりました。

lsusbの結果

ちゃんと「Microsoft LifeCam HD-3000」がWSL2のUbuntu上で認識されています。

ちなみにdmesgの方は次のようになっていました。

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カメラを使えるようにしたいと思います。

コメント

タイトルとURLをコピーしました