🤪

WSL2 USBカメラ+他のUSB機器 2022年01月17日版

2022/01/17に公開約5,700字6件のコメント
  • 環境:Windows11 + WSL2 5.10.60.1 + Ubuntu20.04
  • WSL2 Linux Kernel 5.10.60.1 からKernelモジュールにUSBIP対応が標準的に組み込まれた

https://github.com/microsoft/WSL2-Linux-Kernel
  • 2022年01月17日時点の最新カーネルは 5.10.74.3
  • 以下すべての手順の Windows Terminal を使用する箇所は管理者権限で実行
  • WSLのカーネルアップデートと usbipd-win のインストール
  • Windows Terminalで実行
> wsl --update
> wsl --status
カーネル バージョン: 5.10.60.1

> winget install --interactive --exact dorssel.usbipd-win
  • WSLのディストリビューションを起動(WSL2起動用アイコンをマウスでクリックして起動してもよい)
> wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)

> wsl -d Ubuntu-20.04
  • 追加パッケージをインストール sudo apt install linux-tools-5.4.0-77-generic hwdata

  • visudosecure_path の先頭に /usr/lib/linux-tools/5.4.0-77-generic: を追記する。

  • visudo で編集するファイルは、ダブルコーテーションの入力漏れやコロンをセミコロンに打ち間違えたりすると sudo が必要なコマンド類が一切使用できなくなるので慎重に実施する

  • 私は深夜に寝ぼけてコロンをセミコロンに打ち間違えて apt コマンドすら実行できなくなりました

  • 参考

https://kledgeb.blogspot.com/2021/11/wsl-227-wsl-2usblinuxusb.html
  • 私のようにミスするひとは居ないと思いますが、一応、私が visudo を復帰させた方法は下記です。

https://zenn.dev/pinto0309/scraps/be6442e2e92932
$ sudo apt install linux-tools-5.4.0-77-generic hwdata
$ sudo visudo
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/lib/linux-tools/5.4.0-77-generic:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
  • Ubuntu側のユーザーをvideoグループに含める。
$ sudo adduser $USER video
  • WSLのコンソールからすぐに抜ける(実行しなくてもよい、Windows Terminalが占有されてうっとおしいときだけ実行する)
$ exit
  • USBカメラとカメラ以外のUSB機器の使用を可能にするためのWSL2用のLinuxカーネルのカスタムビルドを行う。下記の 2. Usage の手順を上から順番に実施する。カスタム値は全てコミット済みなので何も考えずに上から順番に実行する。なお、 <windows username> の部分はWindowsホスト側でログオン中のユーザー名に読み替える必要がある。

https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf#2-usage
  • Windows Terminalから usbipd コマンドでホストPCに接続されているUSBカメラの busid を調べる
  • BUSID の部分はカメラを接続したUSBポートによって番号が変わる
  • この記事の環境では 1-1 と認識されている
  • Not attached はWSL2の中にアタッチされていなくて宙ぶらりんであることを示す
> usbipd wsl list
BUSID  DEVICE                                        STATE
1-1    papalook FHD Camera, papalook Microphone      Not attached
1-10   USB 入力デバイス                                Not attached
1-14   インテル(R) ワイヤレス Bluetooth(R)              Not attached
  • バックグラウンドで起動しているWSL2にUSBカメラ BUSID 1-1 をアタッチする
  • コマンドが成功すると、不親切なことに無言で成功する
> usbipd wsl attach --busid 1-1
  • WSL2の中でUSBカメラがアタッチされていることを確認する
  • Windows Terminal上で実行
> usbipd wsl list
BUSID  DEVICE                                        STATE
1-1    papalook FHD Camera, papalook Microphone      Attached - Ubuntu-20.04
1-10   USB 入力デバイス                                Not attached
1-14   インテル(R) ワイヤレス Bluetooth(R)              Not attached
$ ls -l /dev/video*
crw------- 1 root root 81, 0 Jan 17 20:35 /dev/video0
crw------- 1 root root 81, 1 Jan 17 20:35 /dev/video1
  • USBカメラがWSL2の中から認識されることを確認するテストコードを作成する
$ pip3 install opencv-python opencv-contrib-python
$ cat << 'EOT' > ${HOME}/usbcam_test.py
import cv2

W=640
H=480
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, W)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, H)

while True:
    ret, frame = cap.read()
    if not ret:
        continue
    cv2.imshow('usb cam test', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
EOT
  • USBカメラ認識テスト実行
$ sudo chmod 777 /dev/video* && python3 ${HOME}/usbcam_test.py
  • 終わり。起動シーケンスをシェルにしてデスクトップに置いておくとよい。

Discussion

Twitterでもやり取りさせて頂きましたがこちらにも書き残しておきますね。
手順のうち、以下のコマンドを実行するところは管理者権限のコマンドプロンプトで実行する必要があります。

> usbipd wsl attach --busid 1-1

https://github.com/dorssel/usbipd-win/wiki/WSL-support#wsl-convenience-commands
にも "From an administrator command prompt" って書いてありますね。このWikiページを確認するのが良さそうです。
visudoも必要なさそうな気配・・・?

ありがとうございます! 次にまっさらな環境が手に入ったときに改めて試行してみます。

初めまして。当該記事を参考にRealSense D455の使用を試みたのですが、どうにもうまくいきません。アドバイスいただけないでしょうか?
【環境】
Windows11
WSL2 5.10.102.1
Ubuntu20.04
RealSense D455

【症状】
本記事の手順についてはすべてうまくいきました。
unameコマンドにてカーネルが5.10.60.1-microsoft-standard-WSL2+になっているのも確認しています。usbipd-winでRealSense D455をUbuntuに認識させ、lsusbでデバイスを認識しているのを確認したのち、/dev/video0~5があるのも確認いたしました。
その後chmod 777をし、pythonスクリプトを起動させると次のように出ます。
「[ WARN:0@0.082] global /io/opencv/modules/videoio/src/cap_v4l.cpp (889) open VIDEOIO(V4L2:/dev/video0): can't open camera by index」
なお、スクリプトを変更し、
cap = cv2.VideoCapture(2)および、cap = cv2.VideoCapture(4)は画が表示されます。

【質問】
RealSense D455において、Video2およびVideo4のみしか表示されないのは正しい挙動でしょうか?
また、PINTO様がRealSenseの動確をしている中で、realsense-viewerでの確認はなされたでしょうか?
手元の環境において別途librealsenseをインストールしたのですが、こちらの環境ではrealsense-viewerがデバイスを認識せず、librealsenseのインストールが本質的な問題ではないかと考えています。
librealsenseのインストールは公式の手順を参考にしています。

https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md

@d455 さん

cap = cv2.VideoCapture(2)および、cap = cv2.VideoCapture(4)は画が表示されます。

正しいです。 RealSense D435 でも同様です。RGBと点群の経路が別々に確保されていますので、その挙動で問題がないと判断しています。ちなみに私は WSL2 の中から 3本のRealSenseのRGBに同時にアクセスして正常に動作しています。Video(0) つまり /dev/video0 はRGBではありませんのでエラーになります。

ちなみに私の環境では3本の RealSense D435 が下記のようにWSL2の中から見えています。また、点群も3本とも取得して処理できています。

$ ls -l /dev/video*
/dev/video0
/dev/video1
/dev/video2
/dev/video3
/dev/video4
/dev/video5
/dev/video6
/dev/video7
/dev/video8
/dev/video9
/dev/video10
/dev/video11
/dev/video12
/dev/video13
/dev/video14
/dev/video15
/dev/video16
/dev/video17

環境を作ったのがかなり前ですので、確かRealSenseViwerも動かせるようにしたと記憶していますが、何をしたのかすぐには思い出せません。。。すみません。。。

RealSense は、ファームウェアアップデートで最新のファームウェアを適用しないと確かうまく認識しないときや、動作がとても不安定になることを思い出しました。ファームウェアアップデートをしてみてはいかがでしょうか?

ご返信ありがとうございます。
RealSenseのファームウェアはWindows側で最新にしております。
もう少し苦闘してみます。

ログインするとコメントできます