3. 开发环境搭建:搭建PX4固件编译环境,配置VS Code或CLion用于代码调试

好,咱们进入实操环节。这一章我带你把开发环境搭起来。说实话,环境配置这件事,看着简单,但坑不少。我见过太多人卡在这一步,一卡就是半天。所以咱们一步步来,把每个细节都讲透。

3.1 整体思路:先搞清楚我们要搭什么

在动手之前,先理清思路。我们要搭建的环境,说白了就三块:

  • 编译环境:能把PX4源码编译成固件,烧到飞控板上去
  • 调试环境:能在代码里打断点、看变量、单步执行
  • 仿真环境:能在电脑上跑PX4,配合Gazebo或jMAVSim做软件在环(SITL)测试

这三块是递进关系。编译环境是基础,调试环境帮你找bug,仿真环境让你不用真机也能测逻辑。我个人习惯,先把编译环境搞定,再配调试工具,最后搞仿真。这样出了问题好排查。

核心要点:PX4的编译环境主要依赖Ubuntu系统(推荐20.04或22.04 LTS)。Windows用户建议装WSL2或者直接上双系统。别在Windows原生环境下折腾,我试过,坑太多。

3.2 编译环境搭建:Ubuntu下的标准流程

我以Ubuntu 22.04为例。如果你用其他版本,流程大同小异,但依赖包的版本号可能不一样。

3.2.1 安装基础依赖

打开终端,先更新包列表:

sudo apt update
sudo apt upgrade -y

然后安装PX4官方推荐的依赖包。这里我直接给命令,你复制粘贴就行:

sudo apt install -y \
  git \
  cmake \
  ninja-build \
  build-essential \
  python3-pip \
  python3-venv \
  python3-dev \
  pkg-config \
  libxml2-dev \
  libxslt1-dev \
  libssl-dev \
  libffi-dev \
  libncurses5-dev \
  libgstreamer-plugins-base1.0-dev \
  gstreamer1.0-plugins-base \
  gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad \
  gstreamer1.0-plugins-ugly \
  gstreamer1.0-libav \
  gstreamer1.0-tools \
  gstreamer1.0-x \
  gstreamer1.0-alsa \
  gstreamer1.0-gl \
  gstreamer1.0-gtk3 \
  gstreamer1.0-qt5 \
  gstreamer1.0-pulseaudio \
  libgstreamer-plugins-base1.0-dev \
  libgstreamer1.0-dev \
  libgstreamer-plugins-good1.0-dev \
  libgstreamer-plugins-bad1.0-dev \
  libgstreamer-plugins-ugly1.0-dev \
  libgstreamer-gl1.0-0 \
  libgstreamer-plugins-base1.0-0 \
  libgstreamer-plugins-good1.0-0 \
  libgstreamer-plugins-bad1.0-0 \
  libgstreamer-plugins-ugly1.0-0 \
  libgstreamer1.0-0 \
  libgstreamer1.0-dev \
  libgstreamer-plugins-base1.0-dev \
  libgstreamer-plugins-good1.0-dev \
  libgstreamer-plugins-bad1.0-dev \
  libgstreamer-plugins-ugly1.0-dev \
  libgstreamer-gl1.0-0 \
  libgstreamer-plugins-base1.0-0 \
  libgstreamer-plugins-good1.0-0 \
  libgstreamer-plugins-bad1.0-0 \
  libgstreamer-plugins-ugly1.0-0

嗯,这里要注意。上面这个列表看着长,但大部分是GStreamer相关的。为什么装这么多?因为PX4的摄像头和视频流功能依赖它。如果你不做视觉相关的开发,可以少装一些。但我建议全装上,省得后面缺东西再补。

3.2.2 安装ARM交叉编译工具链

如果你要编译飞控板(比如Pixhawk系列)的固件,需要ARM交叉编译器:

sudo apt install -y gcc-arm-none-eabi gdb-multiarch

验证一下安装是否成功:

arm-none-eabi-gcc --version

如果输出了版本号,说明装好了。我记得有一次帮同事配环境,他装完死活不认命令,后来发现是PATH没刷新。重启终端就好了。

3.2.3 安装Python依赖

PX4的构建系统用到了Python脚本。建议用虚拟环境隔离:

python3 -m venv px4_venv
source px4_venv/bin/activate
pip install --upgrade pip
pip install pyulog numpy pandas matplotlib

这里我多说一句。用虚拟环境是个好习惯,不会污染系统Python。我早期做项目时图省事,直接pip install全局装,结果某次升级把系统Python搞崩了,重装了系统。从那以后,我每个项目都建虚拟环境。

3.2.4 克隆PX4源码

找个你喜欢的目录,克隆PX4的官方仓库:

git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot

--recursive参数很重要,它会同时拉取所有子模块。PX4依赖很多第三方库,比如uORB、mavlink等。如果忘了加这个参数,后面编译时会报一堆找不到头文件的错误。

如果你网络不好,可以考虑用国内镜像:

git clone https://gitee.com/px4/PX4-Autopilot.git --recursive

3.2.5 首次编译测试

进入源码目录,执行:

make px4_fmu-v5_default

这个命令会编译Pixhawk 4(FMUv5)的固件。第一次编译会比较慢,因为要下载和编译所有依赖。我的机器大概要15-20分钟。你可以去泡杯咖啡。

如果编译成功,最后会输出类似这样的信息:

[100%] Built target px4_fmu-v5_default
-- Build finished: 0 errors, 0 warnings

小技巧:如果你只想测试编译环境是否正常,可以用SITL目标来编译,它不需要交叉编译器:

make px4_sitl_default

这个编译更快,而且可以在本机运行仿真。

3.3 配置VS Code用于代码调试

我个人更推荐VS Code,因为轻量、插件生态好。CLion也不错,但收费且重。咱们先讲VS Code。

3.3.1 安装VS Code和必要插件

从官网下载安装VS Code。然后安装这些插件:

  • C/C++(微软官方):提供代码补全、跳转、调试支持
  • CMake Tools:让VS Code能识别CMake项目
  • Python:如果你要调试Python脚本
  • GitLens:看代码历史很方便
  • Hex Editor:偶尔需要看二进制文件

3.3.2 配置编译任务

在VS Code中打开PX4源码目录。按Ctrl+Shift+P,输入Tasks: Configure Task,选择Create tasks.json file from template,然后选Others

tasks.json改成这样:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build px4_sitl",
      "type": "shell",
      "command": "make px4_sitl_default",
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "problemMatcher": []
    },
    {
      "label": "build px4_fmu-v5",
      "type": "shell",
      "command": "make px4_fmu-v5_default",
      "group": "build",
      "problemMatcher": []
    },
    {
      "label": "clean",
      "type": "shell",
      "command": "make clean",
      "group": "build",
      "problemMatcher": []
    }
  ]
}

这样你就可以按Ctrl+Shift+B直接编译了。我习惯把最常用的编译任务设为默认,省得每次选。

3.3.3 配置调试器

调试SITL仿真时,我们需要配置launch.json。点击左侧的「运行和调试」图标,然后点击「创建launch.json文件」,选择C++ (GDB/LLDB)

把内容改成:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug PX4 SITL",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/px4_sitl_default/bin/px4",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "/usr/bin/gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "build px4_sitl"
    }
  ]
}

这里有个关键点:preLaunchTask指定了在调试前先编译。这样你改完代码,按F5就直接编译+启动调试,一气呵成。

注意:调试SITL时,需要先启动Gazebo或jMAVSim仿真环境。你可以在另一个终端运行make px4_sitl_default gazebo来启动。或者,你也可以在launch.json的args里加上仿真参数,但那样配置会更复杂。我一般分开启动,调试时更灵活。

3.4 配置CLion用于代码调试

如果你用CLion,配置会简单一些,因为它原生支持CMake。但要注意,CLion对大型项目的索引有时会卡。

3.4.1 导入项目

打开CLion,选择File -> Open,选中PX4源码目录。CLion会自动识别CMakeLists.txt,并开始索引。

第一次索引会比较慢,大概5-10分钟。你可以去干点别的。

3.4.2 配置编译配置

点击右上角的Add Configuration,选择CMake Application。然后:

  • Target:选择px4(SITL目标)
  • Executable:会自动填充为build/px4_sitl_default/bin/px4
  • CMake Options:填-DCMAKE_BUILD_TYPE=Debug
  • Build options:填-- -j4(用4核编译,根据你的CPU核心数调整)

然后点OK保存。

3.4.3 开始调试

设置好断点,点击右上角的「Debug」按钮(小虫子图标)。CLion会自动编译并启动调试。

我个人觉得CLion的调试界面比VS Code更直观,尤其是变量监视和内存查看。但VS Code胜在轻量和免费。看你自己喜好。

3.5 环境搭建的常见坑与避坑指南

这部分是我最想说的。环境搭建的坑,我踩过不少,分享给你:

  • 编译报错:找不到头文件——多半是子模块没拉全。运行git submodule update --init --recursive试试。
  • 编译报错:Python模块缺失——检查虚拟环境是否激活了。我经常忘了source px4_venv/bin/activate
  • 调试时断点不生效——检查编译时是否加了-DCMAKE_BUILD_TYPE=Debug。Release模式下优化会打乱代码行号。
  • VS Code无法启动调试——检查miDebuggerPath是否正确。Ubuntu 22.04的gdb路径是/usr/bin/gdb
  • CLion索引卡死——在File -> Settings -> Build, Execution, Deployment -> CMake里,把CMake options加上-DCMAKE_EXPORT_COMPILE_COMMANDS=ON,可以加快索引。

我曾经遇到过一个问题:在Ubuntu 20.04上编译PX4 1.13版本,总是报GCC版本不兼容。折腾了两天,最后发现是系统默认的GCC版本太高(9.3),而PX4 1.13需要GCC 8.x。解决办法是用update-alternatives切换GCC版本。从那以后,我每次搭环境都会先查一下PX4官方文档里推荐的GCC版本。

3.6 本章知识体系总览

下面这张图帮你梳理了本章的核心内容。你可以把它当作一个检查清单,看看自己有没有遗漏什么。

开发环境搭建知识体系 编译环境 调试环境 仿真环境 基础依赖安装 ARM交叉编译工具链 Python虚拟环境 克隆PX4源码 首次编译测试 VS Code插件安装 配置编译任务 配置调试器(launch.json) CLion项目导入 CMake Debug配置 SITL编译 Gazebo/jMAVSim启动 HITL硬件在环 核心原则:先编译后调试,先SITL后真机,遇到问题查官方文档

这张图把本章内容分成了三大块。编译环境是基础,调试环境是工具,仿真环境是验证手段。三者缺一不可。

3.7 验证环境是否搭建成功

最后,给你一个简单的验证清单。每完成一项,打个勾:

序号 验证项 验证方法 预期结果
1 基础依赖安装 gcc --version 输出GCC版本号
2 ARM交叉编译器 arm-none-eabi-gcc --version 输出ARM GCC版本号
3 Python虚拟环境 pip list 显示已安装的Python包
4 PX4源码克隆 ls PX4-Autopilot/ 看到src、boards等目录
5 SITL编译 make px4_sitl_default 编译成功,无错误
6 VS Code调试配置 按F5启动调试 程序启动,断点生效
7 CLion调试配置 点击Debug按钮 程序启动,断点生效

全部打勾,恭喜你,环境搭建完成!你可以开始写代码了。

嗯,这一章内容不少,但都是实打实的操作。别怕麻烦,环境搭好了,后面写代码、调bug都会很顺畅。如果你在搭建过程中遇到问题,先看看官方文档,或者去PX4的讨论区搜一下。大部分坑都有人踩过。


公众号:蓝海资料掘金营,微信deep3321