Docker安装PX4+Gazebo安装与仿真心得
前言
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的情况下,直接完成PX4
和Gazebo
的安装。
前置条件
- Docker可以正常使用
首先默认已经完成Docker的安装,并保证当前用户位于docker用户组中,即可以查看docker
的镜像列表和容器列表,可使用以下命令:
1 | docker images ls |
将分别展示当前系统中缓存的全部镜像和容器。
- Nvidia原装驱动完整
其次,需要保证当前系统已经完成Nvidia原装驱动的安装,在保证nvidia-smi
有输出以外,还需要保证驱动由Nvidia官方提供,可通过“软件和更新”选项完成稳定的专有驱动安装,目前为止,本文所使用的联合仿真环境并不需要CUDA和CUDNN的支持,不过,随着仿真和算法的深入,它们是必不可少的,因此也推荐安装CUDA和CUDNN。
我在使用容器的过程中遇到**Error could not select device driver ““ with capabilities: [[gpu]]**错误
该错误是缺少来自Nvidia官方的容器驱动,可参考如下博客完成修复。
- PX4仓库提前下载。
PX4是著名的无人机软硬件开源项目,其官方的github链接可由此访问。PX4的仓库代码量和子模块数量巨大,如果在容器中下载,将再次需要配置容器apt
和pip
等下载工具的镜像源,不方便操作,因此可以在宿主机上提前完成下载,可通过如下命令完成:
1 | cd /workspace # 你的工作目录 |
并注意检查下载的子模块中是否有报错,如果有,极有可能子模块下载不完整,为了避免在编译过程中出现引用问题,请使用以下命令确保子模块完整:
1 | cd PX4-Autopilot |
安装步骤
- 首先需要拉取镜像,这里可以使用前人提供的带有完整的Nvidia开发环境的镜像(就是镜像稍大了点,不过Bug保证能少很多),可通过如下命令完成:
1 | docker pull rezenders/ignition:hackathon-nvidia |
网络环境不好的,可以通过配置docker的镜像源加速下载,亦可将其下载至本地后导入。具体方法可见官方文档。
- 启动容器,以下载得到的镜像为基础,构建容器,使用如下命令:
1 | docker run -it --privileged \ |
说明:这里最关键的一个参数是-e NVIDIA_DRIVER_CAPABILITIES=all
,其确保容器能够使用宿主机的CUDA和驱动等工具,避免在容器中重新配置。此外,挂载的路径和文件夹可自行配置,需要与之前自己下载的PX4仓库路径一致。本条命令参考自博客。
- 安装Gazebo
请注意,本步骤将在容器内部进行!
根据PX4提供的官方用户手册,Ubuntu20.04对应的Gazebo是classic
版本,可以使用如下的命令完成安装:
1 | sudo apt remove gz-garden |
实际上20.04版本的也兼容更高级的仿真器。例如,如果要安装garden
版本的Gazebo,可以使用如下命令:
1 | sudo wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg |
两者对应的版本的界面不同,只能存在一个(其实好像共存也没有问题)
4. 编译PX4
这一步同样在容器内部进行,首先需要进入至挂载点,这里以/workspace/PX4-Autopilot
这例,在该目录下,执行一次:
1 | bash ./Tools/setup/ubuntu.sh |
该脚本将自动完成必需包的安装与配置,此外,也可以有特别的输入参数可供选择,详情请参考官方文档。
如果顺利,这一步的编译过程中将不报错,此时已经安装完毕,可进行下一步的验证。
验证安装
首先第一步,千万别忘记,不然开不了图形界面。
要在宿主机上开启图形权限
可运行命令:
1 | xhost + |
在上一步完成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。