2. 仿真环境搭建:Gazebo与PX4 SITL环境安装,MAVROS通信链路配置,基础仿真世界加载
说实话,搭建仿真环境这件事,看着文档挺简单,真动手的时候坑不少。我当年第一次配PX4 SITL,光MAVROS的通信就折腾了一下午——后来发现是串口权限没给对。嗯,这节课咱们就把这些坑提前填上。
2.1 环境概览:我们要搭什么?
先理清楚整个架构。说白了,就是三样东西协同工作:
- Gazebo:负责物理仿真,模拟传感器、碰撞、重力这些真实世界的东西。
- PX4 SITL:飞控代码在电脑上跑,不烧硬件。它接收传感器数据,输出控制指令。
- MAVROS:桥接ROS和PX4的通信管道。没有它,ROS节点收不到飞控的状态。
我习惯把这三层画成一张图,方便理解数据怎么流动的:
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
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文件。我有时候会复制一份,改改里面的模型位置,模拟特定的测试场景。
2.5 验证整个链路
环境搭好了,咱们跑一个完整的测试,确保所有组件都能协同工作:
- 打开终端1,启动PX4 SITL + Gazebo:
cd ~/PX4-Autopilot && make px4_sitl gazebo - 打开终端2,启动MAVROS:
roslaunch mavros px4.launch fcu_url:=udp://:14540@127.0.0.1:14557 - 打开终端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在中间传数据。接下来,你就可以在这个环境里放心地调参数了——不用担心炸机,随便试。