1、PX4仿真环境搭建:Gazebo与PX4的安装配置、MAVSDK环境准备、仿真网络拓扑理解
各位同学,欢迎来到《PX4仿真测试与航线验证》的第一章。
做飞控开发,最怕什么?怕炸机。我刚开始接触PX4那会儿,有一次在真机上测试一个新写的姿态控制算法,结果飞机刚离地一米就翻了。桨叶碎了三副,电池摔变形了,还好没伤到人。从那以后,我养成了一个习惯——任何代码改动,必须先过仿真。
这一章,我们就来把仿真环境搭好。这是后续所有测试和验证的基础。说白了,环境搭不好,后面全是白费功夫。
1.1 整体架构:仿真系统里都有谁?
在动手安装之前,我们先搞清楚整个仿真系统是怎么工作的。你想想看,一套完整的PX4仿真环境,其实就是在你的电脑上模拟出一架无人机,以及它周围的物理世界。
核心角色有三个:
- PX4 Autopilot(飞控固件):无人机的“大脑”,负责控制逻辑。
- Gazebo(物理仿真器):模拟“现实世界”,包括重力、空气阻力、碰撞、传感器数据等。
- MAVSDK(通信桥梁):你的地面站程序或测试脚本,通过它与PX4通信,发送指令、接收状态。
它们之间的数据流向,我画了一张图,你看完就明白了。
我的经验: 很多新手搞不清端口号。记住一个口诀:“14540 是给地面站的,14560 是给仿真器的”。调试的时候,用 mavlink status 命令看一眼,就知道数据通没通。
1.2 安装PX4与Gazebo
安装这块,我建议你直接用PX4官方推荐的 ubuntu.sh 一键脚本。别自己一个个去装,容易漏依赖,而且版本还可能对不上。
我个人习惯在 ~/src 目录下放所有代码。你可以这样操作:
# 1. 创建并进入工作目录
mkdir -p ~/src
cd ~/src
# 2. 克隆 PX4 固件代码(建议用 v1.14 稳定版)
git clone https://github.com/PX4/PX4-Autopilot.git --branch v1.14.3
cd PX4-Autopilot
# 3. 运行自动安装脚本(包含 Gazebo、MAVSDK 等所有依赖)
bash ./Tools/setup/ubuntu.sh
# 4. 编译并启动仿真(首次编译较慢,约 20-30 分钟)
make px4_sitl gazebo-classic
脚本跑完后,你会看到 Gazebo 窗口弹出来,里面停着一架 Iris 四旋翼。同时终端里会打印 PX4 的启动日志。看到 INFO [commander] Ready for takeoff! 这行字,就说明环境跑起来了。
注意: 如果你用的是 Ubuntu 22.04,Gazebo Classic 的安装可能会遇到 gazebo: command not found 的问题。我曾经在这上面卡了半小时。解决办法是手动安装 Gazebo Garden 或 Harmonic,然后配置 GZ_VERSION 环境变量。具体步骤在 PX4 官方文档的 Gazebo Installation 章节有写。
1.3 安装与配置MAVSDK
MAVSDK 是连接你写的测试代码和 PX4 的桥梁。我一般用 C++ 版本,因为性能好,而且和 PX4 的集成度最高。
安装方式有两种,我推荐用源码编译,这样能确保拿到最新的 API:
# 1. 安装依赖
sudo apt-get install cmake build-essential libcurl4-openssl-dev \
libtinyxml2-dev libgtest-dev
# 2. 克隆 MAVSDK 源码
cd ~/src
git clone https://github.com/mavlink/MAVSDK.git
cd MAVSDK
# 3. 编译并安装
cmake -B build/default -DCMAKE_BUILD_TYPE=Release
cmake --build build/default -j4
sudo cmake --install build/default
安装完成后,你可以写一个简单的测试程序,验证 MAVSDK 能否连上 PX4 仿真:
#include <iostream>
#include <mavsdk/mavsdk.h>
#include <mavsdk/plugins/telemetry/telemetry.h>
using namespace mavsdk;
int main() {
Mavsdk mavsdk;
ConnectionResult conn_result = mavsdk.add_any_connection("udp://:14540");
if (conn_result != ConnectionResult::Success) {
std::cerr << "连接失败!" << std::endl;
return 1;
}
auto system = mavsdk.first_autopilot(10.0);
if (!system) {
std::cerr << "未发现飞控!" << std::endl;
return 1;
}
auto telemetry = Telemetry{system.value()};
telemetry.subscribe_position([](Telemetry::Position position) {
std::cout << "纬度: " << position.latitude_deg << ", "
<< "经度: " << position.longitude_deg << ", "
<< "高度: " << position.relative_altitude_m << "m" << std::endl;
});
std::this_thread::sleep_for(std::chrono::seconds(10));
return 0;
}
编译运行后,如果终端里能持续打印出经纬度和高度,就说明 MAVSDK 和 PX4 仿真已经成功握手了。
避坑指南: 我曾经遇到过 MAVSDK 连接后收不到数据的情况。排查了半天,发现是防火墙把 UDP 端口拦了。如果你也遇到类似问题,先试试 sudo ufw disable 关掉防火墙,或者放行 14540 和 14560 端口。
1.4 验证环境:跑一个简单的起飞降落
环境搭好了,我们来验证一下。用 PX4 自带的命令行工具,手动控制飞机起飞和降落。这是最直观的验证方式。
打开一个新终端,进入 PX4 目录,启动仿真:
cd ~/src/PX4-Autopilot
make px4_sitl gazebo-classic
等 Gazebo 窗口出现后,再开一个终端,输入以下命令:
# 连接 PX4 的 shell
px4 list
# 你会看到类似这样的输出:
# instance 0: /dev/pts/4 (px4)
# 记下这个 pts 编号,比如 /dev/pts/4
# 连接进去
sudo screen /dev/pts/4
# 在 PX4 shell 中输入:
commander takeoff
# 等待几秒,飞机应该会起飞到 2.5 米高度悬停
# 然后降落:
commander land
如果你看到 Gazebo 里的飞机稳稳起飞,然后缓缓降落,恭喜你——你的仿真环境已经可以正常工作了。
验证清单:
| 检查项 | 预期结果 | 常见问题 |
|---|---|---|
| Gazebo 窗口弹出 | 显示 Iris 无人机模型 | 显卡驱动问题,尝试 export SVGA_VGPU10=0 |
终端打印 Ready for takeoff |
PX4 初始化完成 | 检查是否有端口冲突,重启电脑 |
| MAVSDK 测试程序打印位置数据 | 经纬度、高度持续更新 | 检查 UDP 端口和防火墙 |
commander takeoff 成功 |
飞机起飞并悬停 | 检查仿真时间是否正常,param set SIM_SPEED_FACTOR 1 |
1.5 本章小结
这一章我们做了三件事:
- 搞清楚了 PX4、Gazebo、MAVSDK 三者之间的通信关系。
- 把 PX4 和 Gazebo 的仿真环境跑起来了。
- 安装了 MAVSDK,并验证了数据链路是通的。