概要
2025/02/12現在、通常のWSLではwebカメラやゲームパッドを正常に認識できません。ロボット関連の開発ではこれらを使用したいことも多いので、使えないのはやや困りものです。この問題に対処するために、wslカーネルをカスタムビルドします。
ビルド済カーネルは私のgithubで公開しています
動作環境・バージョン
動作環境
windows11
バージョン
Windows11 24H2
WSL バージョン: 2.4.10.0
カーネル バージョン: 5.15.167.4-1
※windows11であってもバージョンが古い場合、wslの一部の機能が正常に動作しない可能性があります
使用機器
realsense D455f
logicool Gamepad F310
前提条件
wslを使用した経験があること
コンテンツ
wsl内での操作とwindows側での操作があります。これを誤ると重大な問題が発生する可能性があるので、注意して下さい。windows側での操作は管理者権限を付与したpowershellを使用して下さい。
カメラ対応
ビルドツールの準備
以下wsl内で実行
ビルドの依存関係のインストール
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool bc
ベースとなるカーネルのダウンロード
git clone --depth 1 -b linux-msft-wsl-5.15.y https://github.com/microsoft/WSL2-Linux-Kernel.git
cd WSL2-Linux-Kernel
configファイルの作成
configファイルの編集が億劫な人は私のgithubから編集済ファイルを取得することもできます。
cp /proc/config.gz config.gz
gunzip config.gz
mv config .config
configファイルの書き換え
sudo make menuconfig
ターミナル上でGUIを介してカーネルの編集を行えます
Selectで進むExitで戻る(必ずしもGUIが閉じらるわけではない)、Yでチェック、Nでチェック解除
「Kernel hacking > Compile-time checks and compiler options > General BTF typeinformation」のチェックをはずす
「Device Drivers > Multimedia support」にチェックを付ける
「Device Drivers > Multimedia support > Video4Linux options」内の3つすべてにチェックを付ける
「Device Drivers > Multimedia support > Media drivers > Media USB Adapters」にチェックを付ける
「Device Drivers > Multimedia support > Media drivers > Media USB Adapters > USB Video Class(UVC)」にチェックを付ける
SAVE->OK->EXITで保存しGUIが終了するまでEXIT
ゲームパッド対応
※このセクションではカーネルの設定ファイルを直接編集します。私の環境ではうまくいきましたが、この操作は公式には非推奨であり、失敗した場合重大な不具合が発生する可能性があります。自己責任で行ってください。
configファイルの編集が億劫な人は私のgithubから編集済ファイルを取得することもできます。
カメラ対応のconfigファイル作成までを実行して下さい
任意のsudo権限を付与したエディタで以下の編集を行ってください。私はnanoでやりました。
編集する項目は「Userland interfaces」の下にあります
- 2011行目付近の
CONFIG_INPUT_JOYDEV is not set
をCONFIG_INPUT_JOYDEV=y
に変更 - 2012行目付近の
CONFIG_INPUT_EVDEV is not set
をCONFIG_INPUT_EVDEV=y
に変更 -
CONFIG_INPUT_JOYSTICK is not set
をCONFIG_INPUT_JOYSTICK=y
に変更 - ↑の真下に
CONFIG_JOYSTICK_ANALOG=y
を新たな行として挿入 - ↑の真下に
CONFIG_JOYSTICK_XPAD=y
を新たな行として挿入 - ↑の真下に
CONFIG_JOYSTICK_XPAD_FF=y
を新たな行として挿入
ビルド・反映
ビルド
sudo make -j$(nproc) && sudo make modules_install -j$(nproc) && sudo make install -j$(nproc)
※ ゲームパッド対応を行っている場合、色々聞かれるので全てy
カーネルの読み込み
下記のwindows-user-nameは自身のものに置き換えてください(全部で3か所あります)
cp vmlinux /mnt/c/Users/<windows-user-name>/vmlinux
cat << 'EOT' > /mnt/c/Users/<windows-user-name>/.wslconfig
[wsl2]
kernel=C:\\Users\\<windows username>\\vmlinux
EOT
windows側のpowershellに切り替えてください
wsl --shutdown
念のため、PCを再起動してください
wslを起動し、wsl内のターミナルに切り替えてください
uname -a
で表示されるカーネルバージョンの末尾がmicrosoft-standard-WSL2+
になっており(+が重要)。#以降の最終ビルド日時がビルドを行った時間帯と整合すれば反映されています
接続の確認
usbipdのインストールがまだの人・使い方が分からない人はこちらを参照してください
使用したい機器をUSB接続しusbipdによってwslにアタッチしてください
※始めてゲームパッドを使用する際にはbindの際に--force
オプションが必要になることがあります(例: usbipd bind --force --busid 1-9
)
カメラの接続確認
wsl内のターミナルでls /dev
を実行してください
添付画像右側のようにvideo0~video5(何番まであるかはカメラによります)が表示されていれば成功
ゲームパッドの接続確認
wsl内のターミナルでls /dev/input
を実行してください
添付画像のようにevent0,1及びjs0が表示されていれば成功
実際の使用に際して
実際に使用する際は必要に応じて
sudo chmod 777 /dev/video*
sudo chmod 777 /dev/input/*
によって権限を設定してください
トラブルシューティング
WSLのデフォルトディストリビューションを確認し、想定と一致しているかチェック
-
wsl -l
で確認 - 想定と異なっていた場合
wsl -s Ubuntu-<dist>
で変更
WSLの再インストールが問題解決に有効なことがあります(WSL内のデータは保持されません)
- wsl -l -v でインストールされているディストリビューションを確認
- wsl --unregister
- (あれば)microsoftストアでインストールしたアプリをアンインストール
- PC再起動
- microsofストアから再インストール
終わりに
これらのデバイスが使用できればWSLにおけるロボット開発の幅が広がるでしょう。
参考文献
touch-sp様のブログ「パソコン関連もろもろ」より
WSLのgithub issueより
Microsoft Learn