简短版

  • 如果根本没有出现图形界面,请禁用OpenGL的外部转发,全部在WSL内进行渲染:

    • export LIBGL_ALWAYS_INDIRECT=0
  • 如果出现了图形界面,但是中间是黑屏,可以通过--verbose检查

    • 如果是gazebo 7 (ROS Kinetic默认),大概率是第一次模型没有下下来,自己手动下载模型放到/.gazebo/models/目录下即可

    • 如果是gazebo 9 (ROS Melodic),大概率是gazebo server的IP问题,在环境里设置一下gazebo server的IP即可:

      • export GAZEBO_IP=127.0.0.1

闲来无事玩ROS,配环境。一杯茶,一把琴,一个环境配一宿。(不是

言归正传,感觉周围好多人都开始玩ROS,我也玩玩,然而拦在很多人面前的第一道坎竟是安装。事实上ROS官方对于正常的使用者已经提供了清晰明了的安装指南,只要前往官网进行操作即可。

但是我显然不是正常人并没有安装Ubuntu,原因很多,之前还专门写文喷过Ubuntu,但是招架不住这次很多老师指定安装ROS Kinetic,ROS的上一个LTS版本,而这个版本只能安装在Ubuntu 16.04下,于是,我就动了WSL的邪念。

WSL好处很多,你可以直接在Windows下“无缝”使用一个Linux发行版(虽然跟内核有关的东西都被砍掉了),而且WSL的主题安装之后,你可以同时安装很多个发行版,甚至还能通过Raft WSL等工具管理不同发行版的不同快照,这次我就索性直接在WSL里同时安装了两个不同的Ubuntu发行版,分别来安装ROS Kinetic和Melodic版本。

WSL的安装在此略过,网上教程一搜一大把,我就不过多赘述,但是在WSL下,跑通gazebo,麻烦事还是很多的,下面开始排坑。


首先,你得再安装一个Ubuntu的发行版,直接去商店下载就好。

然后安装一下ROS,视网络情况而定,大概10~30分钟的样子。

中间有一步sudo rosdep init可能会因为网络原因很慢,解决办法就是开proxy

export https_proxy=xxx
sudo -E rosdep init

-E的意义就是将你现在设置好的proxy环境带入sudo中

然后你需要准备一个X Server,我使用的是Xming,其他的X Server不保证兼容性。

通过XLaunch启动X Server,注意要关闭Native opengl,不然WSL会试图讲渲染工作交给外部的X Server,但是我试验了一下似乎不太行,干脆就强制使用软OpenGL算了。(再次尝试发现不关也行,主要不在WSL里面指定外部OpenGL就行

XLaunch

划红线的这项要取消勾选

测试一下

roslaunch turtle_tf turtle_tf_demo.launch
# on another terminal
rosrun rviz rviz -d `rospack find turtle_tf`/rviz/turtle_rviz.rviz

发现可视化工具rviz是可以正常使用的

turtle_tf_demo

但是故事没有结束,事实上ROS里面还有一个重要的仿真环境gazebo

我们来测试一下

gazebo

然后发现

gazebo

中间的仿真是黑的???

很多人就会就此得出结论——WSL不能运行gazebo,我以前也这么以为,直到最近……

Gazebo 7

我们来试图寻找一下错误的原因

gazebo --verbose

gazebo –verbose

看到那句warning,发现gazebo 7 在第一次启动的时候会尝试从官网下载所有的模型,而这一过程是非常漫长的,因此直接自己从BitBucket手动下载,解压到~/.gazebo/models目录下即可。

这次即可正常打开

gazebo

输出:

Gazebo multi-robot simulator, version 7.0.0
Copyright (C) 2012-2016 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org

[Msg] Waiting for master.
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Publicized address: 192.168.0.190
Gazebo multi-robot simulator, version 7.0.0
Copyright (C) 2012-2016 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org

[Msg] Waiting for master.
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Publicized address: 192.168.0.190
[Wrn] [Time.cc:437] Sleep time is larger than clock resolution, skipping sleep

gazebo7正常运行后的输出放在这儿是有目的的,在此先卖个关子

Gazebo 9

现在我们来试试ROS最新的LTS版本Melodic附带的Gazebo 9

再安装一个新的Ubuntu 18.04发行版

装好ROS Melodic

然后运行gazebo

又是黑屏

不慌,看看输出

gazebo --verbose
Gazebo multi-robot simulator, version 9.0.0
Copyright (C) 2012 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org

[Msg] Waiting for master.
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Publicized address: 169.254.245.8
Gazebo multi-robot simulator, version 9.0.0
Copyright (C) 2012 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org

[Msg] Waiting for master.
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Publicized address: 169.254.245.8
[Wrn] [GuiIface.cc:120] QStandardPaths: 

注意,与gazebo 7运行时的报错相对比,发现倒数第二行的Publicized address169.254.245.8——一个无效的IP。gazebo运行需要后端的gazebo server与前端进行通信,而这个无效的IP地址导致了通信的失败。

解决方法也很简单,设置一下gazebo的地址即可:

export GAZEBO_IP=127.0.0.1

再次启动gazebo,就发现已经能够正常使用。


睡了一觉起来,发现又不能用了……

~$ gazebo --verbose
Gazebo multi-robot simulator, version 9.0.0
Copyright (C) 2012 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org

[Msg] Waiting for master.
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Publicized address: 192.168.0.190
Gazebo multi-robot simulator, version 9.0.0
Copyright (C) 2012 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org

[Msg] Waiting for master.
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Publicized address: 127.0.0.1
~$

就没了???图形界面都没出来

然后一想,图形界面都没有那八成是OpenGL的锅

export LIBGL_ALWAYS_INDIRECT=0

done


一点对比

对比了一下发现gazebo 7的空场景帧率在24FPS左右,gazebo 9则可达到接近60FPS,看来新的gazebo还是有优化的,所以即使是使用ROS Kinetic的同学也可以尝试换到gazebo 9,API应该是通用的,不通用就自己对着文档改改好了。

踩坑结束。