🤪
[Deprecated] 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)は画が表示されます。
【質問】
RealSense 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側で最新にしております。
もう少し苦闘してみます。
カーネルのカスタムビルド中、
$ cat << 'EOT' > /mnt/c/Users/${WINUSERNAME}/.wslconfig
[wsl2]
kernel=C:\Users\<windows username>\vmlinux
EOT
を実行してシャットダウンさせると、Ubuntuを起動できなくなってしまいました。wslconfigを削除すると元に戻ったのですが、何か対処法をご存知でしたらご教授頂けますと幸いです。
※Windowsサイドで実行してはいけないと赤文字で書いてありましたが、wsl上で実行してもこのような現象が起きてしまいました。解釈が間違っていましたらすいません…
エラーメッセージに表示されている内容しか読み取ることができませんが、「指定されたパスがない」のではないでしょうか?
返信ありがとうございます(__)
ユーザーネームに空白が含まれており、${WINUSERNAME}ではシングルクォーテーションを付けて打っていたのですが、そのまま<windows username>でもシングルクォーテーションを付けていたため正しく読み取れていなかったようです。
PINTOさんの助言によって成功させることができました(´;ω;`)
うまくいったようで良かったです!
初めまして。PINTO様の記事に従い環境を構築していて、動作テストの段階でつまずいてしまったので、ご助言を頂けないでしょうか...m(_ _)m
【環境】
【発生している問題】
環境構築が終わり、
usbcam_test.py
を実行したら以下のようなエラーが出ました。なので、こちらの記事の3. Note に従いコマンドを実行し、実行結果を確認しました。
以下がコマンドの実行結果です。
この実行結果から、
usbcam_test.py
のWを640、Hを480にすればいいと良いと思いましたが、そうすると上記のエラーのようにselect() timeout
が起きます。【試したこと】
こちらの記事を参考に強制的にフォーマットを640x480 YUYV にした(?)のですが、同様のエラーが起きました。
しかし、
usbcam_test.py
のWを160、Hを120にして再びプログラムを実行すると、Webカメラの映像が出力されました。そこから徐々にWとHを大きくしていくと、Wが200、Hが200くらいまでは映せますが、それ以上大きくすると
select() timeout
が出てしまいます。W1280、H720などもダメでした。また、PC内蔵のWebカメラでも試してみましたが、同様にWとHが一定以上大きくなると映らなくなります。
【質問】
どうすれば640×480 かそれ以上の大きさで映像を映せるでしょうか?
【補足】
Webカメラの認識はできているので必要ないかもしれませんが、補足をします。
環境構築の段階で、こちらの2. Usageのコマンドの一部を以下のように変更して実行しました。
TAGVERNUM=5.10.60.1
→TAGVERNUM=5.10.102.1
sudo wget -O .config https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf/raw/main/${TAGVER}/config && \
の
${TAGVER}
をlinux-msft-wsl-5.10.60.1
に変更また、make install をした時、よくわからない選択肢が2回(多分)出てきたのですが、1回目は
y
、2回目は暴発でEnterを押しました。
1回目の選択肢は
-DWITH_LIBV4L
みたいなものを聞かれたと思います。カーネルのバージョンが大きく異なるため、おそらく
make
コマンド時のビルドオプションが大きく変わっていると思います。したがいまして、リポジトリにコミットされている config ファイルは5.10.60.1
時点のものですので、こちらからたどれる公式の手順を試していただいたほうが良いかもしれません。その昔、同じ症状で一時困っていましたが、そのときは結局USBカメラとの相性の問題でした。5種類試して3種類成功する感じでした。
ご返信ありがとうございます!m(_ _)m
公式の手順を元にもう一度ビルドをやり直してみます。
usbcam_test.py
にcap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G'))
の1文を加えてフォーマットをYUYV
からMJPG
に変更したら640×480で映像が出力されました!ご対応ありがとうございました!m(_ _)m
有益な記事ありがとうございます。
本手順に沿ってカメラ画像のリアルタイム表示まではできました。
しかしながら、かなりカクカクしてしまいます。
同じusbcam_test.pyでもWindows側で別途作成した環境ではスムーズに描画できているのですが、WSL2側で別途設定が必要なのでしょうか。
<環境>
Microsoft公式が本日時点でWSL2に配信している最新の Linux Kernel 5.10.102.1 でゼロから環境構築し、正常に動作しました。USBカメラ1台目は動作不可。USBカメラ2台目は動作しました。やはりUSBカメラの相性問題だと思います。ダメなカメラは
YUYV
やMJPEG
のどちらに変更してもタイムアウトしますし、解像度を下げてもダメでした。