【メモ】WSL2でUSB・USBカメラ📸 を使えるようにする環境構築

**~~※注意　まだ実際にWebカメラを使えるようになってませんのでご了承ください~~**

~~この記事通りにやっても、WSL2でカメラデータを表示することはできません。御免っ！
最近これ関連の新しい記事が投稿されてたので、乞うご期待。
https://qiita.com/ryoma-jp/items/9db6cca5ed10f1aed7ff~~

**→ 使えました:hankey:（2023/10/27/13/31現在）**

# 対象

WSL使い

# 環境

ノートPC

- OS: Windows11 Home（22H2）
WSL2
    - **Ubuntu-22.04**
    - **カーネルのバージョン: 5.15.90.1-microsoft-standard-WSL2**
        `uname -r -v`をWSL側で実行すると確認できます
    - インストール済み:
    linux-tools-generic hwdata opencv-python（Python3）
    [usbipd](https://github.com/dorssel/usbipd-win)
- CPU: 13th Gen Intel(R) Core(TM) i5-13500H 2.60 GHz
- ユーザー名: otogr
**※ ご自身のWindowsの方のユーザー名をご確認ください。途中で何度か使います。**


# 準備

- [usbipd](https://github.com/dorssel/usbipd-win)
PowerShellで以下を実行。勝手にusbipdというツールの環境設定までやってくれます。
    
    ```
    winget install usbipd
    ```
    
- WSL側で以下をインストール（どうやらいらないかもだけど一応）
    
    ```
    sudo apt install linux-tools-generic hwdata
    ```
    

# wsl2_linux_kernel_usbcam_enable_confのセットアップ

[こちらのGithubリポジトリのREADME](https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf)に沿って進めていきます。
wsl2_linux_kernel_usbcam_enable_confは、WSL2の内部からUSBIPを使ってホストPCに接続されたUSBカメラにアクセスするためのカーネルをビルドするための設定ファイルだそうな、、、🤪 

wsl2_linux_kernel_usbcam_enable_confのセットアップが無事成功したら、usbipdでwsl側へUSBデバイスのIPを追加します。WSL側で/dev/video*へ権限を与えればカメラ情報の表示を実行できるかと思います。

- USBデバイス情報を一覧表示（Windows PowerShell）
    
    ```
    usbipd list
    ```
    
    <img width="627.75" alt="image.png (390.4 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/e923ef37-d1be-4600-8832-a99788e20e68.png">
    
- 一覧から有効にする USB デバイスの BUSID を見つけ、 WSL2 にアタッチする
    
    ```
    (例)
    usbipd wsl attach --busid 2-6
    ```
    
    <img width="500" alt="image.png (40.4 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/ba235dfa-d76c-469c-b9a0-b614a8d30ffd.png">
    
- もう一度 usbipd list で確認すると アタッチしたデバイスの ”STATE”の表示が変わっていますね！
    
    ```
    usbipd list
    ```
    
    <img width="500" alt="image.png (377.1 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/e3a38ce9-cbd5-4d0f-9b1b-8e2846b5accd.png">
    
- WSL2で確認/権限付与する
    - `lsusb`コマンドでUSBデバイスの認識を確認
        ```
        lsusb
        ```
        <img width="569.25" alt="image.png (86.3 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/13152b9d-4917-4676-8e7f-d146a87892f5.png">
    　増えたね
    - カメラデバイスへの権限付与
        ```
        sudo chmod 777 /dev/video0
        ```
        
- 動作確認
usbtest_cam.pyを実行する。
実行しても何も映らない人は、Xlaunchの設定もした方が良いかもしれません。

# 以上!

うまくいくことを願います！


<details><summary>
:page_facing_up:  過去のこの記事の内容</summary>

# 必要なツールの準備

### usbipd-win

Windowsにインストール

- 以下のコマンドを実行
    
    ```
    winget install --exact dorssel.usbipd-win
    ```
    

（もしくは、、、）

- ここへアクセス→　https://github.com/dorssel/usbipd-win/releases
- 最新のものを選ぶ（22/1225 現在： usbipd-win_2.4.1.msi）
- ダウンロードして実行する

USBシリアルドライバを有効にしたWSL2 kernelに更新する

### usbipをWSL2にインストール

```
sudo apt install linux-tools-5.4.0-77-generic hwdat
```

### usbipコマンドを有効にする

これやるとsudoコマンドが使えんくなったから慎重にやらなきゃ

- sudoersを開く
    
    ```
    sudo visudo
    （パスワード入力）
    ```
    
- secure_pathの最初の方に「/usr/lib/linux-tools/5.4.0-77-generic:」を追加
    
    ```
    ~
    Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:/usr/local/sbin:（以下省略）"
    ~
    ```
    
- Ubuntu側のユーザーをvideoグループに含める（USBカメラ/Realsenseのため）
    
    ```
    sudo adduser $USER video
    ```
    
- usbipが2.x以降になってからPowerShellで下記エラーがでるようになったので、
    
    > usbipd: error: WSL 'usbip' client not correctly installed. See https://github.com/dorssel/usbipd-win/wiki/WSL-support for the latest instructions.```
    > 
    
    以下を実行して修正する
    
    ```
    sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20
    ```
    

### →　WSL, WindowsPowerShell再起動

# USBアクセスの手順

## 1．USBをPCに接続する

このままでは まだWSL2上ではUSBデバイスは認識できていません

- lsusb コマンドで確認してみます
<img width="450.75" alt="image.png (56.9 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/f36d736f-8f06-4635-8bef-413b8b277aaa.png">
USB2.0/3.0のルートハブしか表示されませんね

## 2．Windowsターミナルを起動する

- 「ctrl + x」+「A」
<img width="100" alt="image.png (135.5 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/9888cba1-a073-4dfe-8325-b3aaf843a508.png">

- アクセスを許可する＜YES＞
<img width="300" alt="image.png (50.1 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/7d91d557-6feb-4bfa-b8cb-86a31e70b510.png">

<img width="300" alt="image.png (439.7 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/c3bfb57b-0fb7-4fec-a646-6cd79d94c177.png">

## 3．使いたいUSBデバイスをWSL2にアタッチする

- USBデバイス情報を一覧表示
    
    ```
    usbipd list
    ```
    
    <img width="627.75" alt="image.png (390.4 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/e923ef37-d1be-4600-8832-a99788e20e68.png">
    
- 一覧から有効にする USB デバイスの BUSID を見つけ、 WSL2 にアタッチする
    
    ```
    (例)
    usbipd wsl attach --busid 2-6
    ```
    
    <img width="500" alt="image.png (40.4 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/ba235dfa-d76c-469c-b9a0-b614a8d30ffd.png">
    
- もう一度 usbipd list で確認すると アタッチしたデバイスの ”STATE”の表示が変わっていますね！
    
    ```
    (例)
    usbipd wsl attach --busid 2-6
    ```
    
    <img width="500" alt="image.png (377.1 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/e3a38ce9-cbd5-4d0f-9b1b-8e2846b5accd.png">
    

## 4．WSL2で確認/権限付与する

- lsusbで確認
<img width="569.25" alt="image.png (86.3 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2022/12/25/116455/13152b9d-4917-4676-8e7f-d146a87892f5.png">

増えたね

- 2DLidarとかKobukiならポート権限付与するといけます。
`sudo chmod 666 /dev/ttyUSB0 /dev/ttyACM0`


</details>
</div>

-----

参考記事
- https://zenn.dev/pinto0309/articles/7c7ce81bea8b6c
- https://kledgeb.blogspot.com/2021/11/wsl-227-wsl-2usblinuxusb.html
- https://zenn.dev/karaage0703/articles/a267aa24a80c44
- https://zenn.dev/fate_shelled/articles/06d109bd10b702