[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ã§ã¯ãããŸããã®ã§ãšã©ãŒã«ãªããŸããã¡ãªã¿ã«ç§ã®ç°å¢ã§ã¯ïŒæ¬ã® RealSense D435 ãäžèšã®ããã«WSL2ã®äžããèŠããŠããŸãããŸããç¹çŸ€ãïŒæ¬ãšãååŸããŠåŠçã§ããŠããŸãã
ç°å¢ãäœã£ãã®ãããªãåã§ãã®ã§ã確ã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.1sudo 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ã«ã¡ã©ãšã®çžæ§ã®åé¡ã§ãããïŒçš®é¡è©ŠããŠïŒçš®é¡æåããæãã§ããã
ãè¿ä¿¡ããããšãããããŸãïŒ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ã«ã¡ã©ïŒå°ç®ã¯åäœäžå¯ãUSBã«ã¡ã©ïŒå°ç®ã¯åäœããŸããããã¯ãUSBã«ã¡ã©ã®çžæ§åé¡ã ãšæããŸãããã¡ãªã«ã¡ã©ã¯
YUYVãMJPEGã®ã©ã¡ãã«å€æŽããŠãã¿ã€ã ã¢ãŠãããŸãããè§£å床ãäžããŠããã¡ã§ããã