保姆级教程:Ubuntu 20.04下用Docker容器快速构建PX4开发环境

在无人机开发领域,环境配置一直是新手面临的第一道门槛。传统方式需要手动安装数十个依赖项,不仅耗时费力,还容易因系统环境差异导致各种兼容性问题。本文将带你用Docker容器这一现代化工具,在Ubuntu 20.04系统上快速搭建一个隔离、可复现的PX4开发环境,彻底告别"在我的机器上能运行"的经典难题。

1. 环境准备与基础配置

1.1 系统要求与Docker安装

推荐使用Ubuntu 20.04 LTS作为宿主系统,这个版本不仅长期支持,也与PX4官方Docker镜像保持最佳兼容。首先确保系统已更新:

sudo apt update && sudo apt upgrade -y

安装Docker引擎是第一步,官方提供的一键安装脚本最为可靠:

curl -fsSL https://get.docker.com | sudo sh

验证安装是否成功:

sudo docker run hello-world

提示:将当前用户加入docker组可避免每次使用sudo: sudo usermod -aG docker $USER ,执行后需注销重新登录生效

1.2 配置Docker加速镜像

国内用户常遇到镜像拉取缓慢的问题,可通过配置镜像加速解决。创建或修改 /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://mirror.iscas.ac.cn",
    "https://docker.1ms.run"
  ]
}

重启服务使配置生效:

sudo systemctl restart docker

2. PX4开发环境容器化方案

2.1 官方镜像选择策略

PX4团队维护了多个不同用途的Docker镜像,主要分为几个层级:

镜像名称 包含组件 适用场景
px4io/px4-dev-base-focal 基础编译环境 最小化安装
px4io/px4-dev-nuttx-focal 基础+Nuttx OS工具链 飞控固件编译
px4io/px4-dev-simulation-focal 基础+Gazebo/jMAVSim等模拟器 软件在环仿真(SITL)
px4io/px4-dev-ros2-foxy 基础+ROS2 Foxy框架 ROS2集成开发

对于大多数开发者, px4io/px4-dev-simulation-focal 是最平衡的选择,它同时包含编译和仿真所需的所有工具。

2.2 源码获取与容器启动

创建工作目录并克隆PX4源码:

mkdir -p ~/px4_ws/src && cd ~/px4_ws/src
git clone https://github.com/PX4/PX4-Autopilot.git --recursive

拉取仿真开发镜像:

docker pull px4io/px4-dev-simulation-focal

启动容器时需特别注意目录映射和显示设置:

xhost +local:docker
docker run -it --privileged \
  -v ~/px4_ws/src:/src \
  -v /tmp/.X11-unix:/tmp/.X11-unix:ro \
  -e DISPLAY=$DISPLAY \
  --name px4_dev \
  --network host \
  px4io/px4-dev-simulation-focal

注意: --privileged 参数赋予容器访问宿主设备的权限,这对硬件调试是必要的

3. 常见问题深度解决

3.1 Java版本冲突问题

当使用jMAVSim仿真时,可能遇到Java版本不兼容的错误:

Unrecognized option: --add-exports
Error: Could not create the Java Virtual Machine.

这是因为旧版Java(如1.8)不支持新语法。容器内执行以下命令解决:

apt update && apt install -y openjdk-11-jdk
update-alternatives --config java  # 选择Java 11

验证版本:

java -version  # 应显示"11.x.x"

3.2 仿真加速技巧

默认仿真速度较慢,可通过环境变量提升10倍速:

export PX4_SIM_SPEED_FACTOR=10
make px4_sitl jmavsim

对于性能要求更高的场景,推荐使用Gazebo Classic:

make px4_sitl gazebo-classic

3.3 多容器协作方案

当需要同时进行固件编译和仿真时,可采用多容器方案:

# 编译容器
docker run -itd --name px4_build -v ~/px4_ws/src:/src px4io/px4-dev-nuttx-focal

# 仿真容器 
docker run -itd --name px4_sim -v ~/px4_ws/src:/src --network host px4io/px4-dev-simulation-focal

通过 docker exec 在容器间切换:

docker exec -it px4_build make px4_fmu-v3_default
docker exec -it px4_sim make px4_sitl gazebo

4. 进阶开发技巧

4.1 地面站集成

QGroundControl(QGC)是PX4的官方地面站,下载地址:

wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.AppImage
chmod +x QGroundControl.AppImage
./QGroundControl.AppImage

配置MAVLink通信:

mavlink start -p -u 14556 -o 14550

4.2 自定义镜像构建

当需要添加特殊依赖时,可基于官方镜像构建自定义镜像。创建 Dockerfile

FROM px4io/px4-dev-simulation-focal

# 安装额外工具
RUN apt update && apt install -y \
    python3-pip \
    ros-noetic-mavros

# 配置工作环境
WORKDIR /src

构建并运行:

docker build -t px4-custom .
docker run -it --rm px4-custom

4.3 硬件调试技巧

烧录固件到Pixhawk硬件时,确保设备权限正确:

sudo usermod -a -G dialout $USER
sudo apt install modemmanager

常用烧录命令:

make px4_fmu-v5_default upload  # 针对不同硬件修改目标名称

遇到烧录失败时,尝试复位Bootloader:按住飞控板上的复位按钮同时连接USB。

更多推荐