2. 仿真环境搭建:Gazebo与PX4 SITL环境安装,MAVROS通信链路配置,基础仿真世界加载

说实话,搭建仿真环境这件事,看着文档挺简单,真动手的时候坑不少。我当年第一次配PX4 SITL,光MAVROS的通信就折腾了一下午——后来发现是串口权限没给对。嗯,这节课咱们就把这些坑提前填上。

2.1 环境概览:我们要搭什么?

先理清楚整个架构。说白了,就是三样东西协同工作:

  • Gazebo:负责物理仿真,模拟传感器、碰撞、重力这些真实世界的东西。
  • PX4 SITL:飞控代码在电脑上跑,不烧硬件。它接收传感器数据,输出控制指令。
  • MAVROS:桥接ROS和PX4的通信管道。没有它,ROS节点收不到飞控的状态。

我习惯把这三层画成一张图,方便理解数据怎么流动的:

仿真环境架构图 仿真环境三层架构 Gazebo 物理引擎 传感器 / 动力学 / 碰撞 PX4 SITL 飞控 姿态 / 位置 / 导航 MAVROS 通信桥 ROS ↔ MAVLink 传感器数据 控制指令 MAVLink 指令 💡 数据流向:Gazebo 模拟传感器 → PX4 计算控制 → MAVROS 转发给 ROS 节点 ROS 节点通过 MAVROS 发送指令 → PX4 执行 → Gazebo 更新物理状态

2.2 安装Gazebo与PX4 SITL

我建议你直接用Ubuntu 20.04 + ROS Noetic这套组合,社区支持最成熟。Windows和Mac也能跑,但坑多,不推荐。

2.2.1 安装Gazebo

Gazebo现在和ROS一起装更方便。直接一行命令搞定:

sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control

装完验证一下:

gazebo --version
# 应该输出类似 Gazebo multi-robot simulator, version 11.x.x
小技巧: 我第一次装完Gazebo启动特别慢,后来发现是显卡驱动没装好。如果你遇到Gazebo黑屏或卡死,先检查 glxinfo | grep "OpenGL renderer",确保用的是独立显卡而不是llvmpipe软渲染。

2.2.2 安装PX4 SITL

PX4官方推荐用源码编译。我个人习惯把代码放在 ~/PX4-Autopilot 下:

cd ~
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
make px4_sitl gazebo

第一次编译会下载依赖,大概10-20分钟。你可以去泡杯咖啡。

注意: 编译过程中如果报错 python3-empy 找不到,手动装一下:sudo apt install python3-empy。我曾经在这卡了半小时,后来发现是Ubuntu 20.04的源里这个包名变了。

编译成功后,你会看到终端里飞控在等待连接。这时候Gazebo也会自动启动,加载一个空的仿真世界。

2.3 配置MAVROS通信链路

MAVROS是ROS和PX4之间的翻译官。没有它,你的ROS节点就收不到飞控的IMU数据、GPS位置这些信息。

2.3.1 安装MAVROS

sudo apt install ros-noetic-mavros ros-noetic-mavros-extras
# 安装地理信息数据(用于GPS转换)
sudo /opt/ros/noetic/lib/mavros/install_geographiclib_datasets.sh

这个地理信息数据包大概200MB,下载时间取决于你的网速。我建议提前装好,别等到调试时才发现缺它。

2.3.2 启动MAVROS节点

SITL模式下,PX4默认在UDP端口14540上发送MAVLink数据。MAVROS需要连到这个端口:

roslaunch mavros px4.launch fcu_url:=udp://:14540@127.0.0.1:14557

解释一下这个URL:

  • udp://:14540:MAVROS监听本机的14540端口
  • @127.0.0.1:14557:PX4 SITL在本地14557端口发送数据

启动后,用 rostopic echo /mavros/state 看看有没有数据。如果看到 connected: True,恭喜你,通信链路通了。

常见问题: 如果一直显示 connected: False,检查一下PX4 SITL是否已经启动。我遇到过好几次,先启动了MAVROS,但忘了开SITL,结果干等半天。

2.4 加载基础仿真世界

Gazebo默认启动的是空世界,只有一块平地。但咱们做飞控调试,至少需要一些参照物。PX4自带了好几个仿真世界,我常用的有:

世界名称 特点 适用场景
empty.world 只有地面,无任何障碍物 基础姿态控制测试
warehouse.world 室内仓库场景,有货架和箱子 室内避障、视觉SLAM
baylands.world 户外草地场景,有树木和建筑 GPS导航、航线规划

启动指定世界的方法很简单:

make px4_sitl gazebo_<world_name>
# 例如加载仓库世界:
make px4_sitl gazebo_warehouse

如果你需要自定义世界,可以在 ~/PX4-Autopilot/Tools/sitl_gazebo/worlds 目录下找到这些.world文件。我有时候会复制一份,改改里面的模型位置,模拟特定的测试场景。

我的习惯: 每次开始新的参数调试前,我都会先加载一个带参照物的世界。空世界虽然启动快,但飞控飘了你都看不出来。仓库世界或者baylands世界有建筑和树木,视觉上更容易判断飞行器的位置变化。

2.5 验证整个链路

环境搭好了,咱们跑一个完整的测试,确保所有组件都能协同工作:

  1. 打开终端1,启动PX4 SITL + Gazebo:cd ~/PX4-Autopilot && make px4_sitl gazebo
  2. 打开终端2,启动MAVROS:roslaunch mavros px4.launch fcu_url:=udp://:14540@127.0.0.1:14557
  3. 打开终端3,查看飞控状态:rostopic echo /mavros/state

如果一切正常,你会看到类似这样的输出:

---
header: 
  seq: 123
  stamp: 
    secs: 1623456789
    nsecs: 123456789
  frame_id: ''
connected: True
armed: False
guided: False
manual_input: True
mode: "MANUAL"
system_status: 3

connected: True 说明MAVROS和PX4握手成功。mode: "MANUAL" 表示飞控处于手动模式,还没解锁。

避坑指南: 我曾经在验证链路时,发现 /mavros/state 能收到数据,但 /mavros/local_position/pose 一直是空。查了半天,原来是Gazebo的模型没有正确加载。重启Gazebo后问题解决。所以,如果某个话题没数据,先看看Gazebo里的飞机模型有没有出现。

嗯,到这里,你的仿真环境就搭好了。Gazebo跑着物理引擎,PX4 SITL在算控制律,MAVROS在中间传数据。接下来,你就可以在这个环境里放心地调参数了——不用担心炸机,随便试。