跳至内容

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 固件时,我们建议 以非根用户身份使用 docker.这样,使用 docker 后,你的构建文件夹就不会被 root 拥有了。

# 创建 docker 组(可能不需要)
苏都 分组添加 装卸工
# 将你的用户加入 docker 组。
苏都 篡改 -aG 装卸工 $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-ros2-rolling
- px4io/px4-dev-base-jammy
  - px4io/px4-dev-nuttx-jammy

最新版本可使用 最新 标签 px4io/px4-dev-nuttx-focal:latest (每个容器的可用标签列于 hub.docker.com.例如 px4io/px4-dev-nuttx-focal 可以找到标记 这里).

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 'make 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
装卸工 运行 -它 --特权 \
    --env=LOCAL_USER_ID="$(本我 -u)"; \
    -v <;主机c>;:<;容器 SRc>;:rw \
    -v /tmp/.X11-unix:/tmp/.X11-unix:ro \
    -e DISPLAY=:0 \
    -p 14570:14570/udp \
    --名称=<;本地容器名称>; <;蕴藏r>;:<;tag>; <;build_command>;

在哪里?

  • <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
装卸工 运行 -它 --特权 \
--env=LOCAL_USER_ID="$(本我 -u)"; \
-v ~/src/PX4-Autopilot:/src/PX4-Autopilot/:rw \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-e DISPLAY=:0 \
--网络 东道主 \
--名称=px4-ros px4io/px4-dev-ros2-foxy:2022-07-31 敲击

信息

我们使用主机网络模式,是为了避免在与 docker 容器相同的系统上使用 QGroundControl 时,UDP 端口访问控制发生冲突。

信息

如果遇到 "Can't open display: :0" 错误、 显示屏 可能需要设置为不同的值。在 Linux(XWindow)主机上,您可以更改 -e DISPLAY=:0-e DISPLAY=$DISPLAY.在其他主机上,您可以遍历 0-e DISPLAY=:0 直到 "Can't open display: :0" 错误消失。

如果一切顺利,你现在应该进入了一个新的 bash shell。运行 SITL 验证是否一切正常:

CD src/PX4-Autopilot    #This is <container_src>;
生产 px4_sitl_default 古董

重新进入集装箱

docker run 命令只能用于创建一个新容器。要返回这个容器(它将保留你的更改),只需执行

# 启动容器
装卸工 启动 容器名称
# 在此容器中打开一个新的 bash shell
装卸工 执行 -它 容器名称 敲击

如果需要多个 shell 连接到容器,只需打开一个新 shell 并再次执行最后一条命令即可。

清除容器

有时,您可能需要彻底清除一个容器。您可以使用其名称来清除:

装卸工 rm 我的容器

如果记不住名称,可以列出不活动的容器 ID,然后将其删除,如下图所示:

装卸工 ps -a -q
45eeb98f1dd9
装卸工 rm 45eeb98f1dd9

QGroundControl

当在 docker 容器内运行模拟实例(如 SITL)并通过 QGroundControl 因此,必须手动设置通信链路。自动连接功能 QGroundControl 在这里不起作用。

QGroundControl,导航至 设置 并选择 Comm Links(通信链接)。创建一个使用 UDP 协议的新链接。端口取决于所使用的 配置 例如,SITL 配置的端口为 14570。IP 地址是 docker 容器的 IP 地址,使用默认网络时通常是 172.17.0.1/16。使用以下命令可以找到 docker 容器的 IP 地址(假设容器名称为 我的容器):

$ 装卸工 查阅 -f '{ {range .NetworkSettings.Networks}}{ {.IPAddress}}{ {end}}'; 我的容器

信息

上述双引号之间不应存在空格(需要空格以避免在 gitbook 中出现 UI 渲染问题)。

故障排除

权限错误

容器根据需要使用默认用户(通常是 root 用户)创建文件。这可能会导致权限错误,即主机上的用户无法访问容器创建的文件。

上面的示例使用了以下一行 --env=LOCAL_USER_ID="$(id -u)"; 在容器中创建一个用户,其 UID 与主机上的用户相同。这将确保在容器中创建的所有文件都可以在主机上访问。

图形驱动程序问题

运行 Gazebo Classic 可能会出现类似下面的错误信息:

libGL 错误: 失败 负荷 司机 泔水

在这种情况下,必须安装主机系统的本地图形驱动程序。下载正确的驱动程序并将其安装到容器中。对于 Nvidia 驱动程序,应使用以下命令(否则安装程序会看到主机已加载模块并拒绝继续):

./NVIDIA-DRIVER.run -a -N --ui=无 --无内核模块

更多相关信息请参见 这里.

虚拟机支持

任何最新的 Linux 发行版都可以使用。

对以下配置进行了测试:

  • 使用 VMWare Fusion 和 Ubuntu 14.04 的 OS X(Parallels 上支持图形用户界面的 Docker 容器会导致 X-Server 崩溃)。

内存

虚拟机至少使用 4GB 内存。

编译问题

如果编译失败,出现如下错误

 飞虫 可重复、 那么 有可能 a 硬件 操作系统 问题
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