# PX4 Docker 容器
提供的 Docker 容器可用于完整的 PX4 开发工具链 包括基于 NuttX 和 Linux 的硬件、 仿真场景Gazebo模拟 和 ROS.
本主题介绍如何使用 可用的 docker 容器 来访问本地 Linux 计算机中的构建环境。
备注
Dockerfiles 和 README 可在以下网址找到 Github 这里 (打开新窗口).它们是在 Docker Hub (打开新窗口).
# 先决条件
备注
PX4 容器目前仅支持 Linux 系统(如果没有 Linux 系统,可以运行容器 虚拟机内).请勿使用 boot2docker
因为默认 Linux 映像不包含 X-Server。
安装 Docker (打开新窗口) 最好使用 Docker 维护的软件包仓库之一来获取最新的稳定版本。您可以使用 企业版 或(免费) 社区版.
用于在以下设备上本地安装非生产设置 乌班图,安装 Docker 最快速、最简单的方法是使用 方便脚本 (打开新窗口) 如下所示(其他安装方法见同一页):
卷曲 -fsSL get.docker.com -o get-docker.sh
苏都 吁 get-docker.sh
默认安装要求调用 Docker 作为根用户(即使用 苏都
).不过,在构建 PX4 firwmare 时,我们建议 以非根用户身份使用 docker (打开新窗口).这样,使用 docker 后,你的构建文件夹就不会被 root 拥有了。
# 创建 docker 组(可能不需要)
苏都 分组添加 装卸工
# 将你的用户加入 docker 组。
苏都 篡改 -aG docker $USER
# 在使用 docker 之前再次登录/退出!
# 容器层次结构
可用的集装箱在 Github 这里 (打开新窗口).
这些容器允许测试各种构建目标和配置(可从其名称推断所包含的工具)。容器是分级的,因此容器具有其父级容器的功能。例如,你可以在下面看到带有 nuttx 构建工具的 docker 容器 (px4-dev-nuttx-focal
) 不包含 ROS 2,而模拟容器包含 ROS 2:
- px4io/px4-dev-base-focal
- px4io/px4-dev-nuttx-focal
- px4io/px4-dev-simulation-focal
- px4io/px4-dev-ros-noetic
- px4io/px4-dev-ros2-foxy
最新版本可使用 最新
标签 px4io/px4-dev-nuttx-bionic:latest
(每个容器的可用标签列于 hub.docker.com.例如 px4io/px4-dev-nuttx-bionic
可以找到标记 这里 (打开新窗口)).
TIP
通常情况下,您应该使用最近的容器,但不一定要使用 最新
(因为这种变化太频繁了)。
# 使用 Docker 容器
以下说明介绍了如何使用在 docker 容器中运行的工具链在主机上构建 PX4 源代码。该信息假定您已将 PX4 源代码下载到 src/PX4-Autopilot如图所示:
mkdir 来源
CD 来源
Git 克隆 https://github.com/PX4/PX4-Autopilot.git
CD PX4-自动驾驶仪
# 辅助脚本 (docker_run.sh)
使用容器的最简单方法是通过 docker_run.sh (打开新窗口) 辅助脚本。该脚本以 PX4 构建命令为参数(如 试验
).它会使用相应容器的最新版本(硬编码)和合理的环境设置启动 docker。
例如,要构建 SITL,您可以(在 /PX4-自动驾驶仪 目录):
./Tools/docker_run.sh 制作 px4_sitl_default
或使用 NuttX 工具链启动 bash 会话:
./Tools/docker_run.sh "bash
TIP
该脚本非常简单,因为您不需要了解太多关于 Docker 或考虑使用什么容器。不过,这种方法并不是特别稳健!中讨论的手动方法 下节 更灵活,如果脚本有任何问题,应使用它。
# 手动调用 Docker
典型命令的语法如下所示。这将运行一个支持 X 转发的 Docker 容器(使模拟图形用户界面可在容器内使用)。它将目录 <host_src>;
从您的计算机到 <container_src>;
并转发连接所需的 UDP 端口。 QGroundControl.用 --特权
选项,它将自动访问主机上的设备(例如操纵杆和 GPU)。如果连接/断开设备,则必须重启容器。
# 启用从容器访问 xhost
xhost +
# 运行 docker
docker run -it -privileged \
--环境=LOCAL_USER_ID=";$(本我 -u)"; \
-v <;主机源文件>;:<;容器源代码>;:rw \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-e 显示屏=:0 \
-p 14570:14570/udp \
--名称=<;本地容器名称>; <;集装箱>;:<;标签>; <;构建命令>;
在哪里?
<host_src>;
:要映射到的主机目录<container_src>;
在容器中。通常应该是 PX4-自动驾驶仪 目录。<container_src>;
:容器内共享(源)目录的位置。<local_container_name>;
:正在创建的 docker 容器的名称。如果我们需要再次引用该容器,可以使用这个名称。<容器>:<标签>;
:要启动的带有版本标记的容器 - 例如px4io/px4-dev-ros:2017-10-23
.<构建命令>;
:要在新容器上调用的命令。例如敲击
用于在容器中打开 bash shell。
下面的具体示例展示了如何打开 bash shell 并共享目录 ~/src/PX4-Autopilot 在主机上。
# 启用从容器访问 xhost
xhost +
# 运行 docker 并打开 bash shell
docker run -it -privileged \
--环境=LOCAL_USER_ID=";$(本我 -u)"; \
-v ~/src/PX4-Autopilot:/src/PX4-Autopilot/:rw \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-e 显示屏=:0 \
-p 14570:14570/udp \
--名称=mycontainer px4io/px4-dev-ros:2017-10-23 敲击
如果一切顺利,你现在应该进入了一个新的 bash shell。运行 SITL 验证是否一切正常:
CD src/PX4-Autopilot #This is <container_src>;
生产 px4_sitl_default 仿真场景Gazebo
# 重新进入集装箱
docker run
命令只能用于创建一个新容器。要返回这个容器(它将保留你的更改),只需执行
# 启动容器
docker start container_name
# 在此容器中打开一个新的 bash shell
装卸工 执行 -it容器名称 敲击
如果需要多个 shell 连接到容器,只需打开一个新 shell 并再次执行最后一条命令即可。
# 清除容器
有时,您可能需要彻底清除一个容器。您可以使用其名称来清除:
装卸工 rm 我的容器
如果记不住名称,可以列出不活动的容器 ID,然后将其删除,如下图所示:
装卸工 ps -a -q 45eeb98f1dd9 docker rm 45eeb98f1dd9
# QGroundControl
当在 docker 容器内运行模拟实例(如 SITL)并通过 QGroundControl 因此,必须手动设置通信链路。自动连接功能 QGroundControl 在这里不起作用。
在 QGroundControl,导航至 设置 (打开新窗口) 并选择 Comm Links(通信链接)。创建一个使用 UDP 协议的新链接。端口取决于所使用的 配置 (打开新窗口) 例如,SITL 配置的端口为 14570。IP 地址是 docker 容器的 IP 地址,使用默认网络时通常是 172.17.0.1/16。使用以下命令可以找到 docker 容器的 IP 地址(假设容器名称为 我的容器
):
$ docker inspect -f '{ {range .NetworkSettings.Networks}}{ {.IPAddress}}{ {end}}' { {range .NetworkSettings.Networks}}{ {.IPAddress}}{ {end}}' { {. 我的容器
备注
上述双引号之间不应存在空格(需要空格以避免在 gitbook 中出现 UI 渲染问题)。
# 故障排除
# 权限错误
容器根据需要使用默认用户(通常是 root 用户)创建文件。这可能会导致权限错误,即主机上的用户无法访问容器创建的文件。
上面的示例使用了以下一行 --env=LOCAL_USER_ID="$(id -u)";
在容器中创建一个用户,其 UID 与主机上的用户相同。这将确保在容器中创建的所有文件都可以在主机上访问。
# 图形驱动程序问题
运行 Gazebo 可能会出现类似下面的错误信息:
libGL 错误:加载驱动程序失败:SWAST
在这种情况下,必须安装主机系统的本地图形驱动程序。下载正确的驱动程序并将其安装到容器中。对于 Nvidia 驱动程序,应使用以下命令(否则安装程序会看到主机已加载模块并拒绝继续):
./NVIDIA-DRIVER.run -a -N --ui=无 --no-kernel-module
更多相关信息请参见 这里 (打开新窗口).
# 虚拟机支持
任何最新的 Linux 发行版都可以使用。
对以下配置进行了测试:
- 使用 VMWare Fusion 和 Ubuntu 14.04 的 OS X(Parallels 上支持图形用户界面的 Docker 容器会导致 X-Server 崩溃)。
内存
虚拟机至少使用 4GB 内存。
编译问题
如果编译失败,出现如下错误
该错误无法重现,因此很可能是硬件或操作系统问题。 c++: 内部编译器错误:已杀死 (程序 cc1plus)
尝试禁用并行构建。
允许从虚拟机主机控制 Docker
编辑 /etc/defaults/docker
并添加这一行:
DOCKER_OPTS=";${DOCKER_OPTS} -H unix:///var/run/docker.sock -H 0.0.0.0:2375";
这样,你就可以通过主机操作系统控制 docker:
出口 DOCKER_HOST=tcp://<;虚拟机的 IP 地址>;:2375
# 运行一些 docker 命令查看是否有效,例如 ps
装卸工 ps