WSLにROSを入れた話(GUIの画面を出すのに手間取った話)

WSLにROSを入れた話の続きです。ROSはGUIで操作することもあるらしく(というか、Robotの動きとかを出力するとき、テキストベースだとつらいですよね…)、WSLからそんな出力を表示させてみましょう。そんな出力は、ウィンドウで表示されます。つまり、ウィンドウを描画するソフトがあればよいわけです。以下にざっくりとした手順を示します。

1.ウィンドウを描画するソフトを立ち上げる
2.WSLからそのウィンドウに描画したいという指令を送る
3.ウィンドウのソフトが指令を受け取り、ウィンドウを描画する

まずは1です。これはX Window Systemを使用します。これを実現してくれるソフトのうち、一番使われているものがVcXsrvです。インストール方法は他の人の記事に譲ります。ちなみに、この部分で一番はまります。

まず、起動方法を調べていくと、-acをAdditional parameters for VcXsrv という入力フォームに入力する、という記事が多くヒットします。このオプションは、disable access control restrictionsという内容です。こちらのリンクに起動オプションの記載があります(本稿の末尾にも載せています。URLをコピペしたら勝手に読み込まれてしまいました)。このオプションを付けずにxlaunchを起動し、ウィンドウを描画しようとするとこんなエラーが出ます。

yuta@LAPTOP:~$ xeyes
Authorization required, but no authorization protocol specified
Error: Can't open display: x.x.x.x:0

これは描画しようとしたのに、承認ができなかったというエラーです。この接続制限を無効化するのが先ほどの-acオプションです。その設定をすると、

画像1

こんな感じにxeyesが起動してくれました。大体のユーザが求めるのはこの辺りなので、ひと段落します。

しかし、rosのコマンドの一つ、rosrun rviz rviz を発行するとウィンドウが一瞬描画された後、すぐに閉じられ、以下のようなエラーが出てきます。

yuta@LAPTOP-51AOBS8T:~$ rosrun rviz rviz
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-yuta'
[ INFO] [1633437190.752270200]: rviz version 1.13.19
[ INFO] [1633437190.753580300]: compiled against Qt version 5.9.5
[ INFO] [1633437190.753683300]: compiled against OGRE version 1.9.0 (Ghadamon)
[ INFO] [1633437190.776272600]: Forcing OpenGl version 0.
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Segmentation fault

これを調べてみると、-nowgl: disable the GLX extension to use the native Windows WGL interface for hardware-accelerated OpenGL というオプションを付けてxlaunchしろという記事が出てきます。-acを一緒に使うように、という発言がないため、こっちのオプションが正しいのかと思い、-nowglで起動してみると、yuta@LAPTOP-51AOBS8T:~$ xeyes
Authorization required, but no authorization protocol specified
Error: Can't open display:
が再び現れます。

こはいかに、と思いさらに調べてみると、この記事にたどり着きました。

WSL2でROSを使う(2021/4)

この記事を見て目から鱗。xlaunchの起動オプションは、-ac -nowgl と二つ並べて記載するのが正しかったようです。また、さらに調べてみると、-acというオプションは

画像2

この一番下にあるチェックボックス、Disable access control をオンにすることと同様であることが判明しました。ということで、最終的に設定すべき項目は

画像3

チェックボックスをすべて選択した後、オプションの欄に-nowglを記載する、でした。

画像4

これで晴れてrosrun rviz rvizが正しく動きました。(これが何のコマンドかはまた明日にでも調べます)


蛇足ですが、今回のはまったエラーで検索をすると、 export LIBGL_ALWAYS_INDIRECT=1 をするといいというアドバイスが出てきました。しかし、これをすると、
yuta@LAPTOP-51AOBS8T:~$ export LIBGL_ALWAYS_INDIRECT=1
yuta@LAPTOP-51AOBS8T:~$ rosrun rviz rviz
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-yuta'
[ INFO] [1633144767.883042800]: rviz version 1.13.19
[ INFO] [1633144767.883195900]: compiled against Qt version 5.9.5
[ INFO] [1633144767.883306200]: compiled against OGRE version 1.9.0 (Ghadamon)
[ INFO] [1633144767.894725700]: Forcing OpenGl version 0.
Segmentation fault
というようにエラーは解決しませんでした。うまくいったxlaunchのオプション時には、export LIBGL_ALWAYS_INDIRECT= とする(値を消去する)と起動するようになりましたので、補足しておきます。





この記事が気に入ったらサポートをしてみませんか?