# 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