简短版
如果根本没有出现图形界面,请禁用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,注意要关闭(再次尝试发现不关也行,主要不在WSL里面指定外部OpenGL就行Native opengl
,不然WSL会试图讲渲染工作交给外部的X Server,但是我试验了一下似乎不太行,干脆就强制使用软OpenGL算了。
划红线的这项要取消勾选
测试一下
roslaunch turtle_tf turtle_tf_demo.launch
# on another terminal
rosrun rviz rviz -d `rospack find turtle_tf`/rviz/turtle_rviz.rviz
发现可视化工具rviz是可以正常使用的
但是故事没有结束,事实上ROS里面还有一个重要的仿真环境gazebo
我们来测试一下
gazebo
然后发现
中间的仿真是黑的???
很多人就会就此得出结论——WSL不能运行gazebo,我以前也这么以为,直到最近……
Gazebo 7
我们来试图寻找一下错误的原因
gazebo --verbose
看到那句warning,发现gazebo 7 在第一次启动的时候会尝试从官网下载所有的模型,而这一过程是非常漫长的,因此直接自己从BitBucket手动下载,解压到~/.gazebo/models
目录下即可。
这次即可正常打开
输出:
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 address
是169.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应该是通用的,不通用就自己对着文档改改好了。
踩坑结束。