跳到主要内容

PX4 SITL

使用Gazebo仿真模拟器

首先,我们将使用控制台环境构建一个模拟目标。这使我们能够在进入真实硬件和 IDE 之前验证系统设置。

进入到 PX4-Autopilot 目录并使用以下命令 启动 Gazebo SITL :

make px4_sitl gz_x500

如果您安装了 Gazebo Classic 使用以下命令启动Gazebo Classic SITL :

make px4_sitl gazebo-classic

这将打开 PX4 控制台:

PX4 控制台

信息

您可能需要先启动 QGroundControl 才能继续操作,因为默认的 PX4 配置要求在起飞前建立地面控制连接。您可以 从此处下载

输入以下命令即可让无人机飞行(如上图控制台所示):

pxh> commander takeoff

飞行器将会起飞,您将在 Gazebo 模拟器 UI 中看到以下内容:

Gazebo UI 与飞行器起飞

可以通过输入让无人机降落,并且可以通过按 CTRL+C (或输入 shutdowncommander land 来停止整个模拟。

使用地面控制站进行模拟飞行更接近飞行器的实际操作。在飞行器飞行(起飞飞行模式)时,点击地图上的某个位置并启用滑块。这将重新定位飞行器。

QGroundControl 转到

SITL重要概念解释

在 PX4 使用 Gazebo 进行软件在环仿真(SITL, Software-In-The-Loop)的流程中,GZ_VERSIONpx4_gz_bridgeros_gz_bridgeSDF是四个核心概念,分别对应版本管理、跨模块通信和仿真模型定义,以下是详细解析:

一、PX4 Gazebo Version:GZ_VERSION

GZ_VERSION 是 PX4 构建系统中用于指定 Gazebo 版本的环境变量,核心作用是解决 “PX4 与 Gazebo 版本兼容性” 问题 —— 不同 PX4 版本对 Gazebo 的支持范围不同,需通过该变量明确编译目标版本,避免编译失败或功能异常。

1. 核心背景:Gazebo 的版本演进与 PX4 支持

Gazebo(现归属于 Open Robotics)经历了多个重要版本迭代,PX4 对其支持具有明确的 “版本绑定” 特性,主要分为两大系列:

  • 传统 Gazebo(Gazebo Classic):如 Gazebo 9、11(PX4 v1.13 及之前版本的主流支持版本);
  • Gazebo Fortress/Edifice(新一代 Gazebo):从 PX4 v1.14 开始逐步迁移,现成为主流(命名从 “Gazebo X” 改为 “GZ-XXX”,如 GZ-Fortress 对应版本号 12)。

2. GZ_VERSION 的取值与使用场景

GZ_VERSION 取值对应 Gazebo 版本PX4 支持版本范围核心用途
9/11Gazebo Classic 9/11PX4 v1.13 及更早传统 SITL 仿真(如多旋翼、固定翼基础场景)
fortressGZ-Fortress(v12)PX4 v1.14 ~ v1.15新一代仿真,支持更复杂物理效果
edificeGZ-Edifice(v11)PX4 v1.14+(可选)过渡版本,部分场景兼容
harmonicGZ-Harmonic(v13)PX4 v1.16+(最新主流)最新版本,优化性能与多机器人支持

3. 如何设置 GZ_VERSION

在编译 PX4 SITL 时,通过终端环境变量指定版本,示例如下:

# 1. 临时设置(当前终端生效):指定使用GZ-Fortress
export GZ_VERSION=fortress

# 2. 编译PX4 SITL(以多旋翼为例)
make px4_sitl gz_x500

二、px4_gz_bridge:PX4 与 Gazebo 的核心通信桥

px4_gz_bridge 是 PX4 官方开发的专用通信接口库,用于实现 PX4 飞控(SITL 模式)与 Gazebo 仿真器之间的 “数据双向传输”,是 SITL 仿真的 “数据中枢”。

1. 核心功能:数据交互的 “翻译官”

PX4(飞控逻辑)和 Gazebo(物理仿真)基于不同的消息协议,px4_gz_bridge 的核心作用是协议转换与数据路由,主要交互的数据类型包括:

数据方向关键数据类型用途说明
PX4 → Gazebo(控制指令)电机转速指令(Motor Command)、姿态控制指令PX4 向 Gazebo 发送 “控制信号”,驱动仿真无人机运动
Gazebo → PX4(传感器数据)IMU(惯性测量单元)、GPS、气压计、视觉里程计Gazebo 向 PX4 反馈 “仿真环境中的传感器数据”,供飞控解算位置 / 姿态

2. 技术特点:轻量、原生集成

  • 无额外依赖:直接集成在 PX4 源码的 src/modules/px4_gz_bridge/ 目录下,随 PX4 编译自动构建,无需单独安装;
  • 版本绑定px4_gz_bridge 的代码会随 GZ_VERSION 适配,确保与指定的 Gazebo 版本兼容(如针对 GZ-Fortress 的消息格式优化);
  • 可扩展:支持自定义消息类型(如添加特定传感器数据),只需在桥接代码中添加对应的协议转换逻辑。

三、ros_gz_bridge:ROS 与 Gazebo 的通信桥(间接支持 PX4)

ros_gz_bridge 是 ROS(机器人操作系统)与 Gazebo 之间的通用通信桥,并非 PX4 专属,但在 “PX4+ROS+Gazebo” 的复合场景中(如需要 ROS 节点处理感知、规划算法时),是关键的中间件。

1. 与 px4_gz_bridge 的核心区别

很多初学者会混淆两者,需明确其定位差异:

对比维度px4_gz_bridgeros_gz_bridge
通信双方PX4 飞控 ↔ GazeboROS 节点 ↔ Gazebo
协议基础PX4 自定义 UORB 消息 ↔ Gazebo 消息ROS 消息(如sensor_msgs/Imu) ↔ Gazebo 消息
归属与依赖PX4 源码内置,无 ROS 依赖Open Robotics 维护,需依赖 ROS 2(如 Humble)
PX4 场景用途基础 SITL 必用(无 ROS 时也需启动)需 ROS 功能时使用(如 RViz 可视化、ROS 规划节点)

2. PX4 场景中的典型用法

当需要用 ROS 处理数据(如用 ROS 2 节点做目标检测、路径规划)时,ros_gz_bridge 需与 px4_gz_bridge 配合工作,数据流向示例:

Gazebo(仿真传感器)→ ros_gz_bridge → ROS 2节点(处理数据)→ ROS 2→PX4(如通过MAVLink)→ PX4飞控

示例启动命令(ROS 2 Humble + GZ-Fortress):

# 启动ROS-Gazebo桥,转发IMU和GPS数据到ROS话题
ros2 run ros_gz_bridge parameter_bridge /imu@sensor_msgs/msg/Imu[gz.msgs.IMU
ros2 run ros_gz_bridge parameter_bridge /gps@sensor_msgs/msg/NavSatFix[gz.msgs.NavSatFix

四、SDF:仿真模型的 “蓝图” 文件

SDF(Simulation Description Format,仿真描述格式)是 Gazebo 用于定义仿真环境和模型的标准 XML 格式文件,在 PX4 SITL 中,无人机的外观、物理属性、传感器配置均通过 SDF 文件定义。

1. 核心作用:定义 “仿真世界”

PX4 SITL 启动时,Gazebo 会加载对应的 SDF 文件,该文件包含两类关键信息:

  • 无人机模型(Model):如多旋翼的机架尺寸、电机位置、传感器(IMU/GPS)的安装位姿、物理参数(质量、转动惯量);
  • 仿真场景(World):如地面、天空、风力、光照等环境参数(部分场景还包含障碍物、其他无人机)。

2. PX4 中 SDF 文件的位置与示例

PX4 源码中已预置常用无人机的 SDF 文件,路径为:

PX4-Autopilot/Tools/simulation/gz/models/
# 示例:X500多旋翼模型
PX4-Autopilot/Tools/simulation/gz/models/x500/x500.sdf

SDF 文件片段(定义 IMU 传感器):

<sensor name="imu" type="imu">
<pose>0 0 0.05 0 0 0</pose> <!-- IMU在机架上的安装位姿(x,y,z,滚转,俯仰,偏航) -->
<topic>/imu</topic> <!-- 传感器数据发布到Gazebo的话题 -->
<imu>
<angular_velocity>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>0.001 0.001 0.001</stddev> <!-- 角速度噪声参数 -->
</noise>
</angular_velocity>
<!-- 加速度计、陀螺仪等参数省略 -->
</imu>
</sensor>

3. 关键特性:可定制与复用

  • 参数修改:可直接编辑 SDF 文件调整仿真参数(如增加传感器噪声、修改机架质量),无需修改 PX4 核心代码;
  • 模型复用:支持导入第三方 SDF 模型(如自定义无人机、场景),只需将模型文件放入 Gazebo 的模型搜索路径(或在 PX4 启动脚本中指定路径)。

总结:四者的协同关系

在 PX4 Gazebo SITL 流程中,四个概念的协同逻辑可概括为:

  1. 通过 GZ_VERSION 指定目标 Gazebo 版本,确保编译兼容性;
  2. Gazebo 加载 SDF 文件,构建包含无人机和环境的仿真世界;
  3. px4_gz_bridge 启动,实现 PX4 飞控与 Gazebo 的核心数据交互(控制指令 + 传感器数据);
  4. 若需 ROS 功能,ros_gz_bridge 启动,将 Gazebo 数据转发到 ROS 话题(或接收 ROS 指令),形成 “PX4-ROS-Gazebo” 闭环。

理解这四者的作用,是排查 PX4 SITL 编译错误、定制仿真场景的基础(如解决 “传感器数据无反馈”“Gazebo 启动失败” 等常见问题)。

常见问题

1. make px4_sitl gz_x500出现Preflight Fail 预飞检查失败,传感器数据丢失

解决方法1:卸载重装gz版本,比如gzgarden gzharmonic等这些版本 https://github.com/PX4/PX4-Autopilot/issues/24033 https://discuss.px4.io/t/px4-simulation-in-gazebo-fortress-support/45249 解决方法2:由于在v1.15版本将Tools的gz替换为v1.16版本的gz文件内容,替换回原版本对应的没有问题 解决方法3:使用其他模拟机身及环境模型,比如 make px4_sitl gz_x500 解决方法4:检查sdf文件是否包含传感器插件,如果没有添加试试 Missing sensors for a Gazebo simulation

2. ros_gz_bridge 无法工作,无法使用 rviz2 获取 PX4 x500_mono_cam 图像主题

https://discuss.px4.io/t/ros-gz-bridge-not-working-unable-to-use-rviz2-to-fetch-px4-x500-mono-cam-image-topic/44447

3. 时间戳同步对齐问题

https://blog.csdn.net/2401_83038233/article/details/149101727

ERROR [vehicle_imu] 0 - gyro 1310988 timestamp error timestamp_sample: 1110864000, previous timestamp_sampl
ERROR [vehicle_imu] 0 - accel 1310988 timestamp error timestamp_sample: 1110864000, previous timestamp_samp
NodeShared::Publish()
Error: Interrupted system call