博文编辑中…

适用版本:WSL2 Ubuntu-20.04 ros-noetic ros-galactic

1. WSL

1.1. 安装 WSL2 与 Ubuntu-20.04

windows设置(设置->应用->可选功能->更多 Windows 功能)中启用Virtual Machine Platform(虚拟机平台)适用于 Linux 的 Windows 子系统

图 1-1 打开虚拟机平台与linux子系统功能

等待安装完成后,升级wsl

1
2
3
4
# 升级
wsl --update
# 重启
wsl --shutdown

Minecroft Store中下载Ubuntu-20.04 LTS

图 1-2 安装Ubuntu-20.04

安装完成后,在开始菜单或者Windows 终端(Windows 11)中启动Ubuntu

2. ROS

2.1. 安装 ROS

1
2
3
4
5
6
7
8
9
10
# 添加 ros 源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# 添加密钥
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -
# 安装 ros
sudo apt update
sudo apt install -y ros-noetic-desktop python3-rosdep
# 初始化 rosdep
sudo rosdep init
rosdep update

rosdep update处报错的,参考3.9节,使用rosdepc代替rosdep

另外,建议参照3.12节,将环境变量配置添加到~/.bashrc中去。

运行例程,验证安装:

1
rosrun turtlesim turtlesim_node

如果成功启动turtlesim,即安装完成。

若安装及使用过程中报错,在本文第三节附录节看看是否有对应的解决方案。

2.2. 安装 ROS 2

这里我们安装ROS2galactic版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo apt install software-properties-common
sudo add-apt-repository universe
# 添加密钥
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
# 添加 ros 2 源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 安装 ros 2
sudo apt update
sudo apt install ros-galactic-desktop
sudo apt install ros-galactic-ros-base
sudo apt install -y python3-rosdep
# 初始化 rosdep
sudo rosdep init
rosdep update

2.1小节同理,若在rosdep update处报错的,参考3.9节,使用rosdepc代替rosdep

另外,同样建议参照3.12节,将环境变量配置添加到~/.bashrc中去,但是ros2的环境变量配置文件应为/opt/ros/galactic/setup.bash

需要注意的是,rosros2的环境变量不可同时配置,同时,通过这样加载环境变量的方式,可以做到同时安装rosros2且相互不冲突。

3. 附录

3.1. WSL 制作快照

1
2
3
4
5
6
# 备份
wsl --export Ubuntu-20.04 D:\WSL2_BACKUP\wsl-ubuntu-20.04-os-init.tar
# 导入
wsl --import Ubuntu-20.04 D:\WSL2 D:\WSL2_BACKUP\wsl-ubuntu-20.04-os-init.tar --version 2
# 设置默认登录用户
ubuntu2004 config --default-user <user name>

上述命令意为:

  1. 备份Ubuntu-20.04D:\WSL2_BACKUP\wsl-ubuntu-20.04-os-init.tar处,如果WSL2_BACKUP目录不存在,则要手动新建;
  2. D:\WSL2_BACKUP\wsl-ubuntu-20.04-os-init.tar出导入Ubuntu-20.04,将该子系统的磁盘映像放到D:\WSL2目录下,并指定为wsl2版本;
  3. 设置默认用户为<user name>,否则默认为root用户,如果是Ubuntu-18.04,则将ubuntu2004改为ubuntu1804即可,如果是其他的版本也是一样的道理。

3.2 安装 NVIDIA WSL CUDA

需要注意的是,WSL2Ubuntu系统中无需再安装任何驱动,唯一需要安装的驱动仅是在windows本机中安装的NVIDIA驱动,而这个驱动我相信使用了NVIDIA显卡的个人电脑应该都有所安装。

下面是要在Ubuntu系统中进行的操作:

NVIDIA CUDA官方下载页选择对应的版本,注意要选择WSL-Ubuntu版,Installer Type可以根据自己的实际情况选择,我这里选择的是deb(network)

图 3-1 选择对应版本的 CUDA

选择完成后,按照官方给出的安装步骤安装:

1
2
3
4
5
6
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
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/3bf863cc.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda

每个版本皆有区别,此处不宜照搬。

配置环境变量,打开~/.bashrc

1
sudo vim ~/.bashrc

~/.bashrc的末尾加入:

1
2
export PATH=/usr/local/cuda-11.7/bin/${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

最后,运行nvcc --version验证CUDA是否安装成功,若正确打印版本信息等内容,则安装成功。

3.3 安装 cuDNN

windows shell中检查Ubuntu版本,并记录下来:

1
wsl -l

我的Ubuntu版本是20.04

ubuntu shell中检查CUDA版本,并记录下来:

1
nvcc --version

我的cuda版本是11.7

在官方网站注册后,下载对应的cuDNN版本:

https://developer.nvidia.com/cudnn-download-survey
图 3-2 选择对应版本的 cudnn

这里,根据自己的ubuntu系统版本选择相应的deb资源包。

3.4 安装 TensorRT

首先,与安装CUDA相同,获取、更新资源库,但并不执行最后一步的install cuda命令:

1
2
3
4
5
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
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/3bf863cc.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/ /"
sudo apt-get update

接着,在下列三者选一进行安装:

  1. 仅用于运行TensorRT C++ 应用程序:
1
sudo apt-get install libnvinfer8 libnvonnxparsers8 libnvparsers8 libnvinfer-plugin8
  1. 也用于构建TensorRT C++ 应用程序:
1
2
sudo apt-get install libnvinfer-dev libnvonnxparsers-dev
libnvparsers-dev libnvinfer-plugin-dev
  1. 对于运行 TensorRT Python 应用程序:
1
2
python3 -m pip install numpy
sudo apt-get install python3-libnvinfer

3.5 安装 NVIDIA DeepStream SDK

3.6 安装 USBIP

3.7 在 WSL 2 中使用 USB 摄像头

3.8 下载 gazebo 模型

1
2
3
4
# 进入 gazebo 用户目录,没有此目录则新建
cd ~/.gazebo
# 从 github 上下载模型
git clone https://github.com/osrf/gazebo_models.git models

3.9. rosdep update timeout

@鱼香ROS开发的rosdepc工具代替rosdep

1
2
3
4
5
6
7
8
9
# 没有 pip 命令则安装 pip
sudo apt-get install python3-pip
# 安装 rosdepc
sudo pip install rosdepc

# 初始化 rosdepc
sudo rosdepc init
# 更新
rosdepc update

以后遇到rosdep的地方都使用rosdepc即可。

3.10. Resource not found:xxx

缺少包,安装对应的包:

1
sudo apt install ros-noetic-PACKAGE

上述命令是ros noetic版本的包的安装命令,对于其他版本的ros,需稍作更改。

若安装完成后仍然报错,则是因为环境变量没有更新,运行:

1
source /opt/ros/noetic/setup.bash

具体路径以自机为准。

关于环境变量的配置,参见4.7小节。

3.11. /usr/bin/env ‘python’: No such file or directory

因为ros noetic版本使用的是python3,这里使用符号链接,将python链接到python3:

图 3-2 找不到python的解决办法
1
2
whereis python3
ln -s <python3 path> /usr/bin/python

3.12. ImportError: No module named rospy

1
source /opt/ros/noetic/setup.bash

但是只是这么做的话,每一次打开会话都需要配置环境变量,为了使得环境变量自动生效,首先打开~/.bashrc

1
sudo vim ~/.bashrc

~/.bashrc的末尾加入:

1
2
3
if [ -f /opt/ros/noetic/setup.bash ]; then
. /opt/ros/noetic/setup.bash
fi

更新:

1
source ~/.bashrc

这样,无论是重启还是重新打开会话,都不需要再更新环境变量了。

3.13. rosrun tf view_frames 运行失败

报错:

Listening to /tf for 5.0 seconds
Done Listening
b'dot - graphviz version 2.43.0 (0)\n'
Traceback (most recent call last):
  File "/opt/ros/noetic/lib/tf/view_frames", line 119, in <module>
    generate(dot_graph)
  File "/opt/ros/noetic/lib/tf/view_frames", line 89, in generate
    m = r.search(vstr)
TypeError: cannot use a string pattern on a bytes-like object

打开对应的文件:

1
sudo vim /opt/ros/noetic/lib/tf/view_frames 

修改第 89 行:

1
m = r.search(vstr.decode('utf-8')) 

3.14. assert verb_extensions, 'No verb extensions' colcon build 报错

这是个 python 3.10 的通用问题,解决方法是:

1
pip install pytest-rerunfailures

接着重新编译:

1
colcon build

4. 参考

  1. 【古月居】古月·ROS入门21讲
  2. WSL1升级为WSL2
  3. ROS2学习笔记(1)安装ROS2 Galactic
  4. Run Linux GUI apps on the Windows Subsystem for Linux
  5. Running ROS on Windows 10
  6. 解决rosdep update失败问题
  7. ROS 中的错误Done checking log file disk usage. Usage is <1GB.
  8. ROS入门——解决:Resource not found:xxx
  9. ImportError: No module named rospy
  10. ubuntu 20.04 “rosrun tf view_frames“运行失败
  11. NVIDIA CUDNN DOCUMENTATION
  12. NVIDIA TENSORRT DOCUMENTATION
  13. NVIDIA DeepStream SDK 开发人员指南
  14. Github Issues: colcon build fails