🀪

[Deprecated] WSL2 USBカメラ+他のUSB機噚 2022幎01月17日版

に公開
2022/03/01
16ä»¶
  • 環境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

  • visudo で secure_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も必芁なさそうな気配・・・

2
PINTOPINTO

ありがずうございたす 次にたっさらな環境が手に入ったずきに改めお詊行しおみたす。

1
d455d455

初めたしお。圓該蚘事を参考に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

PINTOPINTO

@d455 さん

cap = cv2.VideoCapture(2)および、cap = cv2.VideoCapture(4)は画が衚瀺されたす。

正しいです。 RealSense D435 でも同様です。RGBず点矀の経路が別々に確保されおいたすので、その挙動で問題がないず刀断しおいたす。ちなみに私は WSL2 の䞭から 3本のRealSenseのRGBに同時にアクセスしお正垞に動䜜しおいたす。Video(0) ぀たり /dev/video0 はRGBではありたせんので゚ラヌになりたす。

ちなみに私の環境では本の RealSense D435 が䞋蚘のようにWSL2の䞭から芋えおいたす。たた、点矀も本ずも取埗しお凊理できおいたす。

$ 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も動かせるようにしたず蚘憶しおいたすが、䜕をしたのかすぐには思い出せたせん。。。すみたせん。。。

PINTOPINTO

RealSense は、ファヌムりェアアップデヌトで最新のファヌムりェアを適甚しないず確かうたく認識しないずきや、動䜜がずおも䞍安定になるこずを思い出したした。ファヌムりェアアップデヌトをしおみおはいかがでしょうか

d455d455

ご返信ありがずうございたす。
RealSenseのファヌムりェアはWindows偎で最新にしおおりたす。
もう少し苊闘しおみたす。

1
KuroToraKuroTora

カヌネルのカスタムビルド䞭、
$ cat << 'EOT' > /mnt/c/Users/${WINUSERNAME}/.wslconfig
[wsl2]
kernel=C:\Users\<windows username>\vmlinux
EOT
を実行しおシャットダりンさせるず、Ubuntuを起動できなくなっおしたいたした。wslconfigを削陀するず元に戻ったのですが、䜕か察凊法をご存知でしたらご教授頂けたすず幞いです。
※Windowsサむドで実行しおはいけないず赀文字で曞いおありたしたが、wsl䞊で実行しおもこのような珟象が起きおしたいたした。解釈が間違っおいたしたらすいたせん 

PINTOPINTO

゚ラヌメッセヌゞに衚瀺されおいる内容しか読み取るこずができたせんが、「指定されたパスがない」のではないでしょうか

  1. ${WINUSERNAME} には倀が蚭定されおいたすか
  2. <windows username> には倀が蚭定されおいたすか
1
KuroToraKuroTora

返信ありがずうございたす(__)
ナヌザヌネヌムに空癜が含たれおおり、${WINUSERNAME}ではシングルクォヌテヌションを付けお打っおいたのですが、そのたた<windows username>でもシングルクォヌテヌションを付けおいたため正しく読み取れおいなかったようです。
PINTOさんの助蚀によっお成功させるこずができたした(ÂŽ;ω;)

1
PINTOPINTO

うたくいったようで良かったです

1
negitnegit

初めたしお。PINTO様の蚘事に埓い環境を構築しおいお、動䜜テストの段階で぀たずいおしたったので、ご助蚀を頂けないでしょうか...m(_ _)m

【環境】

  • Windows11OS ビルド 22000.318
  • WSL2
  • Ubuntu20.04.4 LTS
  • Python3.7.8
  • OpenCV4.6.0
  • WebカメラLogicool C270n HD WEBCAM

【発生しおいる問題】
環境構築が終わり、usbcam_test.pyを実行したら以䞋のような゚ラヌが出たした。

[ WARN:0@10.255] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout.
[ WARN:0@20.266] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout.
[ WARN:0@30.276] global /io/opencv/modules/videoio/src/cap_v4l.cpp (1013) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout.
^CTraceback (most recent call last):
  File "tools/webcamtest.py", line 29, in <module>
    ret, frame = cap.read()
KeyboardInterrupt

なので、こちらの蚘事の3. Note に埓いコマンドを実行し、実行結果を確認したした。
以䞋がコマンドの実行結果です。

$ v4l2-ctl -d /dev/video0 --all
Driver Info:
        Driver name      : uvcvideo
        Card type        : C270 HD WEBCAM
        Bus info         : usb-vhci_hcd.0-1
        Driver version   : 5.10.102
        Capabilities     : 0x84a00001
                Video Capture
                Metadata Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
        Width/Height      : 640/480
        Pixel Format      : 'YUYV' (YUYV 4:2:2)
        Field             : None
        Bytes per Line    : 1280
        Size Image        : 614400
        Colorspace        : sRGB
        Transfer Function : Rec. 709
        YCbCr/HSV Encoding: ITU-R 601
        Quantization      : Default (maps to Limited Range)
        Flags             : 
Crop Capability Video Capture:
        Bounds      : Left 0, Top 0, Width 640, Height 480
        Default     : Left 0, Top 0, Width 640, Height 480
        Pixel Aspect: 1/1
Selection Video Capture: crop_default, Left 0, Top 0, Width 640, Height 480, Flags: 
Selection Video Capture: crop_bounds, Left 0, Top 0, Width 640, Height 480, Flags: 
Streaming Parameters Video Capture:
        Capabilities     : timeperframe
        Frames per second: 30.000 (30/1)
        Read buffers     : 0
                     brightness 0x00980900 (int)    : min=0 max=255 step=1 default=128 value=128
                       contrast 0x00980901 (int)    : min=0 max=255 step=1 default=32 value=32
                     saturation 0x00980902 (int)    : min=0 max=255 step=1 default=32 value=32
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                           gain 0x00980913 (int)    : min=0 max=255 step=1 default=0 value=8
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=1
                                0: Disabled
                                1: 50 Hz
                                2: 60 Hz
      white_balance_temperature 0x0098091a (int)    : min=0 max=10000 step=10 default=4000 value=4280 flags=inactive
                      sharpness 0x0098091b (int)    : min=0 max=255 step=1 default=24 value=24
         backlight_compensation 0x0098091c (int)    : min=0 max=1 step=1 default=1 value=1
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3
                                1: Manual Mode
                                3: Aperture Priority Mode
              exposure_absolute 0x009a0902 (int)    : min=1 max=10000 step=1 default=156 value=156 flags=inactive
         exposure_auto_priority 0x009a0903 (bool)   : default=0 value=1


$ v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'YUYV' (YUYV 4:2:2)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 160x120
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 176x144
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)

                Size: Discrete 1280x720
                        Interval: Discrete 0.133s (7.500 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1280x960
                        Interval: Discrete 0.133s (7.500 fps)
                        Interval: Discrete 0.200s (5.000 fps)
        [1]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 160x120
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 176x144
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
 
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1280x960
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                        Interval: Discrete 0.200s (5.000 fps)

この実行結果から、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みたいなものを聞かれたず思いたす。

PINTOPINTO

カヌネルのバヌゞョンが倧きく異なるため、おそらく make コマンド時のビルドオプションが倧きく倉わっおいるず思いたす。したがいたしお、リポゞトリにコミットされおいる config ファむルは 5.10.60.1 時点のものですので、こちらからたどれる公匏の手順を詊しおいただいたほうが良いかもしれたせん。
https://github.com/microsoft/WSL2-Linux-Kernel

その昔、同じ症状で䞀時困っおいたしたが、そのずきは結局USBカメラずの盞性の問題でした。皮類詊しお皮類成功する感じでした。
https://zenn.dev/pinto0309/articles/c3014043502245

1
negitnegit

ご返信ありがずうございたすm(_ _)m
公匏の手順を元にもう䞀床ビルドをやり盎しおみたす。

negitnegit

usbcam_test.py にcap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G'))の1文を加えおフォヌマットをYUYVからMJPGに倉曎したら640×480で映像が出力されたした
ご察応ありがずうございたしたm(_ _)m

1
clearwaterclearwater

有益な蚘事ありがずうございたす。
本手順に沿っおカメラ画像のリアルタむム衚瀺たではできたした。
しかしながら、かなりカクカクしおしたいたす。
同じusbcam_test.pyでもWindows偎で別途䜜成した環境ではスムヌズに描画できおいるのですが、WSL2偎で別途蚭定が必芁なのでしょうか。

環境

  • Windows 11 バヌゞョン21H2 (OSビルド22000.918)
  • NVIDIA GeForce RTX 3060 Laptop
  • Ubuntu 20.04.5 LTS (GNU/Linux 5.10.60.1-microsoft-standard-WSL2+ x86_64)
  • Python 3.8.10
  • OpenCV4.6.0
  • Webカメラ HD Webcam eMeet C960
PINTOPINTO

Microsoft公匏が本日時点でWSL2に配信しおいる最新の Linux Kernel 5.10.102.1 でれロから環境構築し、正垞に動䜜したした。USBカメラ台目は動䜜䞍可。USBカメラ台目は動䜜したした。やはりUSBカメラの盞性問題だず思いたす。ダメなカメラは YUYV や MJPEG のどちらに倉曎しおもタむムアりトしたすし、解像床を䞋げおもダメでした。

https://zenn.dev/pinto0309/articles/e1432253d29e30

1