<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Environment on NCJ Tech Blog</title>
    <link>https://blog.chong-zeng.com/tags/environment/</link>
    <description>Recent content in Environment on NCJ Tech Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Thu, 20 Feb 2020 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.chong-zeng.com/tags/environment/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Running ROS on WSL</title>
      <link>https://blog.chong-zeng.com/posts/2020-02-20_ros_wsl/</link>
      <pubDate>Thu, 20 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.chong-zeng.com/posts/2020-02-20_ros_wsl/</guid>
      <description>简短版 如果根本没有出现图形界面，请禁用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就行
划红线的这项要取消勾选
测试一下
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 我们来试图寻找一下错误的原因</description>
      <content:encoded><![CDATA[<blockquote>
<h2 id="简短版">简短版</h2>
<ul>
<li>
<p>如果根本没有出现图形界面，请禁用OpenGL的外部转发，全部在WSL内进行渲染：</p>
<ul>
<li><code>export LIBGL_ALWAYS_INDIRECT=0</code></li>
</ul>
</li>
<li>
<p>如果出现了图形界面，但是中间是黑屏，可以通过<code>--verbose</code>检查</p>
<ul>
<li>
<p>如果是gazebo 7 (ROS Kinetic默认)，大概率是第一次模型没有下下来，自己<a href="https://bitbucket.org/osrf/gazebo_models/downloads/">手动下载模型</a>放到<code>/.gazebo/models/</code>目录下即可</p>
</li>
<li>
<p>如果是gazebo 9 (ROS Melodic)，大概率是gazebo server的IP问题，在环境里设置一下gazebo server的IP即可：</p>
<ul>
<li><code>export GAZEBO_IP=127.0.0.1</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
<hr>
<p>闲来无事玩ROS，配环境。一杯茶，一把琴，一个环境配一宿。（<del>不是</del></p>
<p>言归正传，感觉周围好多人都开始玩ROS，我也玩玩，然而拦在很多人面前的第一道坎竟是安装。事实上ROS官方对于正常的使用者已经提供了清晰明了的安装指南，只要前往<a href="https://www.ros.org/">官网</a>进行操作即可。</p>
<p>但是我<del>显然不是正常人</del>并没有安装Ubuntu，原因很多，之前还专门写文喷过Ubuntu，但是招架不住这次很多老师指定安装ROS Kinetic，ROS的上一个LTS版本，而这个版本只能安装在Ubuntu 16.04下，于是，我就动了WSL的邪念。</p>
<p>WSL好处很多，你可以直接在Windows下“无缝”使用一个Linux发行版（虽然跟内核有关的东西都被砍掉了），而且WSL的主题安装之后，你可以同时安装很多个发行版，甚至还能通过Raft WSL等工具管理不同发行版的不同快照，这次我就索性直接在WSL里同时安装了两个不同的Ubuntu发行版，分别来安装ROS Kinetic和Melodic版本。</p>
<p>WSL的安装在此略过，网上教程一搜一大把，我就不过多赘述，但是在WSL下，跑通gazebo，麻烦事还是很多的，下面开始排坑。</p>
<hr>
<p>首先，你得再安装一个Ubuntu的发行版，直接去商店下载就好。</p>
<p>然后安装一下ROS，视网络情况而定，大概10~30分钟的样子。</p>
<p>中间有一步<code>sudo rosdep init</code>可能会因为网络原因很慢，解决办法就是开proxy</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">https_proxy</span><span class="o">=</span>xxx
</span></span><span class="line"><span class="cl">sudo -E rosdep init
</span></span></code></pre></div><blockquote>
<p><code>-E</code>的意义就是将你现在设置好的proxy环境带入sudo中</p>
</blockquote>
<p>然后你需要准备一个X Server，我使用的是Xming，其他的X Server不保证兼容性。</p>
<p>通过XLaunch启动X Server，<del>注意要关闭<code>Native opengl</code>，不然WSL会试图讲渲染工作交给外部的X Server，但是我试验了一下似乎不太行，干脆就强制使用软OpenGL算了。</del>（再次尝试发现不关也行，主要不在WSL里面指定外部OpenGL就行</p>
<p><img loading="lazy" src="/old-pics/illustrations/2020-02-20_ROS_WSL/image-20200220225718834.png" alt="XLaunch"  />
</p>
<blockquote>
<p><del>划红线的这项要取消勾选</del></p>
</blockquote>
<p>测试一下</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">roslaunch turtle_tf turtle_tf_demo.launch
</span></span><span class="line"><span class="cl"><span class="c1"># on another terminal</span>
</span></span><span class="line"><span class="cl">rosrun rviz rviz -d <span class="sb">`</span>rospack find turtle_tf<span class="sb">`</span>/rviz/turtle_rviz.rviz
</span></span></code></pre></div><p>发现可视化工具rviz是可以正常使用的</p>
<p><img loading="lazy" src="/old-pics/illustrations/2020-02-20_ROS_WSL/image-20200220230758278.png" alt="turtle_tf_demo"  />
</p>
<p>但是故事没有结束，事实上ROS里面还有一个重要的仿真环境gazebo</p>
<p>我们来测试一下</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gazebo
</span></span></code></pre></div><p>然后发现</p>
<p><img loading="lazy" src="/old-pics/illustrations/2020-02-20_ROS_WSL/image-20200221101621314.png" alt="gazebo"  />
</p>
<p>中间的仿真是黑的？？？</p>
<p>很多人就会就此得出结论——WSL不能运行gazebo，我以前也这么以为，直到最近……</p>
<h2 id="gazebo-7">Gazebo 7</h2>
<p>我们来试图寻找一下错误的原因</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gazebo --verbose
</span></span></code></pre></div><p><img loading="lazy" src="/old-pics/illustrations/2020-02-20_ROS_WSL/image-20200221101842784.png" alt="gazebo &amp;ndash;verbose"  />
</p>
<p>看到那句warning，发现gazebo 7 在第一次启动的时候会尝试从官网下载所有的模型，而这一过程是非常漫长的，因此直接自己从<a href="https://bitbucket.org/osrf/gazebo_models/downloads/">BitBucket</a>手动下载，解压到<code>~/.gazebo/models</code>目录下即可。</p>
<p>这次即可正常打开</p>
<p><img loading="lazy" src="/old-pics/illustrations/2020-02-20_ROS_WSL/image-20200221103207172.png" alt="gazebo"  />
</p>
<p>输出：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Gazebo multi-robot simulator, version 7.0.0
</span></span><span class="line"><span class="cl">Copyright <span class="o">(</span>C<span class="o">)</span> 2012-2016 Open Source Robotics Foundation.
</span></span><span class="line"><span class="cl">Released under the Apache <span class="m">2</span> License.
</span></span><span class="line"><span class="cl">http://gazebosim.org
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Waiting <span class="k">for</span> master.
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Connected to gazebo master @ http://127.0.0.1:11345
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Publicized address: 192.168.0.190
</span></span><span class="line"><span class="cl">Gazebo multi-robot simulator, version 7.0.0
</span></span><span class="line"><span class="cl">Copyright <span class="o">(</span>C<span class="o">)</span> 2012-2016 Open Source Robotics Foundation.
</span></span><span class="line"><span class="cl">Released under the Apache <span class="m">2</span> License.
</span></span><span class="line"><span class="cl">http://gazebosim.org
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Waiting <span class="k">for</span> master.
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Connected to gazebo master @ http://127.0.0.1:11345
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Publicized address: 192.168.0.190
</span></span><span class="line"><span class="cl"><span class="o">[</span>Wrn<span class="o">]</span> <span class="o">[</span>Time.cc:437<span class="o">]</span> Sleep <span class="nb">time</span> is larger than clock resolution, skipping sleep
</span></span></code></pre></div><blockquote>
<p>gazebo7正常运行后的输出放在这儿是有目的的，在此先卖个关子</p>
</blockquote>
<h2 id="gazebo-9">Gazebo 9</h2>
<p>现在我们来试试ROS最新的LTS版本Melodic附带的Gazebo 9</p>
<p>再安装一个新的Ubuntu 18.04发行版</p>
<p>装好ROS Melodic</p>
<p>然后运行gazebo</p>
<p>又是黑屏</p>
<p>不慌，看看输出</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gazebo --verbose
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Gazebo multi-robot simulator, version 9.0.0
</span></span><span class="line"><span class="cl">Copyright <span class="o">(</span>C<span class="o">)</span> <span class="m">2012</span> Open Source Robotics Foundation.
</span></span><span class="line"><span class="cl">Released under the Apache <span class="m">2</span> License.
</span></span><span class="line"><span class="cl">http://gazebosim.org
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Waiting <span class="k">for</span> master.
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Connected to gazebo master @ http://127.0.0.1:11345
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Publicized address: 169.254.245.8
</span></span><span class="line"><span class="cl">Gazebo multi-robot simulator, version 9.0.0
</span></span><span class="line"><span class="cl">Copyright <span class="o">(</span>C<span class="o">)</span> <span class="m">2012</span> Open Source Robotics Foundation.
</span></span><span class="line"><span class="cl">Released under the Apache <span class="m">2</span> License.
</span></span><span class="line"><span class="cl">http://gazebosim.org
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Waiting <span class="k">for</span> master.
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Connected to gazebo master @ http://127.0.0.1:11345
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Publicized address: 169.254.245.8
</span></span><span class="line"><span class="cl"><span class="o">[</span>Wrn<span class="o">]</span> <span class="o">[</span>GuiIface.cc:120<span class="o">]</span> QStandardPaths: 
</span></span></code></pre></div><p>注意，与gazebo 7运行时的报错相对比，发现倒数第二行的<code>Publicized address</code>是<code>169.254.245.8</code>——一个无效的IP。gazebo运行需要后端的gazebo server与前端进行通信，而这个无效的IP地址导致了通信的失败。</p>
<p>解决方法也很简单，设置一下gazebo的地址即可：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GAZEBO_IP</span><span class="o">=</span>127.0.0.1
</span></span></code></pre></div><p>再次启动gazebo，就发现已经能够正常使用。</p>
<hr>
<p>睡了一觉起来，发现又不能用了……</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">~$ gazebo --verbose
</span></span><span class="line"><span class="cl">Gazebo multi-robot simulator, version 9.0.0
</span></span><span class="line"><span class="cl">Copyright <span class="o">(</span>C<span class="o">)</span> <span class="m">2012</span> Open Source Robotics Foundation.
</span></span><span class="line"><span class="cl">Released under the Apache <span class="m">2</span> License.
</span></span><span class="line"><span class="cl">http://gazebosim.org
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Waiting <span class="k">for</span> master.
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Connected to gazebo master @ http://127.0.0.1:11345
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Publicized address: 192.168.0.190
</span></span><span class="line"><span class="cl">Gazebo multi-robot simulator, version 9.0.0
</span></span><span class="line"><span class="cl">Copyright <span class="o">(</span>C<span class="o">)</span> <span class="m">2012</span> Open Source Robotics Foundation.
</span></span><span class="line"><span class="cl">Released under the Apache <span class="m">2</span> License.
</span></span><span class="line"><span class="cl">http://gazebosim.org
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Waiting <span class="k">for</span> master.
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Connected to gazebo master @ http://127.0.0.1:11345
</span></span><span class="line"><span class="cl"><span class="o">[</span>Msg<span class="o">]</span> Publicized address: 127.0.0.1
</span></span><span class="line"><span class="cl">~$
</span></span></code></pre></div><p>就没了？？？图形界面都没出来</p>
<p>然后一想，图形界面都没有那八成是OpenGL的锅</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">LIBGL_ALWAYS_INDIRECT</span><span class="o">=</span><span class="m">0</span>
</span></span></code></pre></div><p>done</p>
<hr>
<h2 id="一点对比">一点对比</h2>
<p>对比了一下发现gazebo 7的空场景帧率在24FPS左右，gazebo 9则可达到接近60FPS，看来新的gazebo还是有优化的，所以即使是使用ROS Kinetic的同学也可以尝试换到gazebo 9，API应该是通用的，不通用就自己对着文档改改好了。</p>
<p>踩坑结束。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
