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