1. 项目概述:PX4与Ubuntu的完美结合
作为一名无人机开发者,我深知PX4飞控系统在开源无人机生态中的核心地位。而Ubuntu作为最受欢迎的Linux发行版之一,其稳定性和丰富的工具链使其成为PX4开发的理想平台。本文将详细记录在Ubuntu 22.04和24.04 LTS版本上配置PX4开发环境的完整过程,涵盖从基础环境搭建到编译调试的全流程。
PX4是一个开源的无人机飞行控制软件,支持多种硬件平台和飞行器类型。它采用模块化设计,包含飞行控制、状态估计、任务规划等核心功能。在Ubuntu上配置PX4环境,可以充分利用Linux系统的开发优势,如强大的命令行工具、完善的开发库和高效的编译系统。
提示:虽然Ubuntu 24.04是最新LTS版本,但22.04仍然是目前最稳定的选择,特别是在企业级开发环境中。本文会同时覆盖两个版本的配置差异。
2. 环境准备与依赖安装
2.1 系统基础配置
首先确保系统是最新状态。打开终端(Ctrl+Alt+T)执行以下命令:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git
对于Ubuntu 24.04用户,需要特别注意Python版本的差异。24.04默认使用Python 3.12,而PX4目前(2024年)官方推荐Python 3.8-3.10。解决方案是使用pyenv管理多版本Python:
bash复制curl https://pyenv.run | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv install 3.10.12
pyenv global 3.10.12
2.2 安装PX4核心依赖
PX4开发需要一系列工具链和库文件。以下是适用于两个版本的通配安装命令:
bash复制sudo apt install -y \
ninja-build exiftool ninja-build protobuf-compiler \
libeigen3-dev genromfs xmlstarlet libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev python3-pip python3-setuptools \
python3-wheel build-essential
对于Ubuntu 22.04,需要额外安装较新版本的CMake(≥3.16):
bash复制sudo apt remove -y cmake
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null
sudo apt update && sudo apt install -y cmake
2.3 配置ARM工具链
PX4需要ARM交叉编译工具链来构建固件。推荐使用官方提供的自动安装脚本:
bash复制wget https://raw.githubusercontent.com/PX4/PX4-Autopilot/main/Tools/setup/ubuntu.sh
bash ubuntu.sh --no-nuttx --no-sim-tools
注意:如果网络环境导致下载失败,可以尝试分段下载工具链组件,或使用国内镜像源。
3. PX4源码获取与工作区配置
3.1 克隆PX4源码仓库
建议在用户主目录下创建工作区:
bash复制mkdir -p ~/px4_ws/src
cd ~/px4_ws/src
git clone --recursive https://github.com/PX4/PX4-Autopilot.git
cd PX4-Autopilot
对于国内用户,可以使用Gitee镜像加速克隆:
bash复制git clone --recursive https://gitee.com/mirrors/PX4-Autopilot.git
3.2 初始化子模块
PX4依赖多个子模块,初始化过程可能需要较长时间:
bash复制git submodule sync --recursive
git submodule update --init --recursive
如果遇到子模块更新失败,可以尝试逐个初始化主要子模块:
bash复制cd Tools
git submodule update --init --recursive
cd ../src/modules/uavcan/libuavcan
git submodule update --init --recursive
3.3 配置Python虚拟环境
为避免Python包冲突,建议为PX4创建专用虚拟环境:
bash复制python -m venv px4env
source px4env/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
对于Ubuntu 24.04用户,可能需要额外安装较旧版本的numpy:
bash复制pip install "numpy<1.25"
4. 编译与调试配置
4.1 首次编译测试
使用以下命令进行首次编译测试(以PX4 FMUv6为例):
bash复制make px4_fmu-v6_default
编译成功后,输出文件位于build/px4_fmu-v6_default/px4_fmu-v6_default.px4。
常见问题:如果遇到"unsupported GNU version"错误,可能是gcc-arm版本过高。解决方案是指定较旧的工具链版本:
bash复制export PATH=/opt/gcc-arm-none-eabi-9-2020-q2-update/bin:$PATH
4.2 配置多目标编译
PX4支持多种硬件目标,可以通过以下命令查看所有可用配置:
bash复制make list_config_targets
常用的编译目标包括:
px4_fmu-v5_default:适用于Pixhawk 4等硬件px4_fmu-v6_default:适用于Pixhawk 6X等新硬件px4_sitl_default:用于软件在环仿真
4.3 集成开发环境配置
虽然PX4可以通过命令行编译,但使用IDE能显著提高开发效率。推荐配置VSCode开发环境:
-
安装VSCode和必要扩展:
bash复制sudo apt install -y code code --install-extension ms-vscode.cpptools code --install-extension twxs.cmake -
创建工作区配置(.vscode/settings.json):
json复制{ "cmake.configureArgs": [ "-DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/Toolchain-arm-none-eabi.cmake" ], "C_Cpp.default.includePath": [ "${workspaceFolder}/**", "/opt/gcc-arm-none-eabi-*/arm-none-eabi/include" ] } -
配置调试环境(.vscode/launch.json):
json复制{ "version": "0.2.0", "configurations": [ { "name": "PX4 SITL Debug", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/px4_sitl_default/bin/px4", "args": [ "${workspaceFolder}/ROMFS/px4fmu_common", "-s", "${workspaceFolder}/ROMFS/px4fmu_common/init.d-posix/rcS" ], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }
5. 高级配置与优化
5.1 加速编译过程
PX4代码库庞大,编译耗时较长。以下是几种优化方案:
-
启用ccache缓存:
bash复制sudo apt install -y ccache echo 'export PATH="/usr/lib/ccache:$PATH"' >> ~/.bashrc source ~/.bashrc -
并行编译(根据CPU核心数调整):
bash复制make -j$(nproc) px4_fmu-v6_default -
选择性编译模块(通过修改boards/xxx/default.cmake文件)
5.2 硬件调试配置
实际硬件调试需要配置OpenOCD和调试探头:
bash复制sudo apt install -y openocd
对于J-Link调试器,需要额外安装驱动:
bash复制wget https://www.segger.com/downloads/jlink/JLink_Linux_V788a_x86_64.deb
sudo dpkg -i JLink_Linux_V788a_x86_64.deb
配置GDB硬件调试:
bash复制arm-none-eabi-gdb build/px4_fmu-v6_default/px4_fmu-v6_default.elf
target extended-remote :3333
monitor reset halt
load
5.3 仿真环境配置
Gazebo是PX4主要的仿真环境,安装命令如下:
bash复制sudo apt install -y gazebo libgazebo-dev
对于Ubuntu 24.04,可能需要从源码编译较新版本的Gazebo:
bash复制sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'
wget https://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
sudo apt update && sudo apt install -y gazebo11
启动SITL仿真:
bash复制make px4_sitl gazebo-classic
6. 常见问题与解决方案
6.1 编译错误排查
-
Python相关错误:
- 现象:ImportError或语法错误
- 解决方案:
bash复制python --version # 确认是3.8-3.10 pip install -r requirements.txt --force-reinstall
-
子模块初始化失败:
- 现象:git submodule update失败
- 解决方案:
bash复制
git submodule deinit -f . git submodule update --init --recursive
-
内存不足错误:
- 现象:g++被kill或internal compiler error
- 解决方案:
bash复制sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
6.2 硬件连接问题
-
USB设备权限问题:
- 现象:无法识别飞控板
- 解决方案:
bash复制sudo usermod -a -G dialout $USER sudo apt install -y modemmanager sudo systemctl disable --now modemmanager
-
串口通信不稳定:
- 现象:频繁断开连接
- 解决方案:
bash复制sudo stty -F /dev/ttyACM0 921600 raw -echo -echoe -echok
6.3 仿真环境问题
-
Gazebo黑屏或无模型:
- 解决方案:
bash复制export GAZEBO_MODEL_PATH=${GAZEBO_MODEL_PATH}:~/px4_ws/src/PX4-Autopilot/Tools/sitl_gazebo/models export GAZEBO_RESOURCE_PATH=${GAZEBO_RESOURCE_PATH}:~/px4_ws/src/PX4-Autopilot/Tools/sitl_gazebo
- 解决方案:
-
SITL启动缓慢:
- 解决方案:预下载Gazebo模型
bash复制
wget -P ~/.gazebo/models http://models.gazebosim.org/model.tar.gz
- 解决方案:预下载Gazebo模型
7. 开发工作流建议
7.1 日常开发流程
-
代码修改与验证:
bash复制# 修改代码后 make px4_sitl gazebo-classic # 快速验证 make px4_fmu-v6_default # 硬件编译 -
单元测试:
bash复制./Tools/sitl_run.sh ./build/px4_sitl_default/bin/px4 test -
代码格式化:
bash复制
./Tools/check_code_style_all.sh
7.2 版本控制策略
-
分支管理:
main分支:保持与官方同步dev-xxx分支:功能开发分支test-xxx分支:测试分支
-
提交规范:
- 类型(范围): 描述
- 示例:
code复制fix(control): correct altitude hold PID tuning feat(sensors): add BMP388 barometer support
7.3 性能优化技巧
-
减小固件体积:
- 修改
boards/px4/fmu-v6/default.cmake中的模块列表 - 使用
CONFIG参数裁剪功能:bash复制
make px4_fmu-v6_default CONFIG=nsh
- 修改
-
提高编译速度:
bash复制make distclean make px4_fmu-v6_default -j$(nproc) CCACHE=1 -
内存使用分析:
bash复制
arm-none-eabi-size --format=berkeley build/px4_fmu-v6_default/px4_fmu-v6_default.elf
在实际开发中,我发现保持开发环境干净非常重要。建议定期执行make distclean清理中间文件,特别是切换编译目标时。另外,使用git submodule foreach git clean -xdf可以彻底清理所有子模块的生成文件