1. 仿真环境搭建:Gazebo与PX4 SITL联合仿真环境配置,MAVROS通信链路建立

做飞控算法验证,第一步就是把仿真环境跑起来。说实话,这一步卡住过不少人。我见过有同事花了两天时间,就卡在Gazebo和PX4 SITL连不上。其实只要理清几个关键点,半小时就能搞定。

1.1 整体架构:三个组件怎么配合

先看一张图,把整体关系搞清楚。你想想看,仿真环境说白了就是三件事:

  • PX4 SITL:跑在电脑上的飞控固件,模拟真实的Pixhawk硬件
  • Gazebo:物理引擎+3D渲染,模拟真实世界
  • MAVROS:桥接ROS和PX4的通信管道
PX4 SITL + Gazebo + MAVROS 联合仿真架构 PX4 SITL + Gazebo + MAVROS 联合仿真架构 PX4 SITL 飞控固件(模拟硬件) Gazebo 物理引擎 + 3D渲染 MAVROS ROS ↔ PX4 通信桥 uORB ↔ Gazebo API MAVLink 用户程序 / 算法 ROS节点 / QGC / 脚本 ROS话题 / 服务 💡 数据流方向 用户程序 → MAVROS (MAVLink) → PX4 SITL → Gazebo (物理反馈) Gazebo 将传感器数据(IMU、GPS、光流)通过 uORB 回传给 PX4

我个人习惯把这三个组件想象成:PX4是大脑,Gazebo是身体,MAVROS是神经。大脑发出指令,身体执行并反馈感觉,神经负责传递信号。

1.2 环境安装:一步都不能少

我建议用Ubuntu 20.04或22.04。别问我为什么不用Windows,做飞控仿真的,Linux是标配。

1.2.1 安装ROS

我用的是ROS Noetic(Ubuntu 20.04)或ROS2 Humble(Ubuntu 22.04)。这里以ROS1 Noetic为例:

# 设置软件源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

# 添加密钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

# 安装桌面完整版
sudo apt update
sudo apt install ros-noetic-desktop-full

# 初始化rosdep
sudo rosdep init
rosdep update

# 设置环境变量
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
我的经验:安装完成后,记得运行 roscore 测试一下。如果报错,八成是Python版本或环境变量没配好。我遇到过好几次,都是因为~/.bashrc里source路径写错了。

1.2.2 安装PX4固件

直接从GitHub克隆,然后编译。注意,编译时间取决于你的电脑配置,我当年用笔记本编译了快40分钟。

# 克隆PX4固件
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot

# 安装依赖
make px4_sitl gazebo

# 测试运行
make px4_sitl gazebo_iris

如果一切顺利,你会看到Gazebo窗口弹出来,一架Iris四旋翼停在跑道上。嗯,看到这个画面,说明环境已经搭好了一半。

1.2.3 安装MAVROS

MAVROS是ROS和PX4之间的翻译官。没有它,你的ROS程序就没办法给飞控发指令。

# 通过apt安装
sudo apt install ros-noetic-mavros ros-noetic-mavros-extras

# 安装地理信息数据集(必须)
sudo /opt/ros/noetic/lib/mavros/install_geographiclib_datasets.sh
注意:最后一步安装地理数据集,很多人会忽略。如果不装,MAVROS启动时会报错,说找不到地球模型数据。我曾经因为这个排查了半小时,结果就是少跑了一条命令。

1.3 启动流程:先开什么后开什么

启动顺序有讲究。我习惯按这个顺序来:

  1. 启动Gazebo + PX4 SITL(一起启动)
  2. 启动MAVROS(连接到PX4的MAVLink端口)
  3. 启动你的ROS节点(通过MAVROS收发数据)

1.3.1 启动Gazebo + PX4 SITL

cd ~/PX4-Autopilot
make px4_sitl gazebo_iris

这条命令会同时启动Gazebo和PX4 SITL。PX4默认监听udp://:14550端口,用于MAVLink通信。

1.3.2 启动MAVROS

新开一个终端,运行:

roslaunch mavros px4.launch fcu_url:=udp://:14550@

这里fcu_url参数指定了MAVROS连接PX4的方式。udp://:14550@表示监听本地的14550端口。说白了,就是MAVROS在门口等着,PX4的数据一出来,它就能接住。

验证连接:

启动MAVROS后,用rostopic echo /mavros/state查看飞控状态。如果看到connected: True,说明通信链路已经建立。

1.4 通信链路验证:确保数据在跑

环境搭好了,怎么知道它真的在工作?我一般做三个检查:

检查项 命令 预期结果
飞控状态 rostopic echo /mavros/state connected: True, armed: False
GPS数据 rostopic echo /mavros/global_position/global 显示经纬度、海拔
IMU数据 rostopic echo /mavros/imu/data 显示加速度、角速度

如果GPS数据一直为空,别慌。Gazebo默认的仿真世界在(0,0)点,也就是本初子午线和赤道的交汇处。你可以用rostopic hz /mavros/global_position/global看看发布频率,正常应该是10Hz左右。

1.5 避坑指南:我踩过的几个坑

做仿真环境搭建,有几个坑几乎每个人都会遇到。我列出来,你遇到了直接对照排查:

  • Gazebo黑屏或卡死:检查显卡驱动。如果是虚拟机,建议用export GAZEBO_MODEL_PATH=手动指定模型路径。
  • MAVROS连不上:检查端口号。PX4 SITL默认用14550,但如果你同时开了QGroundControl,端口会被占用。我建议把QGC的端口改成14551。
  • 编译PX4报错:多半是依赖没装全。运行make px4_sitl gazebo之前,先跑一遍./Tools/setup/ubuntu.sh。
  • ROS话题收不到数据:检查fcu_url的格式。UDP地址最后一定要加@符号,表示绑定到所有网卡。
一个小技巧:如果你不想每次都手动启动三个终端,可以写一个launch文件,把Gazebo、PX4 SITL和MAVROS一起启动。我自己的项目里就是这么干的,省事。

1.6 本章小结

到这步,你的仿真环境已经跑起来了。Gazebo里能看到飞机,MAVROS能收到数据,ROS节点也能发指令。说白了,你已经有了一个完整的飞控算法验证平台。