By: KDHF
⚠️ 关于本教程
注意,本教程已不符合目前环境,win11下已经有了自带的wslgui,ROS2也已经被大规模使用,大致安装流程也许尚且相似,有时间我会重新再写一篇教程
这个文章总结了大量安装教程,再通过个人经验解决了一些个人遇到的小bug
本教程针对ROS1而非ROS2
本教程写于2022年2月份,所使用的软件版本也为该时间点所能获取的最新版本(除win10系统版本外)
以下是本教程所用的各类软件版本,仅供参考,较为建议安装所有能获得的最近LTS版本(稳定版)
Ubuntu 20.04 — 操作系统
ROS Noetic — 所需软件本体
CUDA 11.6 — GPU加速(使用独显必备,N卡限定)
(后来笔者发现其实ROS中的gazebo使用GPU不需要CUDA只需要把驱动安装好就行,不过这个时候教程已经写完了。ROS中有些东西还是会用到CUDA的到时候再装也来得及)
本教程将分为三个部分来安装上述软件和系统,ROS和CUDA都是需要在Ubuntu里进行安装的,其中ROS的版本与Ubuntu的版本相关,请确保两者版本的正确来避免不必要的麻烦。
此三项教程相对独立,可以单独使用,不过在单独使用时一定要确保版本的正确性。
💡 温馨提示:如果想向Terminal或者powershell里复制粘贴文本,在外面复制好之后,在相应Terminal中点击右键即可。

WSL2的安装
首先,你要保证你的win10系统版本是能够使用WSL2的(Win11也是OK的)
按下 Win + R 输入 winver 点击 确定

如图中红框内数字,请升级至19041以后的版本。
在 控制面板\所有控制面板项\程序和功能 页面点击 启用或关闭Windows功能
勾选如下图红框内的两个选项 并点击确定

如果是第一次勾选这两项,电脑应该会要求重新启动计算机。请按指示重启后再继续操作。
💡 可选项:通过Microsoft Store安装Windows Terminal 这是个集成了powershell、 windows command prompt(命令提示符)、linux的Terminal等为一体的很方便的集合体Terminal。

以管理员模式运行Powershell或者命令提示符(cmd)或者上述Windows Terminal (打开powershell或者cmd的页面) 输入如下指令
默认来说,这将自动给你安装一个Ubuntu的LTS版本,,如果并非第一次安装WSL,这可能会在屏幕上显示出WSL的默认指令(help text)
安装成功后可以先运行后面转换默认到WSL version 2的指令,这样可以省去单独改变分发版本的步骤,具体指令在后面。
这时我们可以输入
来查看可以下载的分发版本以及其版本分发名
下图红框内就是我们需要的分发名

本教程安装的是Ubuntu 20.04 LTS 版本,所以我们输入
如果在安装过程中遇到如下问题,这是由于Win10系统版本不够高导致的(至少我的老笔记本是这个原因)这时候就需要手动进行一下Linux Kernel的升级。(其实就是后面这个aka.ms...这个网址)

我们直接从这个网址下载: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
之后再打开Ubuntu 20.04 LTS的界面就可以正常安装了,会需要设置一个该系统的用户名和密码(用户名尽可能简洁点,因为后面Linux路径里桌面是在 ~/home/用户名/ 下的,太长会导致Terminal 看起来很不美观。
在安装结束后,我们需要吧WSL版本改成WSL2 (这一步其实可以提前与分发版的安装,这样后面就不需要再次设置分发版的WSL版本了)。
如果你安装了多个分发版本,你也许需要以下指令
查看已安装的分发

-s 设置默认启动的分发
-d 启动此分发
最后一步,将相应分发版升级成WSL2版本。
也许刚才你已经通过指令发现我们的分发版还处于version 1(WSL 1)
所以,我们需要升级其至WSL2(如果已经是version 2了就可以忽略本条指令)
至此 Ubuntu 20.04 LTS版本已经再WSL2中安装成功。
可以直接从开始菜单打开该系统,或者再上述的Windows Terminal中启动

有关换源
如果你在国内,这一步可能是有必要的,切换下载原到更快的国内节点,比如这里我们切换到阿里源。
有关于图形界面(子系统桌面)
💡 如果你使用的是win11的系统,那么恭喜你,你可以使用微软自带的Linux GUI来运行Linux桌面,不过目前这仍处于预览测试中,这里还是建议不要盲目升级至Win11而导致别的兼容性问题。具体安装方法请查阅:https://docs.microsoft.com/zh-cn/windows/wsl/tutorials/gui-apps
本教程用到的方法是使用Xserver进行画面监听,直接从子系统发送到本机IP地址来实现界面数据传输。
首先安装VcXsrv: https://sourceforge.net/projects/vcxsrv/
然后,我们需要知道本机地址,在powershell或者cmd中输入
ipconfig
此时有两种选择,讲图像传输回WSL的虚拟地址或是直接的本机地址。如下是虚拟地址的版本,本机地址也是取相应的IPv4地址即可。

我们需要在.bashrc文件中添加一行输出地址. (在Ubuntu下输入)
echo "export DISPLAY=172.19.16.1:0.0" >> ~/.bashrc
其中 “172.19.16.1” 就是你刚刚得到的ipv4地址,不要忘记写后面的 :0.0
如果要修改这个IP参数的话,需要修改 ~/.bashrc 文件,有很多种可以在Terminal中编辑文件的方法,比如笔者使用的vim。
如果没有vim可以先安装vim。
sudo apt-get install vim
安装结束后就就可以打开了,输入
vim ~/.bashrc
按 i 进入编辑模式。
修改之后按下 Esc 在输入 :wq 就可以保存回到Terminal里。
其他vim的指令可以查阅: Linux vi/vim | 菜鸟教程 (runoob.com)
之后重新载入一下这个文件 (这个指令后面会用到很多次,因为这样就不需要重新打开个新的Terminal了)
source ~/.bashrc
还需要安装一个图形桌面环境,比如Xfce4
在Linux的Terminal中输入如下几行:
sudo apt-get update sudo apt-get upgrade -y sudo apt-get install xfce4
中间会跳出一个页面问你选择什么管理器,随便选哪个都行。(反正我随便选了个)

安装好后,启动桌面:
startxfce4
如果无法正确输出并显示类似如下提示,可以添加 -ac 参数到 Xlaunch中

添加-ac参数

💡 如果在开启防火墙的状态下,打开Xlaunch时没有跳出提醒而导致无法正确连接桌面,可以先将防火墙关闭即可正常连接。(笔者的老旧笔记本亲测)
ROS的安装
💡 其实官方自带的教程已经足够详细:http://wiki.ros.org/noetic/Installation/Ubuntu#Ubuntu_install_of_ROS_Noetic 本教程会针对某些部分进行说明和修正。
以下操作全在linux的terminal中进行。
第一步:添加软件源
第二步:设置密钥
官方版是需要使用curl从论坛获取一个新的密钥,这里我们直接输入现成的
第三步:正式安装
首先确保linux的各种包都是最新的
然后安装完全版的ros noetic
这将花费一段时间,请保证网络连接状态。
第四步:环境设置(工作区)workspace
这一步有两种选择,一种是按照官方wiki的直接在安装目录来建立环境。
还有一种是笔者推荐的,在自定义目录下建立环境。
首先读取一下安装目录下的setup.bash文件
然后创建自定义目录。
这里**-p代表同时建立两层路径,自定义名称可以任取,但是src这个目录名称是固定的,这里笔者写为。(~**就是代表home目录)这个src目录也是以后存放ROS源文件的地方。
我们来到ros_ws目录下。
在该目录下,输入
将会自动开始工作区剩余文件的补充。(build文件夹和devel文件夹)
在结束后(没有致命性error的情况下),我们载入这个workspace的环境变量。
如果想要以后每次打开Terminal都会自动载入这个环境变量,请输入:
当然也可以直接输入这一条指令然后重载 .bashrc这个文件。
💡 注意:以上ros_ws是笔者自定义的工作区名称,安装时可根据需要自行更改。
第五步:依赖库
我们需要安装ros的依赖库文件,这一步基本和官网wiki操作一致。
最后初始化rosdep
此时,你可能会遇到神秘问题导致无法正确初始化,比如:

我只能说,懂得都懂这是什么原因,你需要跨过山和大海或者使用一些魔法,如果搞不定的话可以私聊问笔者。(其实无非是8888和8844)
成功后:
成功之后可以尝试以下指令来确认安装成功。(Beginner Tutorials 小海龟)
新开一个Terminal 打开小海龟页面

再新开一个Terminal输入方向控制指令

然后就可以输入方向键控制小海龟移动了。(在最后一个terminal按方向键)
还可以输入

有关如何让gazebo使用独立显卡使画面变得丝滑
首先,在terminal运行 (未确定是否必须)
DRI_PRIME=1 gazebo
运行gazebo 同时查看显卡和cpu的占用率,如果独显一点都没用上,那你需要更新你的显卡驱动
由于WSL的特殊性,你只需要更新你Windows的显卡驱动即可,Windows会自动给WSL配置显卡驱动。(笔者没意识到这件事是因为在主机上使用时直接先安装了CUDA,忘记了这步的操作,后面在测试用的笔记本安装时意识到CUDA应该和gazebo无关)
By KevinD
CUDA的安装(只用ROS的话非必须)
💡 英伟达出了个详细的安装教程:https://docs.nvidia.com/cuda/wsl-user-guide/index.html
本文将会尽可能简化的同时成功安装CUDA
第一步:检查显卡驱动
首先,你必须要有独显才能启用这个功能,而且还必须是英伟达的独显(AMD no)
这一步就是确保你正确安装过独显驱动,现在的驱动去官网就可以找到,本文将不再赘述。
第二步:前置及依赖库
首先还是先更新
sudo apt update
安装gcc g++ make
sudo apt install gcc g++ make
安装依赖库
sudo apt install libglu1-mesa libxi-dev libxmu-dev libglu1-mesa-dev freeglut3-dev
第三步:下载CUDA Toolkit
首先去官网: https://developer.nvidia.com/zh-cn/cuda-toolkit
点击立即下载,之后会进入选择页面

按照如图中方法选择之后,我们会发现下面已经为我们准备好了需要的指令,依次输入linux的terminal中就好。
比如本文安装的11.6.1版本:
wget <https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin> sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600 wget <https://developer.download.nvidia.com/compute/cuda/11.6.1/local_installers/cuda-repo-wsl-ubuntu-11-6-local_11.6.1-1_amd64.deb> sudo dpkg -i cuda-repo-wsl-ubuntu-11-6-local_11.6.1-1_amd64.deb sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-6-local/7fa2af80.pub sudo apt-get update sudo apt-get -y install cuda
第四步:写入环境变量
CUDA工具箱安装成功后,在~/.bashrc中添加环境变量(使用vim打开或者gedit打开都行)
export PATH=$PATH:/usr/local/cuda-11.6/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.6/lib64:/usr/lib/x86_64-linux-gnu
相关链接
Install WSL | Microsoft Docs: https://docs.microsoft.com/en-us/windows/wsl/install
旧版 WSL 的手动安装步骤 | Microsoft Docs: https://docs.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package
QA Section
Q1: 为什么不是ROS2
A1: ROS2 确实会更加适合未来的工作和开发,但是由于兼容性、导师的习惯、公司的习惯等等问题ROS1本身仍然有必要学习,并且ROS2是会对ROS1进行兼容的。ROS1最后的LTS版本仍有将近4年的支持时间。说到底,只是因为笔者最近在用ROS1,并且还没开始学习ROS2,也许你在不远的将来就会看见ROS2的安装教程。
Q2: 为什么不使用虚拟机
A2: ROS中涉及大量图形计算和实时显示,虚拟机无法使用计算机的全部性能,WSL2作为微软自家推出的Windows下的子系统,可以更好的发挥计算机性能,是除了虚拟机、双系统之外的单计算机目前最优解(当然更好的解决方式永远是你有两台物理计算机,但是需要$$$)。