びぼーろく

ネットに記事通りにやったのにできない!となったのを記録する

WSL2にPybullet環境を構築する

環境

OS:Windows11

オンボードのグラフィックス:Intel UHD Graphics

NVIDIA GeForce MX550

wsl2のインストール

Windows11でのwsl2インストールは非常に簡単になっていて コマンドプロンプト

wsl --install

を実行するだけ。あとはユーザ名やパスワードは適宜決める。

Ubuntuにpython3をインストールする

Windows での Python を使用した Web 開発 | Microsoft Learn

sudo apt update && sudo apt upgradeとして更新した後に、 sudo apt upgrade python3pythonを更新する

  • pipのインストール sudo apt install python3-pipと入力してpipをインストールする これによりパッケージの追加ができる

WSL2:UbuntuのPythonで「pip install」する前に知るべきこと - SE_BOKUのまとめノート的ブログ

上によるとpipコマンドでインストールする際にsudoを付けてしまうと 標準の管理パッケージaptとの間で問題が起きるらしい よって通常のpip installを使う

環境分けたほうが安全なのでvenvもインストール sudo apt install python3-venv

xserver(VcXsrv)のインストール

wsl2でGUIアプリを表示するために必要 以下の通りに進めていけば問題ない。

VcXsrv(Xサーバー)をWindowsにインストールしLinuxのGUIをリモート操作する設定方法 | りんか ネット

最後のチェックは3つ(4つ)全部入れていい。 特にファイアウォールについてはパブリックとプライベート両方にチェックを入れるようにする

ディスプレイの番号についてはWSL2を使う場合以下のように設定する

WSL で動くアプリの GUI を VcXsrv を使い Windows 10 に表示する | りんか ネット

エクスプローラで直接ファイルを開いて編集してもいいし、sudo vim /etc/bash.bashrcで ターミナル上で直接編集してもいい

うまくインストールできているか確認するためにxeyesを使う

sudo apt install x11-apps
xeyes

xeyesが起動すれば問題ない

Running WSL GUI Apps on Windows 10 - Microsoft Community Hub

Pybulletのインストール

homeディレクトリに仮想環境を置く場所を作る

mkdir python-projects/Pybullet
cd python-projects/Pybullet
python3 -m venv .venv # 仮想環境の作成
source .venv/bin/activate # 仮想環境の有効化

仮想環境内でパッケージをインストールする

(.venv) pip3 install pybullet
(.venv) pip3 install numpy
(.venv) git clone --depth 1 https://github.com/bulletphysics/bullet3 # サンプルプログラムのダウンロード
(.venv) python3 bullet3/examples/pybullet/examples/humanoid_manual_control.py # 実行環境

Pybulletでロボットアームシミュレーションをするまでの手順 - Qiita

WSL2(Ubuntu20.04)+venv+pyBulletで深層強化学習のサンプルプログラムを動かす - Qiita

ウィンドウが出ても真っ黒で描画されない場合

自分の環境ではnvidiagpuも入っていたためかウィンドウは出てきても真っ黒のままで描画されなかった。 おそらくOpenGLに関係した問題だろうということで動作確認を行った。

sudo apt install mesa-utils
glxgears

本来なら回転するギアが表示されるのだが真っ黒なウィンドウが表示される

WSLのOpenGL errorでハマった話(LIBGL_ALWAYS_INDIRECT=1でなく0) - Qiita

glxgears displays black screen, no gears · Issue #654 · microsoft/wslg · GitHub

そこで以下の設定を追加した

export DISPLAY="`grep nameserver /etc/resolv.conf | sed 's/nameserver //'`:0" # ←ディスプレイ番号の設定
export LIBGL_ALWAYS_INDIRECT=0  #←追加
export MESA_D3D12_DEFAULT_ADAPTER_NAME=nvidia  #←追加

bashrcには記述するだけでは反映されないので新しくWSL2を立ち上げるか source /etc/bash.bashrcを実行する

きちんと歯車が回っていれば描画については問題ないはず

改めてサンプルプログラムを実行する プログラム起動時のログを見るとGL_RENDERERがNVIDIAになっていることが確認できる

startThreads creating 1 threads.
starting thread 0
started thread 0
argc=2
argv[0] = --unused
argv[1] = --start_demo_name=Physics Server
ExampleBrowserThreadFunc started
X11 functions dynamically loaded using dlopen/dlsym OK!
X11 functions dynamically loaded using dlopen/dlsym OK!
Creating context
Created GL 3.3 context
Direct GLX rendering context obtained
Making context current
GL_VENDOR=Microsoft Corporation
GL_RENDERER=D3D12 (NVIDIA GeForce MX550)
GL_VERSION=4.2 (Core Profile) Mesa 22.2.5-0ubuntu0.1~22.04.3
GL_SHADING_LANGUAGE_VERSION=4.20
pthread_getconcurrency()=0
Version = 4.2 (Core Profile) Mesa 22.2.5-0ubuntu0.1~22.04.3
Vendor = Microsoft Corporation
Renderer = D3D12 (NVIDIA GeForce MX550)
・
・
・

WSL2上で動作させることができた。

全体的な流れは以下を参考にさせていただきました

WSLのOpenGL errorでハマった話(LIBGL_ALWAYS_INDIRECT=1でなく0) - Qiita

glxgears displays black screen, no gears · Issue #654 · microsoft/wslg · GitHub

PyBulletの調査: 基本からモデル作成まで