1. 仿真环境搭建:Gazebo与PX4 SITL联合仿真环境配置,MAVROS通信链路建立
做飞控算法验证,第一步就是把仿真环境跑起来。说实话,这一步卡住过不少人。我见过有同事花了两天时间,就卡在Gazebo和PX4 SITL连不上。其实只要理清几个关键点,半小时就能搞定。
1.1 整体架构:三个组件怎么配合
先看一张图,把整体关系搞清楚。你想想看,仿真环境说白了就是三件事:
- PX4 SITL:跑在电脑上的飞控固件,模拟真实的Pixhawk硬件
- Gazebo:物理引擎+3D渲染,模拟真实世界
- MAVROS:桥接ROS和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
1.3 启动流程:先开什么后开什么
启动顺序有讲究。我习惯按这个顺序来:
- 启动Gazebo + PX4 SITL(一起启动)
- 启动MAVROS(连接到PX4的MAVLink端口)
- 启动你的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地址最后一定要加@符号,表示绑定到所有网卡。
1.6 本章小结
到这步,你的仿真环境已经跑起来了。Gazebo里能看到飞机,MAVROS能收到数据,ROS节点也能发指令。说白了,你已经有了一个完整的飞控算法验证平台。