保姆级教程:在Ubuntu 18.04上搞定ArduPilot + Gazebo 9多无人机仿真(附避坑指南)

张开发
2026/4/16 7:20:28 15 分钟阅读

分享文章

保姆级教程:在Ubuntu 18.04上搞定ArduPilot + Gazebo 9多无人机仿真(附避坑指南)
从零构建ArduPilot与Gazebo多机仿真环境的终极指南当我在实验室第一次尝试搭建ArduPilot多机仿真环境时整整三天都卡在MAVROS通信配置上——网上那些零散的教程要么步骤不全要么版本过时。这份指南将用最系统的方式带你避开所有我踩过的坑从单机调试到三机协同仿真完整复现无人机集群的虚拟飞行测试。1. 环境准备与基础组件安装在Ubuntu 18.04上构建仿真环境就像搭积木缺一块都会导致整体崩塌。建议先准备好至少20GB的磁盘空间ROS Melodic和Gazebo 9的组合在这个LTS版本上表现最为稳定。必备组件清单# ROS基础包 sudo apt install ros-melodic-desktop-full # MAVROS扩展 sudo apt install ros-melodic-mavros ros-melodic-mavros-extras # 地理围栏数据关键 wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh sudo bash ./install_geographiclib_datasets.sh注意Gazebo初次启动会自动下载模型建议提前通过gzserver --verbose预加载避免后续仿真时卡顿。验证组件是否正常工作的黄金标准# 终端1 - 启动ROS核心 roscore # 终端2 - 测试MAVROS连接 roslaunch mavros apm.launch fcu_url:udp://:14550看到[ INFO] [1625487361.123456]: FCU connected的日志输出说明基础通信链路已打通。2. ArduPilot仿真器的深度配置ArduCopter的SITL仿真需要特别注意子模块初始化。在克隆主仓库后务必执行git submodule update --init --recursive cd ArduCopter make configure make sitl常见编译错误解决方案错误类型解决方法验证命令missing python-futuresudo apt install python-pip pip install futurepython -c import futureProtocol https not supported更新git版本git --versionSIM_JSON missing安装jsonschemapip install jsonschema仿真启动的魔法命令其实暗藏玄机./sim_vehicle.py -v ArduCopter -f gazebo-iris --console --map-v指定飞行器类型Copter/Plane/Rover-f加载的参数文件决定了飞控初始配置--console启用调试终端--map打开Mission Planner风格的地图界面3. Gazebo世界与无人机模型的精妙调整多机仿真的核心在于模型实例化策略。原始的iris_ardupilot.world只能加载单机我们需要手动扩展为三机系统!-- 修改后的世界文件片段 -- model nameuav0 include urimodel://iris_with_standoffs/uri pose0 0 0.1 0 0 0/pose /include /model model nameuav1 include urimodel://iris_with_standoffs_1/uri pose3 0 0.1 0 0 0/pose /include /model关键修改点解析每个model必须具有唯一name属性pose标签的XYZ坐标需确保无人机初始位置不重叠模型URI要指向独立的SDF文件即使内容相同模型端口配置的数学规律!-- uav0 -- fdm_port_in9002/fdm_port_in fdm_port_out9003/fdm_port_out !-- uav1 -- fdm_port_in9012/fdm_port_in fdm_port_out9013/fdm_port_out端口号按基础值10*无人机序号的规则递增避免通信冲突。4. MAVROS的多机网络拓扑设计多机通信架构需要理解MAVLink的ID分配机制。修改后的apm.launch应该包含group nsuav0 arg namefcu_url valueudp://:14551 / arg nametgt_system value1 / /group group nsuav1 arg namefcu_url valueudp://:14561 / arg nametgt_system value2 / /group端口分配逻辑表无人机MAVROS端口SITL端口系统IDUAV01455190021UAV11456190122UAV21457190223启动顺序的奥妙先启动所有SITL实例注意-I参数# 终端1 sim_vehicle.py -I0 --sysid 1 # 终端2 sim_vehicle.py -I1 --sysid 2再启动Gazebo世界最后加载MAVROS启动文件5. 集群验证与实战调试技巧当三个无人机模型静静悬停在Gazebo中时真正的挑战才刚刚开始。用这些命令验证通信链路# 检查uav0状态 rostopic echo /uav0/mavros/state # 查看所有无人机位置 rostopic echo /gazebo/model_states -n 1常见故障排查指南模型坠地检查pose中的Z值是否0且SDF文件包含正确的惯性参数MAVROS连接超时确认端口号匹配使用netstat -tulnp查看端口占用控制无响应验证sysid是否匹配在SITL终端输入param show SYSID_THISMAV高级调试手段# 实时监控MAVLink消息 mavproxy.py --master127.0.0.1:14551 --outudp:127.0.0.1:14552 # 日志记录与回放 rosbag record -O multi_uav /uav*/mavros/*记得第一次成功让三机编队飞行时我在终端前激动地拍了桌子——那些熬夜查文档的日子突然都有了意义。现在你手上的这份指南正是我希望当时能拥有的完整手册。

更多文章