前言

Ubuntu22.04->Ubuntu20.04->Ubuntu22.04->Ubunut20.04


关于这个软件的配置和安装,看到以上的四个系统版本,首先会联想到什么 ?

高情商:装机经验丰富
低情商:系统被反复玩坏

反正我就是这样,如此“简单”的一个软件,我在自己的台式机上来回装了四五遍(我辛辛苦苦配置的路径和软件就这么没了),从装在conda虚拟环境 里、装在用户 目录下、装在系统目录下(然后系统就寄了),最终回过头来,还是决定装在docker里面,这才是最终的解决方案。在此也推荐正在看到这篇博客 的你,除非对自己的包管理能力充分自信,否则还是装在docker里面吧(当然富哥另说)。

目前也只是完成了一个安装,我仿真是一点不会,能记到多少,先把它写下来,后面不走回头路。

安装心得

首先在安装前,要充分地考察自己的需求,即,是否需要安装ROS系统。我在重装之前的初次安装中,一来就是毫无顾忌地装ROS,还是Bug极多的ROS2,犯了兵家大忌之一;二来是在安装完ROS2后,又迫不及待地去找了另一个博客去安装Gazebo,谁知这两个博客的内容是自相矛盾的,在编译的时候压根编译不过。

本来还想去B站上找一些教程跟着学把它给装好呢,结果B站上的参差不齐,就没见过有人使用Ubuntu22.4来装ROS的

最流行的还是使用Ubuntu18.04安装ROS1,在本文中,主要介绍使用Ubuntn20.04在不安装ROS的情况下,直接完成PX4Gazebo的安装。

前置条件

  1. Docker可以正常使用
    首先默认已经完成Docker的安装,并保证当前用户位于docker用户组中,即可以查看docker的镜像列表和容器列表,可使用以下命令:
1
2
docker images ls
docker ps -a

将分别展示当前系统中缓存的全部镜像和容器。

  1. Nvidia原装驱动完整
    其次,需要保证当前系统已经完成Nvidia原装驱动的安装,在保证nvidia-smi有输出以外,还需要保证驱动由Nvidia官方提供,可通过“软件和更新”选项完成稳定的专有驱动安装,目前为止,本文所使用的联合仿真环境并不需要CUDA和CUDNN的支持,不过,随着仿真和算法的深入,它们是必不可少的,因此也推荐安装CUDA和CUDNN。

我在使用容器的过程中遇到**Error could not select device driver ““ with capabilities: [[gpu]]**错误

该错误是缺少来自Nvidia官方的容器驱动,可参考如下博客完成修复。

  1. PX4仓库提前下载。
    PX4是著名的无人机软硬件开源项目,其官方的github链接可由此访问。PX4的仓库代码量和子模块数量巨大,如果在容器中下载,将再次需要配置容器aptpip等下载工具的镜像源,不方便操作,因此可以在宿主机上提前完成下载,可通过如下命令完成:
1
2
3
cd /workspace # 你的工作目录
git clone git@github.com:PX4/PX4-Autopilot.git --recursive
# git clone https://github.com/PX4/PX4-Autopilot.git --recursive

并注意检查下载的子模块中是否有报错,如果有,极有可能子模块下载不完整,为了避免在编译过程中出现引用问题,请使用以下命令确保子模块完整:

1
2
cd PX4-Autopilot
git submodule update --init --recursive

安装步骤

  1. 首先需要拉取镜像,这里可以使用前人提供的带有完整的Nvidia开发环境的镜像(就是镜像稍大了点,不过Bug保证能少很多),可通过如下命令完成:
1
docker pull rezenders/ignition:hackathon-nvidia

网络环境不好的,可以通过配置docker的镜像源加速下载,亦可将其下载至本地后导入。具体方法可见官方文档

  1. 启动容器,以下载得到的镜像为基础,构建容器,使用如下命令:
1
2
3
4
5
6
7
8
9
10
11
docker run -it --privileged \
--gpus all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-v ~/src:/src:rw \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY \
-u docker \
--network=host \
--name=p4 \
ros:noetic \
/bin/bash

说明:这里最关键的一个参数是-e NVIDIA_DRIVER_CAPABILITIES=all,其确保容器能够使用宿主机的CUDA和驱动等工具,避免在容器中重新配置。此外,挂载的路径和文件夹可自行配置,需要与之前自己下载的PX4仓库路径一致。本条命令参考自博客

  1. 安装Gazebo

请注意,本步骤将在容器内部进行!

根据PX4提供的官方用户手册,Ubuntu20.04对应的Gazebo是classic版本,可以使用如下的命令完成安装:

1
2
3
sudo apt remove gz-garden
sudo apt install aptitude
sudo aptitude install gazebo libgazebo11 libgazebo-dev

实际上20.04版本的也兼容更高级的仿真器。例如,如果要安装garden版本的Gazebo,可以使用如下命令:

1
2
3
4
sudo wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null
sudo apt-get update
sudo apt-get install gz-garden

两者对应的版本的界面不同,只能存在一个(其实好像共存也没有问题)
4. 编译PX4
这一步同样在容器内部进行,首先需要进入至挂载点,这里以/workspace/PX4-Autopilot这例,在该目录下,执行一次:

1
bash ./Tools/setup/ubuntu.sh

该脚本将自动完成必需包的安装与配置,此外,也可以有特别的输入参数可供选择,详情请参考官方文档
如果顺利,这一步的编译过程中将不报错,此时已经安装完毕,可进行下一步的验证。

验证安装

首先第一步,千万别忘记,不然开不了图形界面。

要在宿主机上开启图形权限

可运行命令:

1
2
3
xhost +
# 或者
# xhost +local

在上一步完成PX4文件的编译后,仍然在该目录下,可根据下表选取不同型号的无人机,测试仿真环境搭建正常:

无人机型号 命令行 PX4_SYS_AUTOSTART
Quadrotor(x500) make px4_sitl gz_x500 4001
Quadrotor(x500) with Depth Camera make px4_sitl gz_x500_depth 4002
Quadrotor(x500) with Vision Odometry make px4_sitl gz_x500_vision 4005
VTOL make px4_sitl gz_standard_vtol 4004
Plane make px4_sitl gz_rc_cessna 4003
Advanced Plane make px4_sitl gz_advanced_plane 4008
表格来自官方文档,表格对应的gazebo版本是garden,如果是classic版本,可参考以下表格

任意输入一个,如make px4_sitl gz_x500,可得如下界面:
单独无人机的界面

安装小结

安装前一定要注意需求,是否需要安装ROS,尤其注意不能参考得太杂,极其容易产生依赖项问题。在完成安装后,运行docker前需要在宿主机上开始图形界面权限,否则容器运行的仿真程序不能输出至宿主机上。

使用心得

在实际的使用过程中,才意识到必须要使用ROS,由此上述的安装其实也并不完全。我准备再开一篇新的博客专门介绍如何安装ros和并学习使用它,这篇博客的地址在这里Docker安装ROS