2. 无人机仿真测试概述

说实话,做无人机仿真这件事,环境搭建往往是劝退最多人的第一道坎。我见过不少朋友,代码写得挺好,结果卡在编译上,一卡就是一整天。所以这一章,咱们把每一步都掰开揉碎了讲清楚。

我个人习惯用 Ubuntu 20.04 LTS,搭配 Gazebo 9 和 PX4 v1.13 稳定版。这套组合我验证过很多次,兼容性最好,坑最少。你如果非要用 22.04 或者最新版,也不是不行,但有些依赖包得自己折腾——嗯,我建议你先按这套来,跑通了再升级。

1. Ubuntu 系统基础配置

拿到一台新装的 Ubuntu 20.04,第一件事不是装软件,而是换源。你想想看,从国外服务器下载几百兆的包,那个速度……我当年第一次编译 PX4,等了快两个小时,结果中途网络断了,心态直接崩了。

换源操作: 推荐使用清华源或阿里云源,速度提升非常明显。
# 备份原 sources.list
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 编辑 sources.list,替换为清华源
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

# 更新
sudo apt update
sudo apt upgrade -y

换完源之后,安装一些基础工具。这些包看着不起眼,但少了任何一个,后面编译都会报一些莫名其妙的错。

sudo apt install -y \
  git zip cmake build-essential \
  python3-pip python3-dev python3-venv \
  ninja-build pkg-config \
  libeigen3-dev libopencv-dev \
  libboost-all-dev libgstreamer1.0-dev \
  libgstreamer-plugins-base1.0-dev \
  libprotobuf-dev protobuf-compiler \
  libxml2-dev libxslt1-dev
注意: 不要跳过 libgstreamer 相关包。Gazebo 的视频流依赖它,少了的话仿真画面会黑屏。我曾经在这上面浪费了整整一个下午。

2. Gazebo 与 PX4 源码编译

Gazebo 的安装其实很简单,官方提供了 apt 源。但我建议你从源码编译 PX4,而不是用 apt 装预编译版本。为什么?因为源码编译能让你拿到最新的 bug 修复,而且后续调试时,你能直接改飞控代码。

2.1 安装 Gazebo 9

# 添加 Gazebo 官方源
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 http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -

# 安装 Gazebo 9
sudo apt update
sudo apt install -y gazebo9 libgazebo9-dev

装完之后,在终端输入 gazebo 看看能不能启动。如果出现一个空荡荡的仿真世界,那就说明装好了。我第一次看到那个灰色网格地面的时候,心里还挺激动的——虽然它啥也没有,但那是万里长征第一步。

2.2 编译 PX4 固件

PX4 的源码托管在 GitHub 上,我们直接 clone 下来。这里有个小技巧:用 --recursive 参数,一次性拉取所有子模块,省得后面再手动更新。

# 克隆 PX4 源码(v1.13 稳定版)
git clone https://github.com/PX4/PX4-Autopilot.git --recursive -b v1.13.3
cd PX4-Autopilot

# 安装 PX4 依赖
bash ./Tools/setup/ubuntu.sh

# 编译 sitl 目标
make px4_sitl gazebo

编译过程大概需要 15-30 分钟,取决于你的机器配置。这时候你可以去泡杯咖啡,或者看看文档。我第一次编译的时候,盯着终端滚动的日志看了十分钟,生怕哪个步骤报错。

常见编译错误及解决:
  • 缺少 FastRTPS: 运行 make px4_sitl gazebo 前,先执行 make px4_sitl list_vmd_make_targets 检查依赖。
  • Python 模块冲突: 建议使用 Python 虚拟环境,避免系统级包污染。
  • 内存不足: 编译时加上 -j2 限制并行任务数,比如 make px4_sitl gazebo -j2。

编译成功后,终端会输出类似这样的信息:

...
[100%] Linking CXX executable px4
px4 starting.

______  __   __    ___
| ___ \ \ \ / /   /   |
| |_/ /  \ V /   / /| |
|  __/   /   \  / /_| |
| |     / /^\ \ \___  |
\_|     \/   \/     |_/

px4 starting.

INFO  [px4] Startup script: /home/user/PX4-Autopilot/build/px4_sitl_default/etc/init.d-posix/rcS
INFO  [simulator] Waiting for simulator to connect on TCP port 4560

看到这个界面,说明 PX4 已经跑起来了,正在等待 Gazebo 连接。这时候别急着关,后面验证环节要用。

3. MAVSDK 与 QGroundControl 安装

有了飞控和仿真环境,我们还需要地面站和控制库。MAVSDK 是 PX4 官方推荐的开发库,QGroundControl 则是功能最全的地面站软件。

3.1 安装 MAVSDK

MAVSDK 提供了 C++ 和 Python 两种接口。我个人更推荐 Python 版本,开发效率高,适合快速验证想法。

# 安装 MAVSDK-Python
pip3 install mavsdk

# 验证安装
python3 -c "import mavsdk; print(mavsdk.__version__)"

如果输出版本号,比如 1.4.17,那就装好了。这里有个坑:MAVSDK 依赖 grpcio,有时候 pip 安装会卡住。解决办法是手动安装 grpcio:

pip3 install grpcio==1.48.2

3.2 安装 QGroundControl

QGroundControl 的安装更简单,直接下载 AppImage 文件就行。但我建议你把它放到一个固定目录,方便后续调用。

# 下载 QGroundControl AppImage
wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.AppImage

# 赋予执行权限
chmod +x QGroundControl.AppImage

# 移动到常用目录
sudo mv QGroundControl.AppImage /opt/

# 创建软链接
sudo ln -s /opt/QGroundControl.AppImage /usr/local/bin/qgroundcontrol

第一次启动 QGC 时,它会自动检测串口和网络连接。如果 PX4 仿真已经跑起来了,QGC 应该能自动连接到 udp://:14550。我记得第一次看到 QGC 地图上出现无人机图标时,那种感觉——嗯,就像你第一次让四轴飞起来一样。

小技巧: 如果 QGC 连不上仿真,检查一下防火墙设置。Ubuntu 默认的 ufw 可能会拦截 UDP 端口。运行 sudo ufw allow 14550/udp 放行即可。

4. 仿真环境验证

所有东西都装好了,怎么确认它们能协同工作?我总结了一套验证流程,每一步都有明确的检查点。

4.1 启动仿真

打开三个终端窗口,分别执行以下命令:

终端 命令 作用
终端 1 cd ~/PX4-Autopilot && make px4_sitl gazebo 启动 PX4 飞控 + Gazebo 仿真
终端 2 qgroundcontrol 启动 QGroundControl 地面站
终端 3 python3 -c "from mavsdk import System; drone = System(); print('MAVSDK ready')" 验证 MAVSDK 连接

启动顺序很重要:先跑 PX4,等它输出 Waiting for simulator to connect 之后,再启动 QGC。如果顺序反了,QGC 可能检测不到仿真端口。

4.2 检查点验证

仿真启动后,检查以下几个关键点:

  • Gazebo 画面: 应该能看到一架四旋翼无人机停在跑道上,周围有建筑物和树木模型。
  • QGC 连接: 左上角显示 Connected,无人机图标出现在地图上,姿态数据实时更新。
  • MAVSDK 通信: 运行以下 Python 脚本,检查是否能获取无人机状态:
import asyncio
from mavsdk import System

async def run():
    drone = System()
    await drone.connect(system_address="udp://:14540")
    
    print("等待无人机连接...")
    async for state in drone.core.connection_state():
        if state.is_connected:
            print(f"已连接到无人机!")
            break
    
    # 获取位置信息
    async for position in drone.telemetry.position():
        print(f"位置: {position}")
        break

if __name__ == "__main__":
    asyncio.run(run())

如果脚本输出类似 位置: Position(latitude_deg=47.3977, longitude_deg=8.5456, absolute_altitude_m=488.0, relative_altitude_m=0.0) 的信息,说明整个链路都通了。

避坑指南: 我曾经遇到过 MAVSDK 连接超时的问题。排查了半天,发现是 PX4 的 mavlink 端口配置不对。默认情况下,PX4 仿真使用 UDP 端口 14540 和 14550。如果你改了端口号,记得在 MAVSDK 连接时指定正确的地址。

5. 知识体系总览

为了让你对整个环境搭建有个全局认识,我画了一张流程图。它展示了各个组件之间的关系和数据流向。

SITL 仿真环境架构图 Ubuntu 20.04 LTS PX4 飞控 (SITL) Gazebo 仿真环境 MAVSDK 开发库 QGroundControl Python 验证脚本 数据流:PX4 通过 MAVLink 协议与 Gazebo、QGC、MAVSDK 通信,形成闭环仿真链路

从这张图可以看得很清楚:PX4 飞控是核心,它通过 MAVLink 协议同时与 Gazebo(仿真物理环境)、QGC(地面站监控)和 MAVSDK(开发接口)通信。Ubuntu 系统则是所有组件的运行基础。

环境搭建到这里就完成了。你可能会觉得步骤有点多,但相信我——只要按照这个流程走一遍,后面 28 章的实战内容都会非常顺畅。毕竟,地基打牢了,楼才能盖得高。