🤪
WSL2 USBカメラ+他のUSB機器 2022年01月17日版
- 環境:Windows11 + WSL2 5.10.60.1 + Ubuntu20.04
- WSL2 Linux Kernel 5.10.60.1 からKernelモジュールにUSBIP対応が標準的に組み込まれた
- 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
-
visudo
でsecure_path
の先頭に/usr/lib/linux-tools/5.4.0-77-generic:
を追記する。 -
visudo
で編集するファイルは、ダブルコーテーションの入力漏れやコロンをセミコロンに打ち間違えたりするとsudo
が必要なコマンド類が一切使用できなくなるので慎重に実施する -
私は深夜に寝ぼけてコロンをセミコロンに打ち間違えて
apt
コマンドすら実行できなくなりました -
参考
- 私のようにミスするひとは居ないと思いますが、一応、私が
visudo
を復帰させた方法は下記です。
$ 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ホスト側でログオン中のユーザー名に読み替える必要がある。
- 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
- WSL2上の
Ubuntu20.04
の中からUSBカメラが認識されていることを確認する - WSL2のコンソール上で下記のコマンドを実行する
-
/dev/video0
が見えていればOK - うまく表示されない場合は
Windows Defender Firewall
を無効化してみる - それでもうまくいかない場合はUSBカメラとの相性を確認する
-
正常に認識しているカメラ
-
WEBCAM-102BK
https://www.amazon.co.jp/gp/product/B08BHWR8ZR/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1 -
RealSense D435, D415
-
-
正常に認識されないカメラ
- ELP- USB8MP02G-L180-JP
https://www.amazon.co.jp/ELP-USBカメラモジュール-フリードライバーウェブ-VRカメラ(モデル:ELP-USB8MP02G-L180-JP)/dp/B08FDJW3HS?th=1 - PLAYSTATION Eye(CEJH-15001)
https://www.amazon.co.jp/ソニー・インタラクティブエンタテインメント-13695731-PLAYSTATION-Eye-CEJH-15001/dp/B001ANDJSG
- ELP- USB8MP02G-L180-JP
-
正常に認識したUSB機器
- ReSpeaker Mic Array v2.0
https://www.switch-science.com/catalog/3851/
https://wiki.seeedstudio.com/ReSpeaker_Mic_Array_v2.0/
- ReSpeaker Mic Array v2.0
-
$ 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でもやり取りさせて頂きましたがこちらにも書き残しておきますね。
手順のうち、以下のコマンドを実行するところは管理者権限のコマンドプロンプトで実行する必要があります。
にも "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)は画が表示されます。
【質問】
https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.mdRealSense D455において、Video2およびVideo4のみしか表示されないのは正しい挙動でしょうか?
また、PINTO様がRealSenseの動確をしている中で、realsense-viewerでの確認はなされたでしょうか?
手元の環境において別途librealsenseをインストールしたのですが、こちらの環境ではrealsense-viewerがデバイスを認識せず、librealsenseのインストールが本質的な問題ではないかと考えています。
librealsenseのインストールは公式の手順を参考にしています。
@d455 さん
正しいです。 RealSense D435 でも同様です。RGBと点群の経路が別々に確保されていますので、その挙動で問題がないと判断しています。ちなみに私は WSL2 の中から 3本のRealSenseのRGBに同時にアクセスして正常に動作しています。
Video(0)
つまり/dev/video0
はRGBではありませんのでエラーになります。ちなみに私の環境では3本の RealSense D435 が下記のようにWSL2の中から見えています。また、点群も3本とも取得して処理できています。
環境を作ったのがかなり前ですので、確かRealSenseViwerも動かせるようにしたと記憶していますが、何をしたのかすぐには思い出せません。。。すみません。。。
RealSense は、ファームウェアアップデートで最新のファームウェアを適用しないと確かうまく認識しないときや、動作がとても不安定になることを思い出しました。ファームウェアアップデートをしてみてはいかがでしょうか?
ご返信ありがとうございます。
RealSenseのファームウェアはWindows側で最新にしております。
もう少し苦闘してみます。