1. 环境准备与依赖安装
在开始PX4多机仿真之前,确保你的Ubuntu 20.04系统已经完成基础配置。我建议使用全新安装的系统,避免之前安装的软件包造成冲突。实测下来,ROS Noetic与Gazebo11的组合在纯净系统中表现最稳定。
首先更新软件源,这个步骤经常被新手忽略,但非常重要:
sudo apt update && sudo apt upgrade -y安装ROS Noetic桌面完整版时,记得加上--fix-missing参数。我在三台不同配置的电脑上测试时发现,某些依赖包会因为网络问题安装失败:
sudo apt install ros-noetic-desktop-full --fix-missing关键依赖项安装有个坑点要注意:如果你之前安装过Anaconda,必须彻底退出虚拟环境。有次我调试了3小时才发现是conda环境导致的编译错误。执行以下命令确保环境干净:
conda deactivate source /opt/ros/noetic/setup.bash多机仿真需要额外安装的依赖比单机更多,这些包容易被遗漏:
sudo apt install python3-catkin-tools python3-osrf-pycommon \ libgazebo11-dev libgeographic-dev protobuf-compiler \ libeigen3-dev libopencv-dev -y2. PX4源码编译与多机配置
2.1 PX4源码获取与分支选择
推荐使用PX4 v1.13版本,它对多机仿真的支持更完善。克隆代码时务必加上--recursive参数,我第一次没加这个参数导致子模块缺失,编译各种报错:
git clone https://github.com/PX4/PX4-Autopilot.git --recursive cd PX4-Autopilot多机仿真需要修改Tools/simulation/gazebo-classic/sitl_multiple_run.sh脚本。找到HEADLESS=1这行,改为HEADLESS=0才能显示Gazebo界面:
sed -i 's/HEADLESS=1/HEADLESS=0/g' Tools/simulation/gazebo-classic/sitl_multiple_run.sh2.2 多机启动文件配置
在PX4-Autopilot/launch目录下新建multi_uav_mavros_sitl.launch文件,这是我调试过的最佳配置:
<launch> <arg name="vehicle" default="iris"/> <arg name="world" default="empty"/> <!-- 第一台无人机 --> <group ns="uav1"> <include file="$(find px4)/launch/single_vehicle_spawn.launch"> <arg name="x" value="0"/> <arg name="y" value="0"/> <arg name="z" value="0"/> <arg name="R" value="0"/> <arg name="P" value="0"/> <arg name="Y" value="0"/> <arg name="vehicle" value="$(arg vehicle)"/> <arg name="rcS" value="$(find px4)/posix-configs/SITL/init/$(arg vehicle)/iris_1"/> <arg name="ID" value="1"/> </include> <include file="$(find mavros)/launch/px4.launch"> <arg name="fcu_url" value="udp://:14540@127.0.0.1:14580"/> <arg name="gcs_url" value=""/> <arg name="tgt_system" value="1"/> </include> </group> <!-- 第二台无人机 --> <group ns="uav2"> <include file="$(find px4)/launch/single_vehicle_spawn.launch"> <arg name="x" value="5"/> <arg name="y" value="0"/> <arg name="z" value="0"/> <arg name="R" value="0"/> <arg name="P" value="0"/> <arg name="Y" value="0"/> <arg name="vehicle" value="$(arg vehicle)"/> <arg name="rcS" value="$(find px4)/posix-configs/SITL/init/$(arg vehicle)/iris_2"/> <arg name="ID" value="2"/> </include> <include file="$(find mavros)/launch/px4.launch"> <arg name="fcu_url" value="udp://:14541@127.0.0.1:14581"/> <arg name="gcs_url" value=""/> <arg name="tgt_system" value="2"/> </include> </group> </launch>3. MAVROS通信配置技巧
3.1 多机MAVROS参数调整
每台无人机的MAVROS需要配置不同的UDP端口。这是我在实际项目中总结的端口分配方案:
| 无人机编号 | MAVROS端口 | SITL端口 | QGC端口 |
|---|---|---|---|
| UAV1 | 14540 | 14580 | 14550 |
| UAV2 | 14541 | 14581 | 14551 |
| UAV3 | 14542 | 14582 | 14552 |
在rcS启动文件中需要修改mavlink端口配置。以iris_1为例,修改PX4-Autopilot/posix-configs/SITL/init/$(arg vehicle)/iris_1文件:
mavlink start -x -u 14580 -r 4000000 -f -m onboard -o 145503.2 通信质量优化
当无人机数量超过3台时,建议调整MAVROS的通信参数。在px4.launch文件中添加这些参数能显著提升稳定性:
<arg name="conn" value="udp"/> <arg name="gcs_url" value=""/> <param name="sys_id" value="$(optenv GCS 1)"/> <param name="mavlink_diag_rate" value="1.0"/> <param name="fcu_protocol" value="v2.0"/>4. 常见问题排查指南
4.1 模型加载失败问题
如果Gazebo提示模型缺失,手动下载模型包是最快解决方案。创建一个gazebo_models目录存放自定义模型:
mkdir -p ~/.gazebo/models wget http://file.ncnynl.com/ros/gazebo_models_2016-04-18.tar.gz tar -xzf gazebo_models_2016-04-18.tar.gz -C ~/.gazebo/models/4.2 MAVROS连接超时
当出现FCU: DeviceError:serial:open: Unknown error错误时,按以下步骤排查:
- 检查端口是否被占用:
netstat -tulnp | grep 145 - 确认PX4版本与MAVROS版本兼容性
- 尝试重启mavros节点:
rosnode kill /mavros
4.3 多机位置漂移问题
在Gazebo配置文件中增加物理引擎参数可以改善这个问题。编辑~/.gazebo/gui.ini:
[physics] max_step_size=0.001 iters=50 type=ode